当前位置: 首页 > >

stm32之位带操作

发布时间:

stm32相对于8位微控制CPU来说实在强大的不得了,依稀记得51控制I/O空的时候是:sbit LED1 = P0^0;然而我们在32却没有想“sbit”类似的关键字进行I/O的某位进行操作。于是引入了“位带操作的概念”,什么事位带操作???标准的定义是:通过访问位带别名区来实现,即通过将每个比特位膨胀成一个32位字,当访问这些字的时候就达到了访问“位”的目的,这就是位带操作!!!是不是很抽象?首先我们先看看寄存器的图:



红色箭头位置表示:stm32支持位带操作的区域是 SRAM 区的最低 1MB 范围(APB1/2 ,AHB外设)和片内外设区的最低 1MB范围。


我们以点亮一盏灯LED为例,则查到寄存器,得知是GPIOC,该地址C口的输出寄存器地址是0x4001100c,属于片内外区的范围(0x40000000~0x400ffffff),一个GPIO端口32为,如下图所示:




上述所知,LED的输出控制寄存器的地址是0x4001100c ,假设我们要访问第2个LED,则是GPIOC^1引脚,也就是GPIOC bit[1],


stm32访问的最小单元是地址,所以无发访问到GPIOC bit[1],这个时候,我们要通过位带访问别名区来控制GPIOC bit[1],,也就是起始地为


0x42000000 大小为32Mb的单元。这时我们在想想概念,通过访问位带别名区来实现,即通过将每个比特位膨胀成一个32位字,当访问这


? ?些字的时候就达到了访问“位”的目的。所以我们理解为把地址为0x4001100c的8个bit映射到地址为0x42000000 大小为32Mb的单元。并且每个bit扩展为32位,如图所示:






总结:


1.为什没不可以直接访问位?


答:访问的最小单元是“字节”,而不是位,其中也没有“sbit”类似的关键字,无法访问到具体的地址里的某个BIT


2.怎么解决?


说白了,就是把某危楼(片内外设区)的一家(一个地址)8口人(8bit)搬到一个另地方(位带别名区),并且,每个人(每一位bit)住上了更大的房子(变成32bit)



友情链接: