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.

[参考译文] MSP430F5418A:R15上的闪存段擦除失败、R12成功

Guru**** 2454880 points
Other Parts Discussed in Thread: MSP430F5418A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1473935/msp430f5418a-flash-segment-erase-failure-with-r15-success-with-r12

器件型号:MSP430F5418A

工具与软件:

在通过内部闪存控制器擦除 MSP430F5418A 中的闪存段时、我看到一些奇怪的情况。 擦除功能位于 RAM 中、这是因为擦除的段位于 执行闪存存储体代码的同一个闪存存储体中。 通过反汇编、我已将问题范围缩小至 R12与 R15。 当段擦除的虚拟写入使用 R12进行基址偏移寻址时、段被成功擦除。 当 R15被使用时、此段不被擦除。

以下代码失败、地址为 0x0000 (R15)。

19.       FCTL1 = FWKEY | ERASE;/*启用段擦除*/
00561c:40B2 A502 0140 MOV.W #0xa502、Flash_FCTL1
20.       *sptr = 0;/*虚拟写入以开始擦除*/
005622:43CF 0000 CLR.B 0x0000 (R15)
22.       SPIn (FCTL3和 BUSY);
L2美元:
005626:B392 0144 bit.W #1、&Flash_FCTL3
00562a:23FD JNE ($C$L2)

以下代码成功发送地址为 0x0000 (R12)。

41.       FCTL1 = FWKEY | ERASE;/*启用段擦除*/
L1美元:
00561c:40B2 A502 0140 MOV.W #0xa502、Flash_FCTL1
42.       *sptr = 0;/*虚拟写入以开始擦除*/
005622:43CC 0000 CLR.B 0x0000 (R12)
44.       SPIn (FCTL3和 BUSY);
L2美元:
005626:B392 0144 bit.W #1、&Flash_FCTL3
00562a:23FD JNE ($C$L2)

擦除段时、用于基址偏移寻址的寄存器是否有限制? 很明显、R12和 R15之间存在差异。

我担心的是、随着我继续对这些代码进行更改、编译器将决定开始使用 R15而不是 R12、这会中断代码。

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

    我发现了问题的根本原因。 它与 R12和 R15无关。 这只是编译器处理我所有测试的方式的副产品。

    根本原因是 以下代码行:

    u32_t * eptr =(u32_t *)(FLASH_BL_BASE + FLASH_BL_SIZE);
    在类型化为指针之前、FLASH_BL_BL_BASE 和 FLASH_BL_SIZE 被视为16位值。 两个位的总和溢出了16位值。