工具与软件:
在通过内部闪存控制器擦除 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、这会中断代码。