STM32之位綁定
從圖片中我們可以看出,一個位就綁定了一個地址,看到這,你會覺得奇怪?為什么位帶區(qū)地址是從0x2000 00000開始,而綁定的地址是從0x2200 0000開始的呢?啊哈、、別急哈、、正所謂心急吃不了熱豆腐、、
SARM區(qū):0x2000_0000‐0x200F_FFFF
片上外設(shè)區(qū):0x4000_0000‐0x400F_FFFF
其映射表分別如下:
可以看到GO TO Definition,點(diǎn)擊它,就可以找到GPIOA~E的地址,以此類推,我們就可以找出背后的“大哥大”了、、如圖:
好了、、有了地址、但是我們還需要每個IO口的輸出輸入寄存器的偏移地址:
沒錯了、我們以0x08 0x0c為例
1 #define GPIOA_ODR_A (GPIOA_BASE + 0X0C)
2 #define GPIOA_IDR_A (GPIOA_BASE + 0X08)3 ...4 #define GPIOA_ODR_E (GPIOE_BASE + 0X0C)5 #define GPIOA_IDR_E (GPIOE_BASE + 0X08)6 7 #define BitBand(Addr,BitNum) *((volatile unsiged long *)(Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2))8 9 #define PAout(n) BitBand(GPIOA_ODR_A,n)10 #define PAin(n) BitBand(GPIOA_IDR_A,n)11 ...12 #define PEout(n) BitBand(GPIOE_ODR_A,n)13 #define PEin(n) BitBand(GPIOE_IDR_A,n)
我來解釋下:
Addr&0xf0000000 因?yàn)槲覀儾恢赖降资荢RAM還是片上外設(shè)區(qū),所以我們這里取其最高位 因?yàn)樽罡呶挥锌赡転? 也有可能為2
Addr&0xfffff
評論