主题中讨论的其他器件: UNIFLASH、 MSP-FET
我们遇到的问题似乎是 MSP430FR5964 FRAM 在器件上电后损坏的一部分。
链接器存储器段定义如下:
内存{
TINYRAM :origin = 0xA、length = 0x0016
BSL :origin = 0x1000,length = 0x0800
RAM :origin = 0x1C00,length = 0x2000
INFOMEM :origin = 0x1800,length = 0x0200
INFOD :origin = 0x1800,length = 0x0080
INFOC :origin = 0x1880,length = 0x0080
INFOB :origin = 0x1900,length = 0x0080
INFOA :origin = 0x1980,length = 0x0080
ROM (Rx) :origin = 0x4000、length = 0xBF80 /* end=0xFF7F、size 49024 *
HIROM (Rx) :origin = 0x00010000,length = 0x00032FFF /* end=0x42FFF,size 208895 */
Hiram (RW) :origin = 0x00042FFF,length = 0x1000 // end = 0x43FFF,size 4096 */
JTAGSIGNATURE :origin = 0xFF80,length = 0x0004
BSLSIGNATURE :origin = 0xFF84,length = 0x0004
IPESIGNATURE :origin = 0xFF88,length = 0x0008
ISRVECTORS (r) :origin = 0xFFB4,length = 0x004C
}
文本和只读数据段同时进入 ROM 和 HIROM (这些是较低和较高的 FRAM 段)。
使用 MSP-FET 通过 JTAG 对 MSP430进行刷写后、对电路板进行下电上电。 重新连接调试器、使用 TI 的 UniFlash 工具读取 FRAM 和上部 FRAM 中的存储器、并将其与刷写到微控制器中的二进制文件进行比较。 我们看到只读段中的少数字节已更改(例如.rodata、.lower.text、.upper.text)。
程序通过在.crt_0001部分中定义函数来在引导时启用存储器保护单元(MPU)、该函数在_crt0_start 和_crt0_init_BSS 之后立即调用。 MPU 被配置成只读取和执行 ROM 和 HIROM 段。 如果 MPU 检测到一个非法的存储器操作、那么它将触发一个 NMI、此 NMI 打开一个红色 LED。 由于启用了 MPU、我看不到代码中的存储器错误如何修改 FRAM 的受保护部分。
我们观察到、在刷写程序后、程序正常运行、但在下电上电后、一些 FRAM 已损坏。 每次在较低和较高 FRAM 的不同部分中、不同的字节都会被损坏。 如果程序遇到损坏的指令(取决于损坏段的内容)、则会发生非法指令或存储器违规并触发 MPU、导致红色 LED 亮起。 即使红色 LED 未亮起、我仍然可以读取微控制器的存储器、并看到某些字节在循环通电时发生了变化、即使这些字节未导致可观察到的代码故障。 我已经尝试刷写、让它运行、然后在下电上电前读出存储器。 只有在重启电源后、它才会损坏。
MSP430由3.3V 电源供电、所有 DVCC 和 AVCC 引脚连接在一起。 我在论坛、数据表或勘误表中找不到任何可以提供有关导致此问题的任何线索的信息。 我们已在两个不同的板上重新创建了它。