设置GPIO输入/输出位

问题描述 投票:1回答:1

我正在使用一些LED和输入按钮进行Raspberry Pi组装项目。此刻我有一个闪烁的LED和一个按钮来打开另一个LED。现在我想要设置另一个LED,我会遇到一些我做错了或者不太明白的事情。

因此,如果我在一个GPFSEL中有多个LED,我需要在一行代码中设置它们,这样它们就不会互相覆盖。例如:

GPIO端口21是FSEL21 =位5 - 3

GPIO端口27是FSEL27 =位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变得非常慢,代码中没有任何其他变化。我希望你能告诉我设置这个位的正确方法是什么。

谢谢您的帮助!

assembly raspberry-pi arm
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.