我正在尝试使LPC4088(Datasheet)上的LED闪烁,并且我已经准备好了我的外设寄存器。现在是时候闪烁一个LED,这是应该这样做的循环:
blink:
@ In register SET1 (0x20098038) we set bits:
@ bit 13 = 1 > sets pin P1_13 to high state
ldr r0, =0x20098038
ldr r1, [r0]
ldr r2, =0x2000
orr r1, r2
str r1, [r0]
@ NO DELAY NEEDED FOR DEBUG
@ In register CLR1 (0x2009803C) we set bits:
@ bit 13 = 1 > sets pin P1_13 to low state
ldr r0, =0x2009803C
ldr r1, [r0]
ldr r2, =0x2000
orr r1, r2
str r1, [r0]
@ NO DELAY NEEDED FOR DEBUG
b blink
当我在调试器中检查代码的执行时,我注意到循环的第一部分(在第一个@ NO DELAY NEEDED FOR DEBUG
之前)执行正常,并且在执行命令str r1, [r0]
时LED完全打开。
现在是循环的第二部分(在第一个@ NO DELAY NEEDED FOR DEBUG
之后),当我尝试执行ldr r0, =0x2009803C
LED时,LED不会关闭。相反,我的程序直接跳转到循环的第一部分,并在下一步中执行ldr r0, =0x20098038
。所以说明:
ldr r1, [r0]
ldr r2, =0x2000
orr r1, r2
str r1, [r0]
循环的第二部分中的永远不会被执行......
此代码以前在C代码中运行得非常好......有没有人发现错误,因为我无法做到。我会以某种方式覆盖寄存器吗?是不是我的编译器以某种方式优化了代码?
答案 0 :(得分:0)
您不能从地址CLR1
的注册2009803c
读取,因为它是只写的(请参阅用户手册)。结果你得到了一个错误(我不确定究竟是哪一个,可能是MemManageFault或BusFault)。通常它会跳转到故障处理程序,但从您看到的行为似乎重新启动程序。
解决方案不是读取SET
或CLR
寄存器,您应该只编写要设置或清除的位模式。