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.

[参考译文] MSP430FR2475:JTAG 电子保险丝编程锁定密钥、用于验证锁定密钥是否已成功编程且电子保险丝已熔断

Guru**** 1131400 points
Other Parts Discussed in Thread: UNIFLASH, MSP-FET
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1203726/msp430fr2475-jtag-e-fuse-programming-lock-key-verifying-that-lock-key-was-successfully-programmed-and-e-fuse-was-blown

器件型号:MSP430FR2475
主题中讨论的其他器件:UNIFLASHMSP-FET

您好!

通过向 JTAG 签名1和 JTAG 签名2写入值0x5555、我已经能够按照说明禁用 MSP430FR2xxx 器件系列上的 JTAG。 我还可以通过向0x5555和0x5555写入类似签名来禁用 BSL。 此后  ,由于有一个密码来启用 BSL ,但这将是一个固定的密码,为了避免器件能够在现场解锁的风险,我明白我必须熔断电子保险丝来禁用 JTAG , 并通过执行上述步骤禁用 BSL。  我知道只有在应用此命令后复位后才会应用锁定。 此后当我尝试对工具重新编程时、会收到一个错误、指出"器件已受保护"、无法被 Uniflash 等软件识别。

我能够通过使用 TI Uniflash 工具执行批量擦除来恢复和解锁器件、随后能够让 Uniflash 对器件进行重新校准并对器件进行重新编程。

由于我希望在 最终客户固件中执行这些锁定步骤、因此我希望固件本身也包含重置功能、以减少所需的额外制造步骤。  

但是、这意味着我需要一种方法来验证锁定是否已经发生。 如果该事件已经发生一次、则无需再次写入存储器并再次复位器件(因为这会导致引导循环)。  

a.如何从 MSP430FR2xxx 固件中应用器件复位? 我不知道用于复位 MCU 本身的'reset'命令。

b.在查看文档时、我会看到一些函数、例如"isLockKeyProgrammed"或"isFuseBlown"。 不过、这些功能似乎是另一个器件通过 JTAG 接口发送主 MCU 的功能、而不是主 MCU 可以自行检查的功能。 如果器件被锁定、仅读取 JTAG 和 BSL 签名并确认它们等于0x5555的唯一解决方案是否是?  

请告诉我。  

此致、

Samyukta.

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

    a:可通过看门狗完成器件固件复位

    b.是的、固件可以读取存储在 FRAM 中的 JTAG/BSL 签名。

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

    尊敬的 Samyukta:

    此外、zrno 建议通过看门狗重置器件。 您也可以设置 PMMSWPOR/BOR 位以分别触发 POR 或 BOR。 请参见此摘录自 《MSP430FR4xx 和 MSP430FR2xx 系列用户指南》(文献编号:SLAU445)。

    此致、
    Brandon Fisher

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

    您好、感谢您的回答。 我能够在 FRAM 中写入签名、并且可以在 Uniflash 的存储器查看器中看到签名;这会使 JTAG 受到保护、我无法再在 Uniflash 中检测到器件。 但是、在代码中、我尝试了如下代码:

    #define JTAG_LOCK_SIGNATURE_START 0xFF80
    unsigned long * FRAM_write_ptr;
    
    bool isLockKeyProgrammed(void){
        FRAM_write_ptr = (unsigned long *)JTAG_LOCK_SIGNATURE_START;
        return (*FRAM_write_ptr == 0x55555555);
    }

    尽管我可以在存储器浏览器中看到地址0xF80和0xF82都设置为0x5555、但该函数的计算结果为 false。

    此外、当我尝试通过在0xFF84和0xFF86处将0x5555设置为 BSL 签名来禁用 BSL 时、我无法在"Memory Browser"中看到正在设置的存储器;我如何确认 BSL 实际上已禁用?

    有什么建议吗? 我做错了什么?  

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

    这行代码进行确认、对吧?  

    PMMCTL0 |= PMMSWBOR_1;

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

    尊敬的 Samyukta:

    您好、感谢您的回答。 我能够在 FRAM 中写入签名、并且可以在 Uniflash 的存储器查看器中看到签名;这会使 JTAG 受到保护、我无法再在 Uniflash 中检测到器件。 但是、在代码中、我尝试了如下代码:

    全屏
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    #define JTAG_LOCK_signature_start 0xFF80
    unsigned long * fRAM_write_ptr;
    bool isLockKeyProgrammed (void){
    fRAM_write_ptr =(unsigned long *) JTAG_lock_signature_start;
    返回(*FRAM_WRITE_ptr == 0x555555);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    尽管我可以在存储器浏览器中看到地址0xF80和0xF82都设置为0x5555、但该函数的计算结果为 false。

    [/报价]

    这看起来应该起作用。 我不知道如果您实际向 JTAG 签名加载了这些值、为什么不会返回 true。 您或许可以尝试重新读取它  内部  而不是占用很大的线段  但是你的方法应该对我来说是有效的。

    这行代码进行确认、对吧?  

    PMMCTL0 |= PMMSWBOR_1;

    [/报价]

    是的、正确。  

    此致、
    Brandon Fisher

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

    尊敬的 Brandon:

    感谢您的确认。 我想出现这个问题是因为我在完成系统初始化之前尝试读取闪存。 它现在似乎能够可靠地工作。

    现在我面临的问题是、在我确定没有写入 JTAG 签名并且我写入了用于锁定 JTAG 并禁用 BSL 的 JTAG 和 BSL 签名之后、我 通过运行行  PMMCTL0 |= PMMSWBOR_1来启动 BOR。 这可以正常工作、我可以看到器件复位、一旦再次启动、就可以看到已写入 JTAG 签名。 但是、我仍然可以使用 Uniflash 检测器件、并且仍然可以对其进行编程。 如果我手动断开器件电源并重新供电、则在这之后无法使用 Uniflash 检测器件或对其进行编程(会显示"器件已受保护"错误)。 我也尝试启动 POR、结果是一样的。 有什么想法我可能会做错什么? 我还尝试通过写入"while 1"循环并让看门狗复位器件来导致看门狗复位、 结果相同。 我无法复制器件断电的效果、然后在重新连接时、我可以看到内存写入正确、器件也像我预期的那样受到保护。  

    另一个问题-我正在使用 MSP-FET 对我的器件进行编程。 我将0x55555555写入地址0xFF80以及0xFF84以禁用 BSL。 现在阅读论坛和数据表、我们的想法是可以锁定 JTAG、但如果我们用密码保持启用 BSL、BSL 批量擦除命令会解锁器件、或者如果我们输入密码、JTAG 将正确解锁。 但是、如果我通过将0x55555555写入0xFF84来禁用 BSL、这应该会使我的器件一次性可编程、永久锁定它、我将完全无法对其重新编程、因为我无法发送批量擦除命令。 我可以在0xFF80、0xFF82、0xFF84和0xFF86中看到0x5555、虽然我无法使用 Uniflash 对器件重新编程或读出 FRAM、但我仍然可以手动发送批量擦除命令、以实际擦除器件。 然后、我可以对器件进行编程。 您能否解释一下通过 uniflash 执行批量擦除命令的工作原理?  

     我参考了您对这篇帖子的回复: e2e.ti.com/.../msp430fr2355-boot-and-code-security-options-on-msp430fr2xxx-devices---force-mass-erase-prevent-extracting-firmware

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

    另一个问题:我看到了另一种将签名加载到 FRAM 的方法:  

    #pragma RETAIN(jtagSignature)
    #pragma DATA_SECTION(jtagSignature, ".jtagsignature")
    const uint32_t jtagSignature = JTAG_LOCK_CONFIG_SIGNATURE;
    
    #pragma RETAIN(bslLockSignature)
    #pragma DATA_SECTION(bslLockSignature, ".bslsignature")
    const uint32_t bslLockSignature = BSL_LOCK

    然而、如果我这么做、我如何确保发生一个能够启用 JTAG 锁定的器件 BOR? 在前面的代码示例中、如果没有对 JTAG 锁定密钥进行编程、我会对其进行编程并启动 BOR、理论上应该会锁定 JTAG (尽管我认为这还未按预期工作)、 但在本例中、如果我在代码中执行重置、则会进入循环中。 有什么建议吗?   

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

    尊敬的 Samyukta:

    我现在面临的问题是,在我确定没有写入 JTAG 签名并且我写入了可锁定 JTAG 并禁用 BSL 的 JTAG 和 BSL 签名后,我 通过运行  PMMCTL0 |= PMMSWBOR_1行来启动 BOR。 这可以正常工作、我可以看到器件复位、一旦再次启动、就可以看到已写入 JTAG 签名。 但是、我仍然可以使用 Uniflash 检测器件、并且仍然可以对其进行编程。 如果我手动断开器件电源并重新供电、则在这之后无法使用 Uniflash 检测器件或对其进行编程(会显示"器件已受保护"错误)。 我也尝试启动 POR、结果是一样的。 有什么想法我可能会做错什么? 我还尝试通过写入"while 1"循环并让看门狗复位器件来导致看门狗复位、 结果相同。 我无法复制器件断电的效果、然后在重新连接时、我可以看到内存写入正确、器件也像我预期的那样受到保护。  [/报价]

    复位之前是否解锁 PMM 寄存器? 您可以改为尝试下面这一行作为您的 BOR 吗?  

    PMMCTL0 |= PMMPW | PMMSWBOR_1;

    您所有更新的设置都应在 BOR 后生效、因此如果正确复位该位、我希望 JTAG 重新锁定。 如果该寄存器未解锁、我不会期望您看到复位、但它值得一试。

    另一个问题-我正在使用 MSP-FET 对我的器件进行编程。 我将0x55555555写入地址0xFF80以及0xFF84以禁用 BSL。 现在阅读论坛和数据表、我们的想法是可以锁定 JTAG、但如果我们用密码保持启用 BSL、BSL 批量擦除命令会解锁器件、或者如果我们输入密码、JTAG 将正确解锁。 但是、如果我通过将0x55555555写入0xFF84来禁用 BSL、这应该会使我的器件一次性可编程、永久锁定它、我将完全无法对其重新编程、因为我无法发送批量擦除命令。 我可以在0xFF80、0xFF82、0xFF84和0xFF86中看到0x5555、虽然我无法使用 Uniflash 对器件重新编程或读出 FRAM、但我仍然可以手动发送批量擦除命令、以实际擦除器件。 然后、我可以对器件进行编程。 您能否解释一下通过 uniflash 执行批量擦除命令的工作原理?  

    [/报价]

    有关所使用命令的更多信息、请参阅《使用 JTAG 接口编程指南》(SLAU320)的第2.4.4.2节:  

    此致、
    Brandon Fisher

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

    你好  ,Brandon Fisher94, 我尝试过您的代码行,仍然可以看到设备重置, 但我在复位后仍然看不到 JTAG 锁定、在看到 JTAG 锁生效之前、我仍然需要对器件进行手动拔插以手动断电并加电。

    在这篇文章中: https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/999593/msp430fr5969-sp-what-location-bit-to-write-to-perform-a-software-reset 我看到一个实际上工作的'SOFT_reset'宏。 不过、似乎这是解锁 PMM 寄存器、应用 SW BOR 并复位 PMMCTL0寄存器的所有其他位、PMMSWBOR 0x0001位除外、根据 TRM 意味着:  

    PMMCTL0 0x0001和0x0002位被保留并始终读为0

    PMMCTL0 = PMMPW | PMMSWBOR  

    SVSHE = 0 (0b =在 LPM2、LPM3、LPM4、LPM3.5和 LPM4.5中禁用高侧 SVS (SVSH)。 在激活模式、LPM0和 LPM1下会使能 SVSH。)

    PMMREGOFF = 0 (0b =进入 LPM3或 LPM4时稳压器保持打开

    PMMSWPOR = 0 (上电复位时无电)  

    当我将此设置为软复位时、在写入存储器之后、我可以看到 JTAG 被锁定、并且在运行此固件后无法检测器件。

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

    您好、 。我不理解这一点、也不想确认、Uniflash 会发送此 JTAG User_Code_Erase 命令、该命令必须通过 JTAG 邮箱应用。 您能否向我指出一些用于确认这一点的文档?  

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

    尊敬的 Samyukta:

    如果将鼠标悬停在 uniflash 中的此选项上、工具提示会确认这是正在使用的命令。  

    据我所知、《使用 JTAG 接口进行编程指南》是有关该命令的唯一详细文档。 UniFlash 文档没有明确指出这一点、但您在禁用 JTAG 接口时使用此命令的体验也表明这是所使用的命令。  

    此致、
    Brandon Fisher

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 ,Brandon Fisher94是我不理解的问题,也是我想确认的问题,那就是 Uniflash 正在发送此 JTAG User_Code_Erase 命令,该命令必须通过 JTAG 邮箱应用。 您能否向我指出一些用于确认这一点的文档?  [/报价]

    所有 TI GUI/CLI PC 端软件工具都使用了相同的 msp430.dll、并且都在 dll 上使用了相同的 USER_CODE_ERASE 命令。 MSP430.dll 和 FET 固件都是开源的、可以在 MSP 调试堆栈中找到它们。

    如果您想深入了解并详细了解发生的情况(就像我所做的那样)、您可以使用5529 LP 与双5528/9调试器来调试调试调试器。

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

    非常感谢! 我想我在 MSP430 dll 源代码中找到了一段证明这一点的代码: https://github.com/BuLogics/libMSP430/blob/d949a8159e86dfaf0e1457682555b9278e0e48d2/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.cpp#L81 
    在这里、它会发出0x1A1A 命令(User_Code_Erase)、如果 Uniflash 使用该 MSP430.dll 和该源代码、我能够恢复我的器件是很有意义的。

    revisions.txt 还确认 Erase Now 使用 JTAG 邮箱: https://github.com/BuLogics/libMSP430/blob/d949a8159e86dfaf0e1457682555b9278e0e48d2/revisions.txt#L69