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.

[参考译文] MSP430G2553:当由 BSL 更新程序时、信息存储器可能被擦除或更改

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/647227/msp430g2553-information-memory-maybe-erased-or-changed-when-update-program-by-bsl

器件型号:MSP430G2553

您好!

使用 CPU 通过 BSL 成功更新 G2553程序、但信息 存储器可能会被擦除或更改。  我没有找到原因、您能给出一些建议。

我尝试了三种方法:

1.批量擦除->发送正确的密码->发送 bin 文件数据

2.send 右密码->擦除段->发送 bin 文件数据

2.发送错误的密码->发送正确的密码->发送 bin 文件数据

谢谢!

e2e.ti.com/.../mcu_2D00_upgrade.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    当 MSp430G2553使用 BSL 时、批量擦除也会擦除信息存储器。 有一个用于擦除主存储器或信息的命令、您可以使用该命令只擦除主存储器。 此外,如果提供了一个将内容放入 Info Mem 的 bin,则可以将其覆盖。 发送错误的密码也会导致批量擦除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jace:

    感谢您的支持。  

    我使用擦除段从0xC000擦除到0xFFFF,并将 bin 文件 从0xC000写入0xFFFF、 但信息存储器也被擦除。

    编写 bin 文件后仍需要执行的操作

    此外、如何在 BSL 中将 LOCKA 设置为1。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您需要在 BSL 之外设置信息存储区 A 的锁定位。 在 BSL 模式下、您没有对寄存器的访问权限。 请注意、这仅锁定信息存储器的 A 部分。 B-D 部分没有锁。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有查看过您的代码、只需报告、使用 TI 的 BSLDEMO2.exe 通过 BSL 刷写固件、我发现在刷写到 main 时信息存储器不受影响。  您可能希望尝试该程序、如果它运行正常、则问题出在代码中的某个位置。  BSLDEMO2还有一个开关、用于读取 INFOA 的内容、保存它、并在一个 MASSERASE 之后恢复它。  这将保护 INFOA、但不会保护其他三个信息段(但您的代码可以提供)。  最后、在这种情况下可能会有所帮助、请记住、您可以通过在0xFFDE 处使用空字来防止 BSL 对错误的密码执行 MASSERASE。

    编辑: 我应该添加、根据您用来与 G2553通信的内容、BSLDEMO2可能具有错误极性的 DTR。  我发现这是使用 CP2102 USB 转串行适配器时的情况。  所以我制作了一个新版本的 BSLDEMO2、它有一个用于反转 DTR 的开关。  您可以在此处找到:

    https://github.com/gbhug5a/MSP430-BSL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jace 和 George:

    非常感谢。

    今天、确认密码错误导致的信息已被删除。 因为每次编译的文件的0xFFE0至0xFFFF 数据不相同。

    因此、TI 能否支持具有批量擦除功能的 BSL、请勿擦除信息。 客户需要频繁升级 CPU,密码管理错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    BSL 能否将 0x0x0xFFFF 处的检查密码地址更改为0xFFFF? 因此、我们可以在指定地址设置固定密码

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在上面提供的指向我的 Github 存储库的有关此主题的链接中有一个 PDF 文件。 它描述了处理密码问题的不同方法。 但基本上、我知道三种方法来处理这个问题:

    1.关于您对 Jace 的问题、否、密码始终从0xFFE0开始。 但是、您可以让0xFFE0 - 0xFFFF 处的所有矢量始终指向您选择的某个固定位置的中间跳转表。 例如、0xFFFE 处的加电/复位矢量可以始终指向、例如0xFC00。 在该位置、将有一个四字节分支指令连接到实际的引导代码位置。 该指令可能会从版本更改为版本、但跳转表的位置以及密码对于所有版本都是相同的。 这意味着您只有一个密码文件、它适用于所有版本。

    2.正如我在上面提到的、你可以在地址0xFFDE 处对一个空字进行编程。 这将防止 BSL 在密码错误时执行批量擦除。 但这并不能真正帮助您、因为您仍然需要正确的密码才能执行任何操作。

    3. TI 人员需要检查一下这个问题、但我相信、如果设置了 LOCKA、那么批量擦除将只擦除主存储器。 它不仅会备用 INFOA、而且会备用所有信息存储器。 如果是这种情况、那么您可以在 LOCKA 关闭后的某个点进入 BSL。 这将位于0x0C0C。 我的 PDF 描述了一些可以隐藏在 INFOA 中的非常短的代码、该代码可用于在引导时进入该地址的 BSL、而不是在/Reset 和 Test 上进入特殊的信号模式。 但这需要提前安装、这可能不切实际。

    我认为#1中的解决方案就是您想要做的事情、而#2则是附加保险。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的乔治:
    这是一个很好的建议。 第一可能还可以 您能否支持示例代码? 非常感谢!

    我不知道如何处理它:

    在该位置、将有一个四字节分支指令连接到实际的引导代码位置。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="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 条目中)中得到了确认。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    乔治

    我相信您在这里是正确的。 当我特别查看 BSL 代码时、我的一侧出现了一些困惑。 用户指南中对此问题的说明就是答案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Jace H"]George、

    我相信您在这里是正确的。 当我特别查看 BSL 代码时、我的一侧出现了一些困惑。 用户指南中对此问题的说明就是答案。

    [/报价]

    实际上、如果 BSL 代码不仅执行内置批量擦除命令、而且在 LOCKA 被置位时单独擦除 B、C 和 D 段、那么 LOCKA 实际上只会保护 INFOA。  我无法访问 G2553 BSL 源、因此我将依赖您来查看它是否执行该操作。  我可以使用 BSLDEMO 进行实际测试、但现在没有设置我的 BSL 试验台。  请告诉我您是否需要我这样做。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    乔治

    如果您有时间并且正在提供、这应该是一个简单的测试。 由于年末的活动、我将无法自己进行测试、直到假期结束。

    您会认为这应该很容易从文档中确定、但是通过 LOCKA 位的描述方式与 BSL 的响应方式、我对此有疑问。

    不过、对于测试、您需要确保其 SW 条目、因为任何其他条目都将清除 LOCKA 位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Jace H"]George、

    如果您有时间并且正在提供、这应该是一个简单的测试。 由于年末的活动、我将无法自己进行测试、直到假期结束。

    您会认为这应该很容易从文档中确定、但是通过 LOCKA 位的描述方式与 BSL 的响应方式、我对此有疑问。

    不过、对于测试、您需要确保其 SW 条目、因为任何其他条目都将清除 LOCKA 位。

    [/报价]

    我有 非常短的特殊引导代码、这些代码位于校准项目之间的 INFOA 内、复位矢量指向它。  如果它检测到 Rx 引脚连接到 USB 适配器、它将跳转到 BSL。  我认为最好的跳转到位置是0x0C0C、它就在切换 LOCKA 的指令之后。  假设它以 LOCKA 套件启动、它将保持这种状态。  我将在 INFOB、C 和 D 中添加一些内容。 然后我想一个来自 BSLDEMO 的单个批量擦除指令、然后返回并通过我的 Launchpad 在信息存储器中读取、以查看是否已擦除。  是这样吗?  我应该能够在本周的某个时间完成这项工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    乔治

    它听起来可以正常工作。 通过执行以下指令、您也可以通过 SW 输入 BSL 空间:

    _disable_interrupt ();
    ((void (*)()) 0x1000)(); 

    这会将地址0x1000加载到程序计数器。 地址0x1000包含一个跳转指令、用于指示 BSL 的起始位置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、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章下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SLAU319中的表22在跳转到 BSL v2.02和 v2.03之前有一些特定的预调用要求、具体包括 G2553。  它们位于"软件调用的准备"一节和脚注2中。   第3.8.1章似乎 仅适用于 F5xx 和 F6xx 器件、我不知道本主题中讨论的内容是否适用于这些器件。