簡體   English   中英

計算GPIO地址

[英]Calculate GPIO address

GPIO_MODER 端口模式寄存器

每個引腳使用兩位。

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 是 output 我得到 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 的。

我認為您的困惑來自對文本的理解,而不是概念。 你說:

...和引腳7-0作為輸出...

那是8針。 之后,你說:

...和 01 是 output 我得到 01 01 01 01 這是 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指針,然后取消引用該指針以使用= 0x5555; .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM