![](/img/trans.png)
[英]How do you use this formula for setting a GPIO pin to output (ARM assembly)?
[英]Setting GPIO Input / Output Bits
我正在使用一些 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,即二进制中的 111111111111111111111111。
现在我不明白我怎么不能把它们放在一起。 我必须设置输入吗? 如果我不设置任何东西,它不应该是 000 吗? 我试图在输入中不设置任何内容,它作为输入工作,但是在代码中没有任何其他更改的情况下,闪烁的 LED 变得非常慢。 我希望你能告诉我设置这些位的正确方法是什么。
感谢您的帮助!
您必须确保只接触您感兴趣的这些位。更改其他位会影响无关引脚的功能。
因此,您希望将这些位设置为 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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.