位绑定的概念:关于51单片机只要8位,关于M3来说,有32位,也便是说把32位中的某一位经过一个简略的地址的改换的算法来完成对该位的操作,它能够映射到一个地址的空间,也便是说一个位它占一个地址,就好比方把惠州放在广东省的某一个地址,叫做惠州市,经过搭去惠州的车票就能够来到惠州市这个地址,别去东莞哈、可是这个位只要在地址的最低位有用,由于地址可能是指向一个32位的内存单元、、由于是LSB
从图片中咱们能够看出,一个位就绑定了一个地址,看到这,你会觉得古怪?为什么位带区地址是从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