正点原子的例程里边有关这方面的解说是关于STM32F10X系列的。关于比较新的STM32F40x系列,位带操作完成的办法其实差不多,仅仅地址发生了改动罢了。
-
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr
-
&0xFFFFF)<<5)+(bitnum<<2))
-
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
-
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
-
//F4XXIO 口地址映射
-
#define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014
-
#define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
-
#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
-
#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
-
#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
-
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
-
#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
-
#define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
-
#define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
-
#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
-
#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
-
#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
-
#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
-
#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
-
#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
- #define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
-
#define GPIOH_IDR_Addr (GPIOF_BASE+16) //0x40021C10
-
#define GPIOI_IDR_Addr (GPIOG_BASE+16) //0x40022010
-
//F4XXIO 口操作,只对单一的IO 口,n 的值规模[0-15]
-
#define GPIOAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //GPIOA 某一位输出
-
#define GPIOAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //GPIOA 某一位输入
-
#define GPIOBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //GPIOB 某一位输出
-
#define GPIOBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //GPIOB 某一位输入
-
#define GPIOCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //GPIOC 某一位输出
-
#define GPIOCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //GPIOC 某一位输入
-
#define GPIODout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //GPIOD 某一位输出
-
#define GPIODin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //GPIOD 某一位输入
-
#define GPIOEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //GPIOE 某一位输出
- #define GPIOEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //GPIOE 某一位输入
-
#define GPIOFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //GPIOF 某一位输出
-
#define GPIOFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //GPIOF 某一位输入
-
#define GPIOGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //GPIOG 某一位输出
-
#define GPIOGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //GPIOG 某一位输入
-
#define GPIOHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //GPIOH 某一位输出
-
#define GPIOHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //GPIOH 某一位输入
-
#define GPIOIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //GPIOI 某一位输出
- #define GPIOIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //GPIOI 某一位输入
这样一来就可以完成位带操作。
例如这样:GPIOAout(0)
就完成了PA0端口输出低电平了。有时用的时分会很便利。