下面图片是来源于Cortex-M4技术手册里面
#define BITBAND(addr,bitnum) ((addr & 0xF0000000)+0X2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
为什么需要+0x2000000,首先考虑存储器映射bit_band_base是指别名区的起始地址
GD32F3x0系列器件的GPIO映射表如下:地址范围已经超过片上外设区的最低1MB(0x4000_0000~0x400F_FFFF),所以不能进行位带操作。
下面是位带操作的代码,仅供参考:
#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))
#define GPIOA_ODR_Addr (GPIOA+20)
#define GPIOB_ODR_Addr (GPIOB+20)
#define GPIOC_ODR_Addr (GPIOC+20)
#define GPIOA_IDR_Addr (GPIOA+16)
#define GPIOB_IDR_Addr (GPIOB+16)
#define GPIOC_IDR_Addr (GPIOC+16)
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)
#define LED2 PAout(15)