③在多个引脚需要定义时,显然上面两种方法都比较繁琐。为简化位带操作,也可以定义一些宏。比如,我们可以建立一个把“位带地址+位序号”换成别名地址的宏,再建立一个把别名地址转换成指针类型的宏。 例如 #defineGPIOD_ODR_Addr ((uint32_t)(GPIOD_BASE+0x14)) // GPIOD_BASE已经定义过 #defineBITBAND(addr,bitnum) ((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2)) #defineMEM_ADDR(addr) (*((volatile unsignedlong *)(addr)) ) #define BIT_ADDR(addr,bitnum) MEM_ADDR( BITBAND(addr, bitnum)) #define PD12 BIT_ADDR(GPIOD_ODR_Addr, 12) //12为GPIOD对应的引脚号 #definePD12 BIT_ADDR(GPIOD_ODR_Addr, 13) //13为GPIOD对应的引脚号 PD12=0x01; //PD12引脚置高 PD13=0x01; //PD13引脚置高
|