快捷绑定所有端口的位,直接调用,效果如下:
方法:
#define GPIO_ODR_A (GPIOA_BASE+0X0C) //定义A~E端口基地址
#define GPIO_IDR_A (GPIOA_BASE+0X08)
#define GPIO_ODR_B (GPIOB_BASE+0X0C)
#define GPIO_IDR_B (GPIOB_BASE+0X08)
#define GPIO_ODR_C (GPIOC_BASE+0X0C)
#define GPIO_IDR_C (GPIOC_BASE+0X08)
#define GPIO_ODR_D (GPIOD_BASE+0X0C)
#define GPIO_IDR_D (GPIOD_BASE+0X08)
#define GPIO_ODR_E (GPIOE_BASE+0X0C)
#define GPIO_IDR_E (GPIOE_BASE+0X08)
通过公式得出:
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xf0000000)+0x2000000+((Addr&0xfffff)*32)+(BitNum*4)))
//#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))
Addr&0xf0000000 、Addr&0xfffff :作用是判断是SRAM还是片上外设的。
volatile unsigned long * :是指向的地址的数据类型。
#define PAout(n) BitBand(GPIO_ODR_A,n) //PAout是A端口输出,n是第n位,以此类推
#define PAin(n) BitBand(GPIO_IDR_A,n)
#define PBout(n) BitBand(GPIO_ODR_B,n)
#define PBin(n) BitBand(GPIO_IDR_B,n)
#define PCout(n) BitBand(GPIO_ODR_C,n)
#define PCin(n) BitBand(GPIO_IDR_C,n)
#define PDout(n) BitBand(GPIO_ODR_D,n)
#define PDin(n) BitBand(GPIO_IDR_D,n)
#define PEout(n) BitBand(GPIO_ODR_E,n)
#define PEin(n) BitBand(GPIO_IDR_E,n)
可直接对某一位操作
效果如图: