您好!
使用 CPU 通过 BSL 成功更新 G2553程序、但信息 存储器可能会被擦除或更改。 我没有找到原因、您能给出一些建议。
我尝试了三种方法:
1.批量擦除->发送正确的密码->发送 bin 文件数据
2.send 右密码->擦除段->发送 bin 文件数据
2.发送错误的密码->发送正确的密码->发送 bin 文件数据
谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
使用 CPU 通过 BSL 成功更新 G2553程序、但信息 存储器可能会被擦除或更改。 我没有找到原因、您能给出一些建议。
我尝试了三种方法:
1.批量擦除->发送正确的密码->发送 bin 文件数据
2.send 右密码->擦除段->发送 bin 文件数据
2.发送错误的密码->发送正确的密码->发送 bin 文件数据
谢谢!
我没有查看过您的代码、只需报告、使用 TI 的 BSLDEMO2.exe 通过 BSL 刷写固件、我发现在刷写到 main 时信息存储器不受影响。 您可能希望尝试该程序、如果它运行正常、则问题出在代码中的某个位置。 BSLDEMO2还有一个开关、用于读取 INFOA 的内容、保存它、并在一个 MASSERASE 之后恢复它。 这将保护 INFOA、但不会保护其他三个信息段(但您的代码可以提供)。 最后、在这种情况下可能会有所帮助、请记住、您可以通过在0xFFDE 处使用空字来防止 BSL 对错误的密码执行 MASSERASE。
编辑: 我应该添加、根据您用来与 G2553通信的内容、BSLDEMO2可能具有错误极性的 DTR。 我发现这是使用 CP2102 USB 转串行适配器时的情况。 所以我制作了一个新版本的 BSLDEMO2、它有一个用于反转 DTR 的开关。 您可以在此处找到:
[引用用户="jianyang LIN"]
尊敬的乔治:
这是一个很好的建议。 第一可能还可以 您能否支持示例代码? 非常感谢!
我不知道如何处理它:
在该位置、将有一个四字节分支指令连接到实际的引导代码位置。
嗯、我只在汇编器中对这些器件进行编程、所以我不确定我的示例在 C 语言中有多有用。 但下面是为 NWK 汇编器编写的示例、其格式与 CCS 略有不同:
;Naken 汇编器
MSP430
;所选中断矢量的定义- 0xFFE0-0xFFFF
;确保提供所有将要使用的设备
#define vectors_begin 0xFFE0
#define Port1_vector 0xFFE4
#define port2_vector 0xFFE6
#define USI_Vector 0xFFE8
#define ADC10_Vector 0xFFEA
#define TIMERA1_Vector 0xFFF0
#define TIMERA0_Vector 0xFFF2
#define WDT_Vector 0xFFF4
#define RESET_Vector 0xFFFE
;BSL 安全密钥-防止对错误密码进行批量擦除
org 0xFFDE
dw 0
;中断矢量表和密码
.org vectors_begin
.dw 0xFFFF、0xFFFF ;不使用,而是密码的一部分
org Port1_vector
.dw Port1_Table ;跳转表条目的位置
org port2_vector
.dw 端口2_Table
org USI_vector
.dw USI_Table
.org ADC10_Vector
.dw ADC10_Table
.dw 0xFFFF、0xFFFF ;未使用
org TIMERA1_vector
.dw TimerA1_Table
.org TIMERA0_vector
.dw TimerA0_Table
org WDT_Vector
.dw WDT_Table
dw 0xFFFF、0xFFFF、0xFFFF、0xFFFF
.org reset_vector
.dw Reset_Table
;中间跳转表
org 0xFFA0 ;可以是任意位置,但所有版本的位置都相同
Port1_Table: BR #Port1_routine
PORT2_Table: BR #PORT2_routine
USI_Table: BR #USI_routine
ADC10_Table: BR #ADC10_routine
TimerA1_Table: BR #TimerA1_routine
TimerA0_Table: BR #TimerA0_routine
WDT_Table: BR #WDT_routine
RESET_Table: BR #Reset_routine
;实际例程
org 0xC000 ;可以是任意位置,在不同版本之间可能有所不同
Port1_routine:
NOP ;等等
RETI
PORT2_routine:
NOP ;等等
RETI
USI_routine:
NOP ;等等
RETI
ADC10_例程:
NOP ;等等
RETI
TimerA1_routine:
NOP ;等等
RETI
TimerA0_routine:
NOP ;等等
RETI
WDT_routine:
NOP ;等等
RETI
RESET_routine:
NOP ;等等
上面显示的内容将生成下面显示的密码文件。 只要中间跳转表的位置和结构不变、它就不会改变。 但是跳转表中跳转到的例程可能会将位置从版本更改为版本。
password.txt:
@FFE0
FF FF FF A0 FF A4 FF A8 FF AC FF FF FF FF FF FF FF FF FF FF FF FF FF FF
B0 FF B4 FF B8 FF FF FF FF FF FF FF FF FF FF FF FF FF BC FF
问
编辑: 下面是显示每个位置的示例代码的反汇编:
ADDR 操作码指令
---- ---- --------------
0xc000:0x4303 nop -- mov.w #0、cg
0xc002:0x1300 ti
0xc004:0x4303 nop -- mov.w #0、cg
0xc006:0x1300 reti
0xc008:0x4303 nop -- mov.w #0、cg
0xc00a:0x1300 ti
0xc00c:0x4303 nop -- mov.w #0、cg
0xc00e:0x1300 ti
0xc010:0x4303 nop -- mov.w #0、cg
0xc012:0x1300 reti
0xc014:0x4303 nop -- mov.w #0、cg
0xc016:0x1300 reti
0xc018:0x4303 nop -- mov.w #0、cg
0xc01a:0x1300 ti
0xc01c:0x4303 nop -- mov.w #0、cg
0xce0:0x4030 mov.w #0xc000、PC {分支指令}
0xce2:0xc000
0xc4:0x4030 mov.w #0xc004、PC
0xc004
0x8A:0x4030 mov.w #0xc008、PC
0xcea:0xc008
0xCac:0x4030 mov.w #0xc00c、PC
0xc00c
0xcb0:0x4030 mov.w #0xc010、PC
0xcb2:0xc010
0xcb4:0x4030 mov.w #0xc014、PC
0xc0b6:0xc014
0xcb8:0x4030 mov.w #0xc018、PC
0xFFA:0xc018
0xc0x4030 mov.w #0xc01c、PC
0xc01c
向量:
0xffffff0:0xFFFF Vector 0{}
0x0xFFFF 向量 1{}
0xffffff4:0xaa0 Vector 2{}
0xce6:0xca4 向量 3{}
0xE8:0xA8 向量 4{}
0xcea:0xffffff5引导程序 {}
0xffffff: 0xFFFF Vector 6 {}
0xFFFF 向量 7{}
0xFF0:0xcb0 向量 8{}
0xFF2:0xcb4 向量 9{}
0xFF4:0xcb8 向量10{}
0xFFFF 向量11{}
0xFFFF 向量12{}
0xFFa:0xFFFF 向量13{}
0xFFFF 矢量14{}
0xFFFE:0xcbc Vector 15{Reset/Watchdog/Flash}
所有、
有关 MSP430 BSL 如何处理批量擦除和信息存储器的说明、请参阅以下内容。
当 BSL 执行批量擦除时、它将尝试擦除所有闪存存储器、包括信息存储器。 在 BSL 内没有针对 LOCKA 位的检查。 但是、当 LOCKA 位置位时、它将保护信息 A 段不被擦除。 如果 LOCKA 位被置位、BSL 将不能擦除信息 A、但是剩余的信息存储器(段 B-D)将被擦除。
另一个要点是、当 BSL 从复位或"冷启动"情况启动时、它将自动清除 LOCKA 位、从而使 INDOA 保持开路以进行擦除。 如果 BSL 从通过进入 BSL 的软件进入的"热启动"情况中启动、LOCKA 位将保持置位、因为 BSL 不会清除 INFO A。换句话说、除了 SW 进入之外的任何进入 BSL 的进入将允许擦除所有信息存储器。
[引用用户="Jace H"]
当 BSL 执行批量擦除时、它将尝试擦除所有闪存存储器、包括信息存储器。 在 BSL 内没有针对 LOCKA 位的检查。 但是、当 LOCKA 位置位时、它将保护信息 A 段不被擦除。 如果 LOCKA 位被置位、BSL 将不能擦除信息 A、但是剩余的信息存储器(段 B-D)将被擦除。
[/报价]
Jace、如果您能重新检查此信息、我将不胜感激。 关于 SLAU320中的 F2xx 器件、我发现了以下有关 JTAG 闪存的内容:
注意:MSP430F2xx 器件有四个信息内存段、每个内存段64字节。 部分
INFOA (更多信息请见《MSP430F2xx 系列用户指南》)是一个可锁定的闪存
信息段并包含 MSP430F2xx 时钟的重要校准数据
系统(DCO)是在生产测试中编程的给定器件所独有的。 剩余的部分
三个信息内存段(INFOB、INFOC 和 INFOD)不能被 A 擦除
只要 INFOA 被锁定、批量擦除操作。 可以是 INFOB、INFOC 和 INFOD
被逐段擦除、与 INFOA 的锁定设置无关。 解锁 INOFA
允许执行批量擦除操作。
它清楚地表明,如果 LOCKA 被置位,*批量*擦除将不会擦除任何信息内存,但是 B、C 和 D *可*逐段擦除。
BSL 上的 SLAU319不太清楚:
注意:BSL 版本 V2.01和更高版本支持 LOCKA 位保护的自动清零
信息闪存存储器。 当从复位条件进入 BSL 时、LOCKA 为
由 BSL 清除以批量擦除闪存、包括信息存储器。 BSL 是时的状态
在应用程序中输入、用户软件应确保 LOCKA 在之前被写入为1
启动 BSL。 否则、在 BSL 批量擦除期间不会擦除信息闪存。
问题是 BSL 中的实际情况、特别是 G2553。
非常感谢。
编辑: 好的、我找到了我认为是关于这方面的最终信息。 这是《圣经》里的——SLAU144。 关于段 A 的第7.2.1节明确地说、设置 LOCKA 可保护所有信息存储器、而不仅仅是 INFOA、不受批量擦除的影响。 这在表7-1擦除模式和第7.4.3节 FCTL3 (在 LOCKA 条目中)中得到了确认。
[引用 user="Jace H"]George、
我相信您在这里是正确的。 当我特别查看 BSL 代码时、我的一侧出现了一些困惑。 用户指南中对此问题的说明就是答案。
[/报价]
实际上、如果 BSL 代码不仅执行内置批量擦除命令、而且在 LOCKA 被置位时单独擦除 B、C 和 D 段、那么 LOCKA 实际上只会保护 INFOA。 我无法访问 G2553 BSL 源、因此我将依赖您来查看它是否执行该操作。 我可以使用 BSLDEMO 进行实际测试、但现在没有设置我的 BSL 试验台。 请告诉我您是否需要我这样做。
[引用 user="Jace H"]George、
如果您有时间并且正在提供、这应该是一个简单的测试。 由于年末的活动、我将无法自己进行测试、直到假期结束。
您会认为这应该很容易从文档中确定、但是通过 LOCKA 位的描述方式与 BSL 的响应方式、我对此有疑问。
不过、对于测试、您需要确保其 SW 条目、因为任何其他条目都将清除 LOCKA 位。
我有 非常短的特殊引导代码、这些代码位于校准项目之间的 INFOA 内、复位矢量指向它。 如果它检测到 Rx 引脚连接到 USB 适配器、它将跳转到 BSL。 我认为最好的跳转到位置是0x0C0C、它就在切换 LOCKA 的指令之后。 假设它以 LOCKA 套件启动、它将保持这种状态。 我将在 INFOB、C 和 D 中添加一些内容。 然后我想一个来自 BSLDEMO 的单个批量擦除指令、然后返回并通过我的 Launchpad 在信息存储器中读取、以查看是否已擦除。 是这样吗? 我应该能够在本周的某个时间完成这项工作。
您好、Georg、您好、Jace、
首先:非常感谢您对本主题的全面考虑。 由于 G2553是使用旧版本 BSL 编程工具的旧器件、我需要一段时间准备好测试。
下面是我的步骤:
我构建了一个闪烁应用、该应用程序也随机写入信息存储器 A - D、闪烁10次后、我跳转到 BSL 应用程序。 在 SLAU319中、写入冷启动为0C00h、热启动为0C02h。 冷启动将解锁 LOCKA、并导致信息存储器被擦除。 如果您在 CCS 中查看存储器浏览器、则0C02h 指向0C1Eh。 我选择这个0C1Eh 作为闪烁应用的跳转地址。
2.我使用了 BSL Rocket (或 CP2102也应起作用)、并使用 hTerm 提供命令和密码。 我连接 Vcc、GND、TX 和 RX。 未应用 BSL 进入序列。
3.我发送到 BSL 的命令:0x80、然后 BSL 回复0x90;然后发送默认密码、BSL 回复0x90、然后我发送批量擦除、BSL 回复0x90。
4.我断开了 BSL 连接、放置 JTAG、启动调试会话以读取信息存储器、不会擦除任何内容。
这意味着,我从实验中得到的是,设置 LOCKA,也会跳过擦除信息存储器 B、C 和 D。让我知道这个结果是否与你以后得到的结果相同:)
我同意 Fatmawati_Santosa 的结果。 我将 软件 BSL 条目设置为跳转至0x0C0C、即在 BSL 指令之后立即切换 INFOA。 由于 INFOA 在加电/复位时被设定、跳过切换将保持这种状态、但在其他情况下进行冷启动。 使用该条目方法,批量擦除将使*所有*信息内存受到保护,并且仅擦除主内存。 在 PC 端、我使用了 BSLDEMO2。
我确实遇到了 BSL 行为不正常的问题、但发现 BSL 切换指令不仅会切换 LOCKA、还会清除 FCTL3的其余位、其中两个位在引导时设置。 当我插入一条指令在 跳转到 BSL 之前清除 FCTL3的其他位时、一切都正常。
我认为这解决了这个问题。 我不确定这种行为有多有用、但至少现在已经很清楚了。
您好、Georg、
非常感谢您对检查此行为的支持、我非常感谢!
我将在用户指南中添加此信息作为注释。 由于它是 ROM BSL、我们无法更改冷启动和热启动的行为、因此我们得出的结论是、通过冷启动、批量擦除所有器件存储器、而热启动仅擦除主存储器。
对于第二种行为、调用 BSL 的应用程序中经常会出现这种情况。 建议在跳转到 BSL 之前清除应用中使用的寄存器。 我们将此信息放在 SLAU319的第3.8.1章下。