STM32有两个位带别名区,大小都为32MB,是位带区的32位,即位带区的每1位对应位带别名区的4字节。在位带别名区可以直接读写对应位带区的某一个位。SRAM位带区起始地址为0x20000000,位带别名区起始地址为0x22000000;外设位带区起始地址为0x40000000,位带别名区起始地址为0x42000000.
一.位带区与位带别名区的地址转换
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr &0x00FFFFFF)<<5)+(bitnum<<2))
addr是SRAM位带地址,bitnum是一个字节的第几位。上式先将位带区的首地址转换到别名区的首地址(addr & 0xF0000000)+0x02000000,由于 1位对应4字节,所以一字节对应32字节,先找到对应的字节(addr &0x00FFFFFF)<<5,然后找到对应位bitnum<<2。
二.位带别名区的操作
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))// 把一个地址转换成一个指针
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))// 把位带别名区地址转换成指针
首先用BITBAND(addr, bitnum)找到寄存器位对应的别名区地址,然后MEM_ADDR(addr) 把这个转化好的地址转化为指针,最后直接可以对BIT_ADDR(addr, bitnum)进行读取操作,比如BIT_ADDR(GPIOC_ODR_Addr,1)= 1对PC1赋值