【发布时间】: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