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.

[参考译文] MSP430FR2355:MSP430FR2355 MSP430FR2xxx 电子保险丝锁定代码示例。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/772864/msp430fr2355-msp430fr2355-msp430fr2xxx-electronic-fuse-lock-code-samples

器件型号:MSP430FR2355
主题中讨论的其他器件: MSP430F5340

您好!

我正在寻找用于从 固件中锁定/解锁 MSP430FR2355的代码示例。

根据用户手册  

"锁定器件需要在 FRAM 中对两个签名进行编程。
JTAG 签名1 (存储器地址0FF80h)和 JTAG 签名2 (存储器地址0FF82h)控制器件锁定机制的行为。
可以通过向 JTAG 签名1和写入除0000h 或 FFFFh 以外的任何值来锁定器件
JTAG 签名2"。

我假设将0000或 FFFF 重新放入程序的签名中会解锁器件。

在 IAR 中、我在哪里可以看到这样的代码示例?

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

    您好!

    我无法找到任何用于锁定 MSP432FR2xx 上 JTAG 的示例软件、但有一个 MSP430FR5xx/6xx 示例是一个很好的起点。  我们有  份 MSP 代码保护功能应用手册 、其中介绍了不同系列上 JTAG 的锁定、并下载了 FR5xx 软件示例。   

    正确的做法是清除 JTAG 签名会解锁器件、但这只能通过受密码保护的 BSL 或应用代码中的某种方式来完成。  它不能通过 JTAG 或 SBW 完成。  

    我认为该应用手册将回答您的大部分问题。  如果您有任何其他后续问题、请告诉我。

    谢谢、

    JD

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

    [引用用户="JD Crutchfield"]

    正确的做法是清除 JTAG 签名会解锁器件、但这只能通过受密码保护的 BSL 或应用代码中的某种方式来完成。  它不能通过 JTAG 或 SBW 完成。  

    [/报价]

    FR2xx 具有锁定 JTAG 访问的 FR4xx 器件可以使用 SBW/JTAG 邮箱系统(用户代码擦除)返回出厂(解锁)状态。

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

    您好!

    感谢您的回答、但请允许我澄清一下。

    我们以前使用过 MSP430F5340。  

    可以使用我们的代码中的以下代码来锁定/解锁 MCU

    锁定

    while ((FCTL3 & WAIT)=0);//确保没有正在进行的闪存写入

    SYSBSLC = 0;//启用和解锁 BSL 段3
    FCTL4=FWKEY;//解锁信息
    FCTL3=FWKEY;//解锁闪存和信息 A
    FCTL1=(FWKEY + WRT);
    (*(uint8_t*) 0x17fc)= 0x55;

    while ((FCTL3 & Busy)== Busy);

    FCTL1=FWKEY;
    FCTL3 =(FWKEY + LOCK);

    解锁  

    (笑声)

    (*(uint8_t*) 0x17fc)= 0x00;

    (笑声)

    另一方面 、MSP430FR2355 在主存储器中具有这些签名、因此只需在代码中执行以下操作即可?:

    解锁:

    (*(uint8_t*) FF80h)= 0x00;

    (*(uint8_t*) FF81h)= 0x00;

    (*(uint8_t*) FF82h)= 0x00;

    (*(uint8_t*) FF83h)= 0x00;

    锁定

    (*(uint8_t*) FF80h)= 0x55;

    (*(uint8_t*) FF81h)= 0x55;

    (*(uint8_t*) FF82h)= 0x55;

    (*(uint8_t*) FF83h)= 0x55;

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

    使用邮箱进行批量擦除的好地方! 这将解锁 JTAG。

    费连特斯、
    我同意 Zrno 的说法、即您的固件应该可以正常工作。

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

    JD、您好!

    我正在尝试执行签名更改、但无法使其正常工作。

    您能否对一些代码进行采样、以完成 FRAM 的类似任务?

    谢谢、

    费连特斯

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

    我没有在 FRAM 中写入这些签名的代码示例、但有2个 FRAM_WRITE 示例展示了如何能够写入 FRAM 存储器: dev.ti.com/.../

    您可能有2个可能的问题。

    1.在 BOR 之后,签名才会生效。 (但我想、如果您重启电源、您会注意到这一点)

    2.更有可能的是、您需要清除 FRAM 保护位。 这是存储器这个签名段的 FPWP 位。 如需更多信息、请参阅《MSP430FR2355用户指南》。

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

    感谢您的示例。

    我在 launchpad 上测试了以下代码、并尝试查看调试器中地址0x80处的内存更改。
    内存未更改。 但是、当我按照示例将基地址更改为0x1800时、我可以看到发生了变化。
    区域0x80是否有其他保护机制?

    #include

    unsigned long * FRAM_WRITE_ptr;

    #define FRAM_TEST_START 0xFF80

    空 FRAMWrite55 (空)

    SYSCFG0 = FRWPPW | PFWP;
    *FRAM_WRITE_PTR = 0x55555555;
    SYSCFG0 = FRWPPW | DFWP | PFWP;


    空 FRAMWriteFF (空)

    SYSCFG0 = FRWPPW | PFWP;
    *FRAM_WRITE_PTR = 0xFFFFFFFF;
    SYSCFG0 = FRWPPW | DFWP | PFWP;


    int main (空)

    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

    P1OUT &=~BIT0; //清除已定义加电状态的 P1.0输出锁存器
    P1DIR |= BIT0; //将 P1.0设置为输出 directionOUT

    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置

    while (1)

    FRAM_WRITE_PTR =(unsigned long *) FRAM_TEST_START;
    FRAMWrite55();
    FRAMWriteFF();

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

    感谢你的帮助。

    正确的代码

    空 FRAMWrite55 (空)

    SYSCFG0 = FRWPPW | DFWP;
    *FRAM_WRITE_PTR = 0x55555555;
    SYSCFG0 = FRWPPW | DFWP | PFWP;


    空 FRAMWriteFF (空)

    SYSCFG0 = FRWPPW | DFWP;
    *FRAM_WRITE_PTR = 0xFFFFFFFF;
    SYSCFG0 = FRWPPW | DFWP | PFWP;