【初入电子坑之stm32篇(三)】位带操作

前言

由寄存器编程我们可以知道,很多时候我们需要修改的值的其实只有单独的某一位,那在stm32中怎么实现对单独一个位的操作呢?位带操作!

问题讨论范围

  • 什么是位带操作?
  • 位带操作有什么意义?
  • 怎么进行位带操作?

正文

位带操作

位带操作(也叫位段操作),可以理解为允许进行位操作的地带。

由于底层电路设计的原因,stm32单片机单次可操作的存储单元是4Byte,所以想要进行位操作的话从逻辑上是行不通的。但是ST公司考虑到了这种用户需求,在内存地址映射表中专门留出了一块地址。这块地址就被称为了位带别名区

位带别名区 的作用很简单,它其实就是在内存映射表的基础上做了二次映射。

既然你stm32单次操作最少只能控制4个Byte,那么我们把1Bit当4Byte使用,其中只有最低位的1个Bit操作有效不就可以了嘛。

但不是所有内存地址都支持位带操作的,所以支持位带操作的内存地址也就被称为了位带区

位带示意图

上图就是支持位带操作的区域示意图,蓝色和紫色的箭头指向就是位带区上的每一位进行二次映射后的内存地址区域。

我们对比下外设的地址映射表:

内存起始位置

内存末位置

可以看到所有片上外设的地址都包含在内了。所以我们操作外设的时候都可以进行位带操作。

位带操作的意义

一开始看位带操作的时候,有种鸡肋的感觉。

原因有二:

  • 腾出远多于实际需要操作的外设、SRAM内存,只为了可以单独操作极少部分内存的一个bit,这值得吗?
  • 官方既然给出了固件库库函数可以对单独的某一位进行修改,为什么又还需要用位带操作?

在查阅了很多资料后,得出了一个勉强可以说服自己的答案:

固件库的本质是调用已经封装好的函数,而函数的运行效率比寄存器操作要慢。

而直接使用寄存器操作的话,会有些不便、容易出错,所以位带操作就是这两者中的折中方案了。

我也不知道这个答案对不对,为了可能需要节省的性能而专门腾出辣么多内存干这件事真的值得吗?也许是我太菜还没不能理解它的珍贵之处吧。


2021年4月22日更新:

经网友提醒,之前说腾出辣么多内存的说法有失严谨,因为内存地址映射表中的内存不是实际的物理内存,而是CPU能控制的内存范围。从汇编的学习中,我们可以知道CPU可以控制的内存范围是有限的,所以我还是不能理解腾出了辣么多内存的意义。。。有那么多内存预算干点别的不香嘛。。。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2022 逸非安逸
  • Visitors: | Views:

请我喝杯咖啡吧~