[英]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 是 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.