||
对位带别名区的控制其实目的就是能实现对内存单元按位的计算,就像51单片机一样,可以按位运算,而stm32也是从51继承过来的。
其实位带操作很简单,就是一个简单的映射问题:
位带区 ---------------> 位带别名区
位带区有两种情况:一种是内部的外设(0x20000000开始),一种是RAM(0x40000000开始),它们的带宽都分别为1M。要想对位带区的进行位的控制,可进行对位带别名区的控制。地址计算公式:
AliaAddr(addr,bitnum) = (addr&0xF0000000) + 0x2000000 + (addr&0xFFFFF)<<5 + bitnum<<2
简单的例子:GPIOA 第0位的映射:GPIOA_BASE 为GPIOA口的基地址,GPIOA_BASE + 12 为GPIOA 的寄存器GPIOA_ODR的地址。计算为:AliaAddr(GPIOA_BASE+12 , 0)
而对转换后的地址进行操作就可以达到对位带区的控制。我当初的疑问是为什么不对位带区地址进行直接操作,原因是STM32对内存的控制读写数据是按字节来算的,不能对一位进行直接操作。