我正在研究带有一些LED和输入按钮的Raspberry Pi组装项目。 目前,我有一个闪烁的LED和一个用于打开另一个LED的按钮。 现在,我想设置另一个LED,但我陷入了我做错了或不太了解的事情。
因此,如果一个GPFSEL中有一个以上的LED,我需要将它们设置在一行代码中,以免它们彼此覆盖。 例如:
GPIO端口21为FSEL21 = Bit 5-3
GPIO端口27为FSEL27 = Bit 23-21
要将它们设置为输出,我需要将最低有效位设置为1。 它们是:十六进制的0x08和0x200000。
如果我用两行代码来完成它,例如:
ldr register,=0x08
str register,[base,#GPFSEL2]
ldr register,=0x200000
str register,[base,#GPFSEL2]
它不起作用。
所以我在一行代码中做到了,这行得通:
ldr register,=0x200008
str register,[base,#GPFSEL2]
我现在遇到的问题是设置GPFSEL1,因为它具有一个输出和一个输入。 纪录片说我必须输入000。
所以我有
GPIO端口19 =输出为FSEL19 =位29-27
GPIO端口17 =输入按钮为FSEL17 =位23-21
GPIO 19 = 0x8000000
GPIO端口17,纪录片说我必须将这些位设置为000。 我正在阅读的教程将掩码设置为0xFF1FFFFF,即Binary中的11111111000111111111111111111111。
现在我不明白如何将它们放在一起。而且我必须设置输入吗?如果我什么都没设置,那不应该是000吗? 我试图在输入中不设置任何内容,但它可以作为输入使用,但是闪烁的LED的确变慢了,而无需对代码进行任何其他更改。 希望您能告诉我设置此位的正确方法是什么。
谢谢您的帮助!
答案 0 :(得分:1)
您必须确保仅触摸您感兴趣的这些位。更改其他位将影响无关引脚的功能。
根据BCM数据表,您要将这些位设置为0b001(GPIO输出)。
要设置输出引脚的功能,可以使用
ldr r0, [base,#GPFSEL2]
bic r0, #(7 << 3)
bic r0, #(7 << 21)
orr r0, #(1 << 3)
orr r0, #(1 << 21)
str r0, [base,#GPFSEL2]
同上输入,但是您可以在此处省略orr
。