stm32之位带操作

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

stm32之位带操作_第1张图片

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

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

stm32之位带操作_第2张图片

上述所知,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位,如图所示:

stm32之位带操作_第3张图片


总结:

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

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

2.怎么解决?

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

你可能感兴趣的:(嵌入式)