我试图使连接到GPIO 4的led闪烁,然后闪烁。但是让我感到困惑的是,活动LED(绿色的LED)也随着GPIO 4上的led一起闪烁。这是我的代码,刚刚打开了GPIO 4:
.section ".text.boot"
.globl notmain
.equ GPIOBASE, 0x3f200000
.equ FSEL0, 0x0
.equ SET_BIT12, 0x00001000
.equ SET_BIT12_MASK, 0x00007000
.equ SET_BIT4, 0x00000010
.equ GPSET0, 0x1c
.equ GPCLR0, 0x28
notmain:
ldr r0, =GPIOBASE
ldr r1, [r0, #FSEL0]
ldr r2, =SET_BIT12_MASK
mvn r2, r2
and r1, r1, r2
orr r1, r1, #SET_BIT12
ldr r0, =GPIOBASE
str r1, [r0, #FSEL0]
ldr r0, =GPIOBASE
ldr r1, [r0, #GPSET0]
orr r1, r1, #SET_BIT4
ldr r0, =GPIOBASE
str r1, [r0, #GPSET0]
loop:
b loop
如果我将#GPSET0替换为#GPCLR0,则LED指示灯也将关闭。为什么将这两件事联系起来?
GPSET和GPCLR寄存器无意进行读取-修改写操作。它们打算在要执行该操作的位置写入1,因此要设置gpio 4,请向GPSET写1 << 4,要清除gpio4,请向GPCLR写1 << 4。]
在您的读-修改-写操作中,您可能正在读取某些内容,然后将其写回也可能会更改这些引脚的状态。对于CLR / SET,写入0不会更改gpio引脚的状态,写入1可以更改gpio引脚的状态,您可以在一次写入中更改一个或部分或全部(到该状态)。