根据位带区地址算位带别名区地址公式
#define BITBAND(GPIOB_ODR_Addr , bitnum) ((GPIOB_ODR_Addr & 0xF0000000) + 0x02000000 + ((GPIOB_ODR_Addr & 0x00FFFFFF) << 5) + (bitnum << 2))
分析
-
//用于保留最高位,舍去其他位 //片上SRAM位带区地址始于 0x20000000 //片上外设位带区地址始于 0x40000000 //测试:(GPIOB_ODR_Addr & 0xF0000000) = (0X40010C0C & 0xF0000000) = 0X40000000 (GPIOB_ODR_Addr & 0xF0000000)
-
//片上SRAM和外设起始地址 + 0x02000000 得到对应位带别名区起始地址 + 0x02000000
-
//舍去最高两位,保留剩余六位 //测试:(GPIOB_ODR_Addr & 0x00FFFFFF) = (0X40010C0C & 0x00FFFFFF) = 0X10C0C ((GPIOB_ODR_Addr & 0x00FFFFFF)
-
//2 进制左移 5 位等于乘以 5 的 2 次方,即为:x 32 << 5
-
//位带别名区4字节表示位带区的1位,所以 x 4 (bitnum << 2)
测试记录
APB2PERIPH_BASE = 0x40000000 + 0x10000 = 0X40010000
GPIOB_BASE = APB2PERIPH_BASE + 0x0c00 = 0X40010C00
GPIOB_ODR_Addr = GPIOB_BASE + 0x0c = 0X40010C0C
(GPIOB_ODR_Addr & 0xF0000000) = (0X40010C0C & 0xF0000000) = 0X40000000
//0X10C0C 转10进制为 68620
(GPIOB_ODR_Addr & 0x00FFFFFF) = (0X40010C0C & 0x00FFFFFF) = 0X10C0C
//68620 * 32 = 2195840; 2195840 转16进制为 0X218180
((GPIOB_ODR_Addr & 0x00FFFFFF) << 5) = ((0X40010C0C & 0x00FFFFFF) << 5) = 0X218180
参考图