本文将从下面几个问题展开进行介绍:
什么是位带操作、什么是位带区、什么是位带别名区、怎么使用位带操作、为什么要使用位带操作(或者说位带操作有什么优点)、什么时候使用位带操作。
一、什么是位带操作?
使用过51单片机的小伙伴应该有过类似的操作,想要点亮一个LED灯只要一个P2^1 = 0;就可以实现了,非常方便,其实,所谓的位带操作就等价于51单片机的位操作,但是在STM32里面,内核的最小寻址单位是字节,一个字节里面有8bit,那么,STM32又是怎么实现位操作的?要搞清楚这个问题,就要先弄明白下面两个问题,什么是位带区、什么是位带别名区。
二、什么是位带区
介绍位带区之前,我们先来看一下Cortex-M内核里面寻址空间是怎么分配的
这是一张Cortex-M内核寻址空间映射图,来自《Cortex M3和M4权威指南》
我们可以看到图中有两个位带区,分别是SRAM区里的0X20000000-0X200FFFFF地址段和片内外设区里的0X40000000-0X400FFFFF地址段(图中标号①处),它们的地址空间大小都是1M字节,在SRAM和外设地址段内的这1M大小的空间就是位带区,说白了就是支持位带操作的区域就是位带区。我们上面已经说过了,内核的最小寻址单位是字节,那么怎么将寻址单位缩小到bit?要弄明白这个问题,那就要先弄明白什么是位带别名区了。
三、什么是位带别名区
从位带别名区名字上理解,感觉它像是别人的替身,实际使用上它就是别人的替身(电影里出名的武打明星都有自己的替身,STM32这么出名,肯定也有自己的替身啦,危险的操作都让替身去做,自己躺着就行了),位带别名区就是为位带区服务的,对位带别名区的操作最终都会反映在位带区上,我们操作位带别名区的时候就等价于在操作位带区地址,那么位带别名区与位带区又是什么样的关联关系呢?
从上面映射图上可以看到,SRAM区里的0X22000000-0X23FFFFFF地址段和外设区里0X42000000-0X43FFFFFF地址段都是位带别名区,两个别名区空间大小都是32M。那么,这32M的位带别名区地址空间是怎么与1M的位带区地址空间对应起来的呢?其实,工程师们想出了一个很好的办法,地址映射,将1M字节里面的每一个bit映射到32M字节里面去,那么怎么映射呢?看到这里可能有些小伙伴就亿脸懵逼了,懵逼