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.

[参考译文] MSP430G2433:BSL 热启动的反应与冷启动不同

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/733761/msp430g2433-bsl-warm-start-reacts-differently-than-cold-start

器件型号:MSP430G2433

您好!

在 https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/704222的讨论之后 ,我想实施 BSL 热启动,以便能够从主机控制器更新 MSP 固件,而不会在密码错误时擦除 ADC 校准的风险。  

当使用测试/复位序列(冷启动)进入 BSL 时、我可以成功执行整个闪存序列。

但是、当在热启动时进入 BSL 时、BSL 使用 ACK 应答同步命令、然后不回复任何其他命令(我使用逻辑分析仪进行了检查以确保正确)

在这两种情况下、整个通信过程完全相同、唯一的区别是热与冷启动。

我用于进入 BSL 热启动的命令。

_disable_interrupt ();

((void (*)(void)) 0x0C02)();

您是否有什么想法会导致我的问题? 或者、我可以检查什么以进一步了解问题?

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

    您好、Cedric、

    查看 MSP430闪存器件引导加载程序指南、对于该器件、似乎需要"准备软件调用"。

    尝试此操作、看看它是否能解决您的问题。

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

    另请参阅该页底部的注释2。  即使您不想清除 LOCKA、您仍需要在跳至热启动前清除锁定。  就是 这样

    MOV.w  #FWKEY、 &FCTL3

    LOCKA 不会被清除、因为它是一个切换位。  写入零无效。  您必须写入1才能将其切换至相反的状态。  但 LOCK 只是一个常规位、因此写入0会将其清除。  启动时、锁定被置位、但需要为 BSL 清除。

    如果您读取0x0C00处的 BSL 代码并将其反汇编、您会看到这种情况。  当然、您可以使用默认的热启动矢量、也可以制作自己的矢量。  我的首选项是0x0C0C、它只跳过 LOCK/LOCKA 的内容。  请注意、0x0C06清除 LOCK 和 LOCKA。  如果您跳过该操作、您仍然必须事先清除锁定。

    0c00:0c06 .dw 0x0c06           ;冷启动矢量
    0c02:0c1e .dw 0x0c1e           ;热启动矢量
    0c04:3fff JMP 0x0c04           ;无限循环
    0c06:40b2 mov.w #0xa540、&FCTL3         ;冷启动:切换 LOCKA、复位锁定
    0c08:A540
    0c0a:012C
    0c0c:90b2 cmp.w #0xaa55、&0xcede        ;检查关键字- BSL 是否已禁用?
    0c0e:AA55
    0c10:ffde
    0c12:27ff jeq 0x0c12           ;是-无限循环
    0c14:4031 mov.w #0x0220、SP        ;NO -设置堆栈指针等
    0c16:0220
    0c18:430B mov.w #0、r11
    0c1a:43c0 mov.b #0、0x0216
    0c1c:f5fa
    0c1e:C232 dint -- BIC.w #8,SR      ;热启动-清除中断等
    0c20:c0f2 bic.b #0x32、&IE1
    0c22:0032
    0c24:0000
    等等-

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

    为了从 Dennis 之前的建议中继续补充、还需要在通过 SW 条目调用 BSL 之前执行另一个步骤(或在您调用 BSL 时进行热启动)。 在通过 SW 调用 BSL 之前、您需要确保将 BSL 使用的外设/资源复位到其默认的硬件复位状态。 从 Dennis 展示的代码片段中、您可以看到此 BSL 更改使用时钟和 TimerA。 在通过软件条目调用 BSL 之前、我会将时钟系统设置为默认值、并将 Timer A 外设(所有寄存器)设置为默认的硬件复位状态。 还请记住、在进入软件之前也要禁用中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢大家的回复!

    因此、我终于有时间对其进行测试、但仍然无法将 MSP 正确地置于 BSL 中。  

    下面是我的几个试验

    _disable_interrupt ();
    BCSCTL2 = 0;// asm ("mov.b #00h、&BCSCTL2");
    FCTL3 = FWKEY;//asm ("mov.w #FWKEY、&FCTL3");
    _BIC_SR_register (0xFF);
    ((void (*)(void)) 0x0C0C)(); 

    我还尝试将其放入自己的 asm 函数中、并从 c 文件调用它。

    MOV.b#00h、&BCSCTL2
    MOV#00h、SR
    MOV.w #FWKEY、&FCTL3
    BR&0C0Ch 

    我还尝试重置 Dennis 屏幕截图中指示的所有寄存器的值(通过查看《MSP430x2xx 系列用户指南》中的默认值)   

    _disable_interrupt ();
    TA0CTL = 0;
    TA0CCTL0 = 0;
    TA0R = 0;
    TA0CCR0 = 0;
    DCOCTL = 0x60;
    BCSCTL1 = 0x87;
    BCSCTL2 = 0;// asm ("mov.b #00h、&BCSCTL2");
    BCSCTL3 = 0x05;
    FCTL3 = FWY;//asm ("mov.w #FWKEY、 FCTL3");
    __BIC_SR_register (0xFF);
    ((void (*)(void)) 0x0C0C)(); 

    在所有这些情况下、BSL 未正确响应。

    我的片段是否有明显的错误(我对 MSP 和汇编很陌生;)

    是否有办法使用调试器来查看我是否已正确输入 BSL (并正确设置外设)?

    C é dric

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

    [引用 user="Cedric Gerber"]

    我还尝试将其放入自己的 asm 函数中、并从 c 文件调用它。

    MOV.b#00h、&BCSCTL2
    MOV#00h、SR
    MOV.w #FWKEY、&FCTL3
    BR&0C0Ch 

    [/报价]

    我对这些东西的体验都在汇编器中、因此我不知道 使用 C 会带来什么、这可能会使事情复杂化。

    但在上面的片段中、应该是这样的

    BR  #0C0Ch 

    此外、虽然我不理解、但你的到0C0Ch 的跳转指令的 C 格式看起来与你最初用于0C02h 的格式一样。  但它们的格式不能相同。  0C02h 的内容是指向 TI 冷启动位置的字向量。  但在0C0Ch、您有可执行代码。  因此、在汇编器术语中、您可以分支&0C02、但您必须 分支#0C0C。  了解 C 的人必须说出这些指令的正确 C 格式。

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

    您好、Cedric、

    在进入 BSL 之前、LOCK 和 LOCKA 位也需要被清零。 您在上面的代码中没有这样做。  此外、为什么在跳转之前将0xFF 移动到 SR 寄存器中? 该文档说明用0x00清除 SR。 下面列出了您缺少的一些内容。 ALOS、对于热启动(也称为 SW 调用)、您需要跳转至0x0C02。

    ///清除 LOCKA
    FCTL3 = FWKEY + LOCKA:
    
    //jump to BSL
    ((void (*)() 0x0C02)();//跳转至 BSL