计算GPIO地址

Calculate GPIO address

每个引脚使用两位。

00 = input
01 = output

在示例中,他们将引脚 15-8 配置为输入,将引脚 7-0 配置为输出。

@ arm assembly
LDR R0,=0x40020C00
LDR R1,=0x00005555
STR R1,[R0]
/* c */
*( (unsigned long *)0x40020C00) = 0x5555;

这是“通用 IO”一章中的第一个示例,我完全迷路了。我以为我已经弄清楚他们是如何得到 0x00005555 但现在我不知道了。如果每个引脚使用两位并且输出 01,我得到 01 01 01 01,即 0x55 而不是 0x5555。他们使用 16 位来获得 0x5555 = 0101 0101 0101 0101 我不明白为什么。

现在到第 15-8 针。在这里,我可悲地什么都不懂。 00 用于输入,所以我得到 00 00 00 00。然后有一个偏移量 0x01,我不明白它应该如何使用。

非常感谢任何帮助,我想我需要一个更简单的例子来理解。


编辑:所以我混淆了位和引脚,感谢 NoTengoBattery。我理解 0101 0101 0101 0101 = 0x5555。但是我还是不明白我是怎么从0000 0000 0000 0000到0x40020C00的。

我认为你的困惑来自对文本的理解,而不是概念。你说:

... and pins 7-0 as outputs ...

这是 8 个引脚。之后你说:

... and 01 is output I get 01 01 01 01 which is 0x55 ...

如果你自己看是怎么分开的,你只考虑了4针,而不是8针。如果你考虑4针你是对的,它是0x55。如果你考虑 8 个引脚,它的 0b0101010101010101 实际上是 0x5555.

您似乎在将二进制转换为十六进制时迷路了。请记住,每 四个 位都可以表示为一个十六进制字符。以下是他们根据您所描述的内容派生 0x5555 的位置的细分(为了我自己理智地处理这个答案框中的自动换行,我将整个寄存器分成两部分,但想象一下它们被混合在一起):

       |pin15|pin14|pin13|pin12|pin11|pin10|pin09|pin08|
bit    |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
bin 0b |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |
hex 0x |     0     |     0     |     0     |     0     |

       |pin07|pin06|pin05|pin04|pin03|pin02|pin01|pin00|
bit    |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
bin 0b |0 |1 |0 |1 |0 |1 |0 |1 |0 |1 |0 |1 |0 |1 |0 |1 |
hex 0x |     5     |     5     |     5     |     5     |

全部放在一起,你得到0x00005555。 0x40020C00 显然是这个寄存器的地址。 *( (unsigned long *)0x40020C00) 将 0x40020C00 转换为 unsigned long 指针,然后取消引用该指针以将 0x00005555 写入该地址 = 0x5555;.