文档主体内容为位带的映射,目的是实现位带操作。
第一部分:位带映射的宏函数
1 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 2 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) 3 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
第二部分:STM各GPIO的输入寄存器 (IDR)、输出寄存器寄存器(ODR)映射地址
//x范围:A~G
1 #define GPIOx_ODR_Addr (GPIOx_BASE+12) 2 ..... 3 #define GPIOx_IDR_Addr (GPIOx_BASE+8) 4 .....
第三部分:上述各寄存器的位带区域
1 //x范围:A~G,n范围:[0,15] 2 #define Pxout(n) BIT_ADDR(GPIOx_ODR_Addr,n) //输出 3 #define Pxin(n) BIT_ADDR(GPIOx_IDR_Addr,n) //输入
使用办法:
实现后,可将Pxout(n)\Pxin(n) 再宏定义,例如
1 #define DHT11_DQ_OUT PAout(0) //数据端口 PA0出方向 2 #define DHT11_DQ_IN PAin(0) //数据端口 PA0入方向
其中,
DHT11_DQ_OUT = 1/0, 可以代替:GPIO_SetBits/ResetBits(GPIOB,GPIO_Pin_0)
DHT11_DQ_IN ,可以代替 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)标签:Addr,GPIOx,sys,正点,详解,DHT11,GPIO,DQ,define From: https://www.cnblogs.com/FBsharl/p/17149667.html