设置GPIO输入/输出位

时间:2019-04-02 20:00:29

标签: assembly raspberry-pi arm

我正在研究带有一些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的确变慢了,而无需对代码进行任何其他更改。 希望您能告诉我设置此位的正确方法是什么。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  1. 您必须确保仅触摸您感兴趣的这些位。更改其他位将影响无关引脚的功能。

  2. 根据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