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.

[参考译文] MSP430FR5969:BSL 赢得了密码失败时的#39;t 擦除存储器

Guru**** 2584455 points
Other Parts Discussed in Thread: MSP430FR5969, MSP-FET, MSP430FR6989, MSPBSL

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/613184/msp430fr5969-bsl-won-t-erase-memory-on-failed-password

器件型号:MSP430FR5969
主题中讨论的其他器件: MSP-FETMSP430FR6989MSPBSL

我的 PCB 上有一个 MSP430FR5969器件。  我使用以下代码从软件启动引导加载程序:

CSCTL1 = DCOFSEL_3;//确保 FR5969的时钟频率低于8MHz
for (i=10;i>0;i--){//刻录> 4个时钟周期,允许 DCO 稳定
NOP();
}
_disable_interrupt (); //禁用所有中断
((void (*)() 0x1000)();//跳转至 BSL

while (1); 

这似乎可以正常工作。  因为我可以发送 TX BSL 版本、并从 BSL 获取0x00和消息。  但由于某种原因、其他消息不起作用。  我已发送 RX_PASSWORD 消息、我得到的只是以下几点:

无论我发送什么消息、我都会得到这种未知的应答。  此脚本来自 BSL 脚本编写器随附的 FRxx BSL 示例。  我刚才评论了其他所有内容、一直在努力使其正常工作。  

如果我发送 TX_BSL_VERSION 命令、我会得到:

我已经尝试通过实数、pyton 等手动发送 RX_password。 我无法取得任何进展。  我已验证 BSL 从 TX_BSL_VERSION 向我发送的数据的波特率为9600。  我还在 BSL FRxx 文档中看到、BSL 需要偶校验、除非您在我拥有的模式调用中使用"奇偶校验"选项、否则脚本程序不会提供。  

如果我使用 python 将 TX_BSL_VERSION 从计算机发送到 BSL、并显示我接收到的内容、我会返回以下消息:

0x0
0x80
0x2.
0x0
0x3B
0x4.
0xe4
0x84

0x00显然是来自 BSL 的 ACK、指示它接收到 TX_BSL_VERSION 消息?  我不会从任何其他消息中得到0x00。  在文档中、如果您发送字节0x80、我应该从 BSL 获取0x90。  

下面是我在这么长时间的工作中提出的一些具体问题。  如果您有任何建议/答案、是否有人可以查看这些信息并告诉我?

1. 我是否应该只能向 BSL 发送字节0x80并每次接收0x90?

2. 是否应该有任何错误的密码消息来擦除我的程序?

3. 当我在 RX_PASSWORD 消息中发送多个错误密码时、为什么 MSP430FR5969会重新启动并开始运行我的程序代码?  这似乎是为了确保无论什么内存被擦除?

4. 因为我的存储器没有被擦除、这是否意味着 RX_PASSWORD 实际上没有被器件正确接收?  

我 将通过虚拟通信发送数据。 也连接到 UART 的 FTDI 芯片的端口。  我无法使用 MSP-FET 调试器。  这是否应该是可能的?

6. 是否有方法使用调试器对此进行进一步的故障排除?

7. 如何确定我得到的是哪种类型的 ACK -未知的 ACK 是否意味着没有收到任何 ACK?

8. 您是否必须解锁 BSL 才能使用 TX_BSL_VERSION 命令?

以下是我的脚本:

---- >下面是我输入到 scripter.exe 的主脚本

//
//脚本示例 FRxx UART BSL
//
//设备:MSP430FR6989
//通信桥接器:MSP-BSL Rocket
//
//通过下载 Blink 应用程序
FRAM 器件中的//UART BSL
//
//mode FRxx UART 9600 COM188
//log
模式 FRxx UART 9600 COM7奇偶校验
详细
//批量擦除
//mass 擦除

TX_BSL_VERSION

//提供错误的密码进行批量擦除
//RX_PASSWORD pass32_wrong.txt

//
//输入错误的密码后添加延迟
//因为器件不提供
//应用错误密码后的任何响应
//

//RX_PASSWORD pass32_default.txt
//delay 2000
//RX_PASSWORD pass32_default.txt
//RX_DATA_BLOCK IlluminatorFW_rev2.txt
//CRC_CHECK 0x4400 0x0020
//set_PC 0x4400

//mass 擦除

//RX_DATA_BLOCK blinkLED_FR6989.txt

-------- >下面是密码文件。  我刚刚使用了所有 FF、因为没关系...我只是想让器件擦除其存储器

@FFE0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

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

    TX_BSL_VERSION 是受保护的命令、在提供正确的 RX_PASSWORD 之前不会返回正确的响应。  由于您为器件提供应用固件、因此复位矢量(位于0xFFFE 位置)是有效值而不是0xFFFF、因此提供的密码不正确、将导致批量擦除。  如果您第二次提供相同的密码(在等待批量擦除完成的延迟之后)、则 BSL 将被解锁、您将能够获得正确的 BSL 版本号。  请注意、解锁和进入 BSL 是两个不同的函数。

    此致、Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我知道。 如果我只执行 RX_PASSWORD 一次且密码错误、那么我的程序存储器不应该擦除? 这意味着我不能重启器件并看到代码再次运行?

    目前、我使用错误的密码执行 RX_PASSWORD、并看到 ACK 错误。 我可以对器件进行重启、代码开始运行、LED 再次闪烁、这让我相信我的程序存储器尚未擦除、而且我丢失了一些东西。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果没有批量擦除、则 BSL 主机未正确连接到 MSP430FR5969目标。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、是否有方法来验证与此脚本编辑器工具的连接? 启动引导加载程序时、我在 MSP430方面缺少一些东西(我认为我不是这样)、或者在连接脚本编辑器工具时出现了一些错误。 我认为 TI 在这个工具中有一些东西可以让我显式测试到引导加载程序的链接、并确保引导加载程序正在运行并且链接正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RX_PASSWORD 是唯一一个响应未受保护的 BSL 命令、因此您必须使用它来验证连接。 使用我的示例、第一个密码不成功、启动批量擦除、但第二个密码解锁器件。 如果连接不正确、则"BSL 密码正确!" 不会返回响应。

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

    好的、可能我实际上没有正确启动引导加载程序。  我是否需要在上面发布的软件引导加载程序启动部分的 SYSCTL 寄存器中设置 SYSBSLIND 位?  我注意到 TI 的一个示例设置了该位、然后使用了该位

    PMMCTL0 = PMMPW | PMMSWBOR;

    我以随附的 C 文件为例。  不过、我遇到的一个问题是在下面的部分中确定他们在哪里写入 BSL_password:

    passwd = BSL_password; //发送密码 

    这来自以下函数:

    /*********
    *
    **@简短强制启动模式
    *将状态和控制字节中的位置位以请求启动模式、在
    passwd 中写入密码*并强制 PUC 复位
    *启动将在 PUC 后开始执行并检测到强制启动模式
    *
    *@返回无
    /
    void TI_MSPBoot_JumpToBoot( void ){
    
    passwd = BSL_password; //发送密码
    StatCtrl |= BOOT_APP_REQ;//将标志设置为请求引导模式
    _disable_interrupt (); //禁用所有中断
    //强制执行软件 BOR
    PMMCTL0 = PMMPW | PMMSWBOR;
    while (1)
    ;
    
    } 

    e2e.ti.com/.../TI_5F00_MSPBoot_5F00_Mgr_5F00_Vectors_5F00_FR57xx.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SYSBSLIND 是只读的、但它指示检测到 BSL 进入序列。 设置 PMMCTL0寄存器内的 PMMSWBOR 会导致软件 BOR、这用于评估 MSPBoot 主存储器引导加载程序的密码和状态。 由于您使用的是闪存 BSL、而不是 MSPBoot、因此您不应研究这些代码示例。 原始帖子中提供的指令应该足以跳转到 BSL (从0x1000开始)、但您可以使用调试器来查看是否给出了错误或异常。

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

    引导加载程序是否应在通信失败时退出?  我注意到、如果我发送一些失败消息、MSP 会从引导加载程序跳出并返回到我的稳压器程序。  

    我的主程序使 LED 闪烁。  当我调用 BSL 时、LED 停止闪烁。  当我使用脚本编辑器工具运行此脚本时、脚本会失败、如屏幕截图所示、跳出并再次开始运行主程序。  我可以说、因为我的 LED 再次开始闪烁。  

    脚本程序失败的屏幕截图

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅 SLAU655的常见问题解答1、BSL 脚本编写器模式命令会调用 BSL。 但是、我认为 FR5xx/6xx BSL 的超时时间不像 MSP430FR4xx/2xx 上提供的超时时间。 如果未发送命令、主程序是否会在一段时间后运行? 如果您监控 RST 线路、您是否看到它在任何情况下都切换?

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

    那么、我将通过软件启动 BSL ...本常见问题解答中未提及这一点、但我认为的过程也是如此?

    我在复位线路上放置了一个示波器、但看不到任何复位条件。  我正在使用虚拟通信。 通过 FTDI 芯片进行移植...这会引起任何问题吗?  当我启动引导加载程序并将其放在那里时、看起来也没有超时条件。  

    是否存在问题  

    _disable_interrupt (); //禁用所有中断 

    没有禁用所有中断?  我过去遇到了另一个部件的引导加载程序问题、该问题之所以失败、是因为所有中断源都没有被屏蔽。

    是否有任何需要设置的位?  在启动 BSL 之前、我是否需要先手动擦除一部分存储器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我不使用 Rocket 或 FET 工具。 我将 PC 直接连接到 FTDI 芯片、该芯片直接连接到 MSP430FR5969的 UART。 这本身是否会成为问题? 我假设这是一个您可以使用客户软件和硬件访问的界面。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    禁用中断不是问题、因为在跳转到软件中的 BSL 区域之前需要执行此操作。 但是、由于您已使用有效的复位矢量对应用程序代码进行编程、因此默认密码不正确并触发批量擦除、SLAU550的第4.3.3.3节提到这会复位器件。 因此、批量擦除后的任何复位都不会在没有进入序列的情况下调用 BSL、因此对 TEST/RST 引脚没有控制权会成为一个问题。 您可能需要评估 MSP-FET BSL 脚本编写程序、以确保 FTDI 芯片遵循 UART BSL 协议(第3.1.1节)。

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

    那么、是否可以在不访问 TEST/RST 引脚的情况下成功启动和使用引导加载程序?  我计划通过使用 UART 的软件来实现这一切、但现在我得到了一种氛围、即您实际上需要使用 TEST/RST 引脚通过 BSL 重新刷写 FR 系列。  是这样吗?  如果是、这将简化事情、因为这将是我的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    完全可以通过软件条目访问 BSL 而无需 TEST/RST 引脚、但您需要在第一次尝试时提供正确的密码以避免批量擦除。 您可以选择将0AAAAh 写入 BSL 签名1和 BSL 签名2以禁用此安全功能。 但您仍然需要知道密码(BSL 中断矢量表中的前16个字、位于地址0xFFE0和0xFFFF 之间)。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、还可以。 因此、当您无法访问 TST/RST 时、这似乎是唯一的路由。 对我来说很好、我只是没有意识到所有这些。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、在技术上、当您向 FR 器件发送错误的密码时、应该发生什么情况? 此行为似乎与文档不匹配。 器件是否应在密码错误时复位并重新开始运行其代码? 是否应该仅接受引导加载程序 Nack'ing 消息、直至正确的密码通过?

    我尝试以自上而下和自下而上的字顺序将0xFFE0发送到0xFFFE (32字节)、但仍然没有执行。 密码的字节顺序是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果连接正确、请输入 BSL 并发送错误的密码、然后将执行批量擦除(只要通过将0AAAAh 写入 BSL 签名1和 BSL 签名2未禁用此操作)。 我不确定器件在之后是保持在 BSL 中还是复位。 如果代码继续运行(无擦除)、则可能存在连接问题。 SLAU550的第4.3.3.2节显示了一个空白器件的正确 RX 密码。 这将有助于使用 MSP-FET 或 MSPBSL Rocket 评估 BSL。

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

    您的意思是"使用 MSP FET 进行评估"?  我有一个 FET、但一旦您启动引导加载程序、您将如何处理 FET?

    我终于得到了这种半工作状态。  如果我使用此代码:

    MPUCTL0 = MPUPW;
    
    
    
    * iv_1 =(unsigned int) 0xFFFF;
    * iv_2 =(unsigned int) 0xFFFF;
    * iv_3 =(无符号 int) 0xFFFF;
    * iv_4 =(无符号 int) 0xFFFF;
    * iv_5 =(无符号 int) 0xFFFF;
    * iv_6 =(无符号 int) 0xFFFF;
    * iv_7 =(无符号 int) 0xFFFF;
    * iv_8 =(无符号 int) 0xFFFF;
    * iv_9 =(无符号 int) 0xFFFF;
    * iv_10 =(无符号 int) 0xFFFF;
    * iv_11 =(无符号 int) 0xFFFF;
    * iv_12 =(无符号 int) 0xFFFF;
    * iv_13 =(无符号 int) 0xFFFF;
    * iv_14 =(无符号 int) 0xFFFF;
    * iv_15 =(无符号 int) 0xFFFF;
    * iv_16 =(无符号 int) 0xFFFF;
    
    
    CSCTL1 = 0;
    for (i=100;i>0;i--){//刻录> 4个时钟周期,允许 DCO 稳定
    NOP();
    }
    
    _disable_interrupt (); //禁用所有中断
    
    
    _NOP();
    _NOP();
    
    ((void (*)() 0x1000)();//跳转至 BSL
    
    while (1); 

    我使用所有 FF 的密码、我可以下载似乎正常工作的映像。  iv_s 是指向前16个中断矢量的指针。  我将手动擦除它们、以便可以使用0xFF 密码。  我认为、TI 文档中有一个非常误导的关键问题是没有提到 MPU 可以保护存储空间。  如果不清除 MPUEN 位、您就无法访问存储器、而我假设擦除过程会导致系统复位。  

    现在、我已经开始工作了、我仍然需要走更远的一步。  这种方法的问题是、一旦我禁用 MPU、FRAM 的擦除现在就可以工作了。  因此、错误的密码会擦除器件。  我的上述方法会擦除中断矢量、以便如果我成功解锁器件、但不对映像进行编程、我可以重置并运行映像、因为我的中断矢量现在已拧紧、并设置为所有 FF。  我需要使用正确的密码、这是前16个中断向量。  我现在遇到的问题是上面的所有 FF 都可以正常工作、但使用密码不能正常工作。  我查找16个矢量的值、我已经尝试了每种组合和方法、将它们发送到我可以想到的 BSL、但没有任何工作。  

    将字节发送到 BSL 的顺序是什么?  看看 CCS 中的存储器空间是否足以获得其值?  我是先发送0xFFE0中的值还是先发送0xFFFE 中的值?  关于每个字、我是先发送0xFFE0的 MSB 还是先发送0xFFE0的 LSB?  我已经尝试在文档中找到此信息、但在尝试使此引导加载程序正常工作几天后、无法看到或根本看不到此信息。  

    如果我尝试使用引导加载程序刷写器件但失败、这是否意味着现在需要在失败后使用 Rocket 或 FET 对其进行编程?  在发生故障后、如果您进行下电上电、BSL 似乎不会自动调用。  这意味着在发生故障时、我恢复芯片的唯一选择是使用 JTAG?  是这样吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是说使用 MSP-FET 和 BSL 脚本编写器来进一步了解 BSL 的典型访问方式(使用 TEST/RST 进入序列)。 我对您的 MPU 注释感到困惑、因为您的代码不是寄存器的默认值(MPU 已禁用)、因此不会进行任何更改。 不用说、您不必清除中断矢量、尤其是复位、因此不建议这样做。 BSL 密码从0xFFE0开始、到0xFFFF 结束、LSB 优先发送(UART 标准)。 校验和值因数据字节内容而异。 如果执行了批量擦除、则软件应用程序条目不再有效、您必须通过正确的 TEST/RST 条目序列进入 BSL。

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

    我刚才展示了现在可以正常工作的引导加载例程。  我必须禁用 MPU、以便在尝试解锁器件时防止其复位。  我只清除中断矢量、这样我就知道密码是 FF。  

    感谢您解决在下载失败时应采取的措施。  我假设一旦您尝试刷写器件、您的 BSL 软件入口点就不再存在、因为那里没有代码、因此您必须使用 FET 工具。  

    因此、串行是最低有效位优先、我假设您也是要先发送最低有效字节。  这是有道理的。  我感到困惑的原因是每个中断矢量是2个字节。  那么、为了归结为归结为、我是否按此顺序将数据发送到 BSL?  (如下所示)

    0xFFE0 -第一个字节 (UART 首先将其发送到 BSL)

    0xFFE1 -第二个字节

    0xFFE2 -第三个字节

    0xFFFF - 32'nd 字节 (UART 最后将其发送到 BSL)

    我目前在 code composer 中查看0xFFE0-0xFFFF、然后按照上面显示的顺序将字节放入文本文件中。  字节匹配、但器件从未解锁。  我想我以错误的顺序或其他方式发送它们。  

    因此、目前、如果我使用上面的引导加载程序序列并手动擦除矢量、然后使用 FF 作为密码、它将起作用。  如果我不擦除向量并尝试将向量中的内容用作密码、则它将不起作用。  这基本上就是我被卡住的地方。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您显示的顺序正确、数据字节 D1至 D20h 保存从地址 FFE0h 处的 D1开始的密码信息。 您是否相应地调整了校验和? 您能否提供 RX_PASSWORD 命令数据包示例?

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

    我认为 BSL_scripter 处理了校验和。  这不是真的吗?

    以下是我的存储器空间和 BSL_scripter 正在发送的内容的屏幕截图。  

    以下是我的密码文件的内容

    @FFE0
    46 5E 46 30 46 5E 46 14 46 5E 46 5E 45 C0 44 F0
    44 00 46 5E 46 5E 46 5E 46 5E 46 5E 46 5E 46 5E 45 F6

    我还附加了图像和密码文件。

    e2e.ti.com/.../pass32_5F00_real.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的错误是正确的、因为 BSL 脚本编写器负责处理校验和。 但是、浏览器显示的内存内容解释不正确。 0xFFE0 = 5E、0xFFE1 = 46、0xFFE2 = 30等 通过更改为8位十六进制- TI 样式可进一步验证这一点。 因此、密码文件应为:

    @FFE0
    5e 46 30 46 5E 46 14 46 5E 46 46 5E 45 C0 45 F0 44
    00 44 5E 46 5E 46 5E 46 5E 46 5E 46 5E 46 5E 46 F6 45


    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还可以! 为什么8位和16位 TI 样式的显示方式不同?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到这个消息。 我不确定为什么 CCS 存储器浏览器选择小端序顺序、但它是微处理器最常用的格式。

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

    是的、让我感到困惑的是、TI 16位十六进制显示的存储器值与 TI 8位十六进制样式不同。