【问题标题】:Setting GPIO Input / Output Bits设置 GPIO 输入/输出位
【发布时间】:2019-04-02 20:00:29
【问题描述】:

我正在开发一个带有一些 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,即二进制中的 11111111000111111111111111111111。

现在我不明白我怎么不能把它们放在一起。我必须设置输入吗?如果我不设置任何东西,它不应该是 000 吗? 我试图不在输入中设置任何内容,它作为输入工作,但闪烁的 LED 变得非常慢,代码没有任何其他更改。 我希望你能告诉我设置这些位的正确方法是什么。

感谢您的帮助!

【问题讨论】:

  • 一般来说,您希望读取-修改写入,而不是只写入所有位。如果你做对了,任何一种方式都有效,但由于这些寄存器是可读的,你可以读-修改-写寄存器,只更改一些位来启用或禁用或更改某些东西的功能。

标签: assembly raspberry-pi arm


【解决方案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

【讨论】:

  • 感谢您的帮助。我需要做一些研究以了解您的解决方案,但我想这是我可以做的事情。
猜你喜欢
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
相关资源
最近更新 更多