0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32位段的定义及其操作方法详解

冬至配饺子 来源:知晓编程 作者:Firefly 2023-07-11 16:40 次阅读

1 定义

首先需要明确下,位段,位带和别名区这三个名词

名词定义

位段

STM32用户参考手册使用的名字

位带

CortexM3参考手册使用的

别名区

地址总线上用来位访问地址区域,

所以说,位段和位带是一个意思,是不同手册的不同叫法。

由上述的名词解释得知,位带功能并不是STM32独有的,是CortexM3的功能(CortexM4也有这样的功能)。MCS51有位操作,以一位(bit)为数据对象的操作,MCS51可以简单的将P1口的第2位独立操作:P1.2=0;P1.2=1 ;这样就把P1口的第三个脚(bit2)置0置1。而STM32的位段、位带别名区最重要的就为了实现这样的功能。

2 位带操作

2.1 范围

位带是有范围的,并不是CortexM3全部地址空间都支持的。在 CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。

支持位带操作的两个内存区的范围是:

0x2000_0000‐0x200F_FFFF (SRAM 区中最低1MB区域)

0x4000_0000‐0x400F_FFFF (片上外设区中的最低 1MB)

2.2 位带操作

对 SRAM 位带区的某个比特,记该比特所在字节的地址为A,位序号为 n (0<=n<=7),则它在别名区的地址为:

AliasAddr0x22000000 + ((A‐0x20000000)*8+n)*4 =0x22000000 + (A‐0x20000000)*32 + n*4

对于片上外设位带区的某个比特,记该比特所在字节的地址为A,位序号为 n (0<=n<=7),则该比特在别名区的地址为:

AliasAddr0x42000000 + ((A‐0x40000000)*8+n)*4 = 0x42000000 + (A‐0x40000000)*32 + n*4

上式中,“*4”表示一个字为 4 个字节,“*8”表示一个字节中有 8 个比特。

图片

图片

2.3代码实现

把“位带地址+位序号”转换别名地址宏为:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000 + ((addr &0xFF FFF)< < 5) + (bitnum<  < 2))

把该地址转换成一个指针:

#define MEM_ADDR(addr, bitnum) *((volatile unsigned long *)((addr & 0xF0000000)+0x2000000 + ((addr &0xFF FFF)< < 5) + (bitnum< < 2)))

其中

addr的取值范围:

0x2000_0000‐0x200F_FFFF

0x4000_0000‐0x400F_FFFF

注意:addr取值要32位对齐

bitnum的取值范围:

0-31

解析:

(addr & 0xf0000000) + 0x02000000:

区分SRAM还是外设,如果是外设,结果为4,再加0x2000000就等于0x4200000,0x42000000就是外设别名位带区。如果是SRAM,结果为2,再加上0x2000000就等于0x22000000,0x22000000就是SRAM别名位带区。

addr & 0x00ffffff:

屏蔽了最高2位,相当于减去0x20000000或者0x40000000。因为位带区的有效范围是1M,即0x100000,这样子就做到了低6位有效。

<< 5:

等价于乘以32

<< 2:

等价于乘以4

特别提醒

当你使用位带功能时,要访问的变量必须用 volatile 来定义。因为 C 编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑。

3 位段的优点

最容易想到的就是通过 GPIO 的管脚来单独控制每盏 LED 的点亮与熄灭。另一方面,也对操作串行接口器件提供了很大的方便(典型如 74HC165,CD4094)。位带操作可以把代码缩小, 速度更快,效率更高,更安全。总之位带操作对于硬件 I/O 密集型的底层程序最有用处了

位带操作还能用来化简跳转的判断。

当跳转依据是某个位时,以前必须这样做

1、读取整个寄存器

2、掩蔽不需要的位

3、比较并跳转

使用位带操作后

1、从未带别名区读取状态位

2、比较并跳转

图片

当然,对于写入操作也从4步精简到3步

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7423

    浏览量

    163485
  • STM32
    +关注

    关注

    2264

    文章

    10852

    浏览量

    354179
  • GPIO
    +关注

    关注

    16

    文章

    1187

    浏览量

    51807
  • MCS51单片机
    +关注

    关注

    0

    文章

    24

    浏览量

    14676
  • SRAM控制器
    +关注

    关注

    0

    文章

    11

    浏览量

    5885
收藏 人收藏

    评论

    相关推荐

    STM32学习笔记-GPIO做为输出时操作方法

    操作方法。GPIOx_ODR: 端口输出数据寄存器,它的31:16保留不用,15:0对应x的相应引脚,他只能以16方式操作。GPIOx_BSRR:端口
    发表于 10-07 15:51

    AVR单片机的端口操作方法

    一、常规方法AVR单片机的各类教材或编程应用参考资料,对介绍的端口操作方法不外乎宏定义及整体和某个常量相或、相与来实现某一单个位状态的改变。如:PORT&=-(1《1);等价于:PO
    发表于 07-13 08:11

    AVR单片机的端口操作方法解析

    的端口操作方法不外乎宏定义及整体和某个常量相或、相与来实现某一单个位状态的改变。如:PORT&=-(1《1);等价于:PORTB&=oxfd;作用是PB1清零而其余不变。与之类似的
    发表于 11-23 08:35

    C语言的操作方法

    使用 C语言对寄存器赋值时,我们常常要求只修改该寄存器的某几位的值,且其它的寄存器不变,这个时候我们就需要用到 C 语言的操作方法了。1. 把变量的某位清零此处我们以变量 a代表寄存器,并假设
    发表于 11-26 08:00

    硬件带bitband操作方法有哪些?

    硬件操作优势的是什么?硬件带bitband操作方法有哪些?
    发表于 01-17 06:58

    GPIO引脚操作方法概述

    :原则 - 不能影响到其他三、STM32F103的GPIO操作方法1、看原理图确定引脚2、再看芯片手册(1)时钟使能(2)设置GPIOB0为GPIO、用作输出(3)怎么设置GPIOB0的输出电平?四、
    发表于 01-20 07:38

    WinCE文件目录定制及内存调整的操作方法

    本文介绍了WinCE文件目录定制及内存调整的操作方法。WinCE的文件目录结构以及文件的位置都是在DAT文件中定义的。所有的da
    发表于 10-18 10:09 949次阅读

    新A8L加装倒车影像和激活的操作方法详解

    新A8L加装倒车影像和激活的操作方法详解,感兴趣的小伙伴们可以看看。
    发表于 08-03 16:15 36次下载

    LED光电参数定义及其详解

    LED光电参数定义及其详解
    发表于 02-08 00:50 21次下载

    详细图文剖析STM32单片机串口一键下载电路与操作方法

    在此介绍STM32单片机串口一键下载电路与操作方法详解
    的头像 发表于 12-31 23:07 4.7w次阅读
    详细图文剖析<b class='flag-5'>STM32</b>单片机串口一键下载电路与<b class='flag-5'>操作方法</b>

    寄存器操作方法_对寄存器操作的通用方法总结

    本文主要详解寄存器操作方法以及对寄存器操作的通用方法总结,具体的跟随小编来了解一下。
    的头像 发表于 05-22 15:53 2.2w次阅读

    电子测力计的操作方法

    电子测力计正确操作方法
    发表于 04-17 15:57 2540次阅读

    STM32操作

    操作:将一个重新定义一个字的带别名来操作
    发表于 11-26 18:06 12次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>位</b>带<b class='flag-5'>操作</b>

    AD18操作方法

    AD18操作方法
    发表于 03-28 15:04 0次下载

    STM32F407入门开发: 操作

    STM32F407的操作可以实现类似51单片机中寄存器的操作方法操作GPIO口代码简洁方便。 关于
    的头像 发表于 05-28 13:50 3555次阅读
    <b class='flag-5'>STM32</b>F407入门开发: <b class='flag-5'>位</b>带<b class='flag-5'>操作</b>