位带操作
类似于51单片机中是sbit关键字,STM32访问位带别名区实现sbit的功能。
外设外带区大小为1M,这1M的容量包含了片上所有的寄存器,然后经过每一位经过膨胀成32位的字后这1M的地址空间膨胀变为32M的地址空间,这32M的地址空间在f103系列单片机属于保留地址,不会与片上的其他外设相重合,因此STM32上的全部外设都可以通过位带别名区来访问。
位带区地址与位带别名区地址的相互转换
我们已知,外设位带区1M的地址范围0X4000 0000–0X4010 0000,SRAM的外设位带区的1M地址范围是0X2000 0000–0X2010 0000。外设位带别名区的32M地址范围为0X4003 0000–0X4FFF FFFF,SRA位带别名区32M地址范围是0X200 30000–0X2FFF FFFF,且位带别名区的地址由位带区地址膨胀得来,因此存在一个转换关系。
记A为在外设位带区的某个比特,序号为n,则对应的外设别名区地址AlisAddr = 0X4200 0000 + (A - 0X4000 0000)32 + 4n
同样SRAM位带别名区与位带区地址的对应关系是:
AlisAddr = 0X2200 0000 + (A - 0X2000 0000)32 + 4n
公式解释:第一项是基址,小括号里面表示该比特前面有多少字节,一个字节有八位,所以乘以8,一个位膨胀成32个位,相当于一个位变成32/8 =4个字节,所以乘以4,n表示某位表示的序号,膨胀后也是4个字节,故乘以4。
tip:位带别名区可以访问位带区的某一个位,即可以通过外设位带别名区的地址访问某一个外设寄存器的某一个位。
统一公式:
把位带地址+位序号转换成位带别名区地址的宏
define BITBAND(add, bitnum) ((addr & 0xf0000000) + 0x02000000)+((addr & 0x00ffffff)<<5)+(bitnum)<<2
((addr & 0xf0000000)判断是外设位带区还是SRAM位带区,然后加上0x02000000即位带别名区的起始地址。addr & 0x00ffffff用来实现(A - 0X4000 0000)或(A - 0X2000 0000)的结果,外设最高地址是0x20000000,SRAM同理。左移五位即乘以32,n左移2位相当于乘以4。
通过控制寄存器的每一位,把32玩成51不再是幻想。
32寄存器太多,这样反而不现实了昂。