STM32之位绑定
从图片中我们可以看出,一个位就绑定了一个地址,看到这,你会觉得奇怪?为什么位带区地址是从0x2000 00000开始,而绑定的地址是从0x2200 0000开始的呢?啊哈、、别急哈、、正所谓心急吃不了热豆腐、、
SARM区:0x2000_0000‐0x200F_FFFF
片上外设区:0x4000_0000‐0x400F_FFFF
其映射表分别如下:
可以看到GO TO Definition,点击它,就可以找到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 因为我们不知道到底是SRAM还是片上外设区,所以我们这里取其最高位 因为最高位有可能为4 也有可能为2
Addr&0xfffff
STM32位绑 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)