MCU_STM32的位带操作 — bit banding[通俗易懂]

MCU_STM32的位带操作 — bit banding[通俗易懂]位带操作STM32芯片除了通用的寄存器访问,还有一个比较有意思的位带操作。这个位带的意思,就是每个比特(bit)位膨胀成一个32位的字(word),当访问这些字的时候就达到了访问“位”的目的,这就是位带操作!位带操作一个典型的特点,就是把1个位映射到32位,在程序处理中方便操作具体位,典型的如RCC寄存器,需要逐位操作的地方比较多,直接寄存器操作的话,程序的可读性不强;位带操作的缺…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

位带操作

STM32芯片除了通用的寄存器访问,还有一个比较有意思的位带操作。

这个位带的意思,就是每个比特(bit)位膨胀成一个32位的字(word),当访问这些字的时候就达到了访问“位”的目的,这就是位带操作!

位带操作一个典型的特点,就是把1个位映射到32位,在程序处理中方便操作具体位,典型的如RCC寄存器,需要逐位操作的地方比较多,直接寄存器操作的话,程序的可读性不强;

位带操作的缺点也很明显,就是在时间上开销也要稍大一些,因为不可避免要对位带映射进行计算。

Cortex-M4的手册中有这样一个例子:

参考地址:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337h/Behcjiic.html

 

MCU_STM32的位带操作 -- bit banding[通俗易懂]

原文的映射解释是这样的,

The alias word at 0x23FFFFE0 maps to bit [0] of the bit-band byte at 0x200FFFFF: 0x23FFFFE0 = 0x22000000 + (0xFFFFF*32) + 0*4.

The alias word at 0x23FFFFFC maps to bit [7] of the bit-band byte at 0x200FFFFF: 0x23FFFFFC = 0x22000000 + (0xFFFFF*32) + 7*4.

The alias word at 0x22000000 maps to bit [0] of the bit-band byte at : 0x22000000 = 0x22000000 + (0*32) + 0*4.

The alias word at 0x2200001C maps to bit [7] of the bit-band byte at 0x20000000: 0x2200001C = 0x22000000 + (0*32) + 7*4.

解释一下,即:

0x200FFFFF的bit[0] 位带字节映射计算: = 0x22000000 + (0xFFFFF*32) + 0*4 = 0x23FFFFE0
0x200FFFFF的bit[7] 位带字节映射计算: = 0x22000000 + (0xFFFFF*32) + 7*4 = 0x23FFFFFC
0x20000000的bit[0] 位带字节映射计算: = 0x22000000 + (0x0*32) + 0*4 = 0x22000000
0x20000000的bit[7] 位带字节映射计算: = 0x22000000 + (0x0*32) + 7*4 = 0x2200001C

关于程序

我找了个常用的具体的例子,比如这个函数,在STM32F407中是对RCC_CR中的第19位CSSON进行操作,程序如下,一目了然,

void HAL_RCC_EnableCSS(void) { *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; }

理解:

首先有关RCC_CR_CSSON_BB的定义是这样的,

#define PERIPH_BB_BASE 0x42000000UL
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL)
#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL)
#define RCC_OFFSET (RCC_BASE – PERIPH_BASE) //计算结果也就是 = 0x00020000UL + 0x3800UL
#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U)
#define RCC_CSSON_BIT_NUMBER 0x13U
#define RCC_CR_CSSON_BB (PERIPH_BB_BASE+(RCC_CR_OFFSET * 32U)+(RCC_CSSON_BIT_NUMBER * 4U))

这些数据去哪里找

这里,PERIPH_BB_BASE的映射地址是0x42000000,前面例子中的SRAM映射地址是0x22000000,具体可参考STM32的编程参考手册PM0214,如下图

MCU_STM32的位带操作 -- bit banding[通俗易懂]

 

其次,在STM32F405xx/STM32F407xx的datasheet表10中,有说明RCC寄存器地址为0x40023800-0x40023BFF,

所以,RCC_CR_CSSON_BB 的计算就是0x42000000UL + 0x00023800*32 + 0x13*4

 

参考资料

STM32F405/407 datasheet下载地址:

https://www.st.com/resource/en/datasheet/stm32f405og.pdf

STM32F4编程手册(STM32 Cortex®-M4 MCUs and MPUs programming manual)下载地址:

https://www.st.com/content/ccc/resource/technical/document/programming_manual/6c/3a/cb/e7/e4/ea/44/9b/DM00046982.pdf/files/DM00046982.pdf/jcr:content/translations/en.DM00046982.pdf

Cortex-M3 Technical Reference Manual (Cortex-M3的手册)下载地址:

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337e/DDI0337E_cortex_m3_r1p1_trm.pdf

Cortex-M4 Technical Reference Manual (Cortex-M4的手册)下载地址:

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0439b/DDI0439B_cortex_m4_r0p0_trm.pdf

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182618.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入学习Arduino u8g2 OLED库,一篇就够

    深入学习Arduino u8g2 OLED库,一篇就够1.前言    最近博主听到QQ群里面问得比较多的问题:    “博哥,有玩过OLED吗?”    “博哥,有试过在ESP8266上调成功过SSD1306吗?”    “博哥,OLED上显示天气信息怎么弄?”    …    诸如此类的问题,在博主看来,无非都是对OLED库用法的不熟悉甚至不了解。ArduinoOLED库众多,博主也曾经介绍过一款《博哥OLED系列》-玩转SSD1…

    2022年4月18日
    59
  • string类型如何转换成date类型(数据类型自动转换)

    String类型,转换Integer有两种方法:方法1:Integer.valueOf(Strings);@Testpublicvoiddemo01()throwsNumberFormatException{Stringstr="123";Integernum=Integer.valueOf(str);…

    2022年4月13日
    42
  • 独立编址,统一编址,IO端口,IO内存,冯·诺伊曼,哈佛结构

    独立编址,统一编址,IO端口,IO内存,冯·诺伊曼,哈佛结构独立编址,统一编址:I/O地址空间与内存地址空间编址方式是否统一?例如51为统一编址,I/O和存储器总计64K地址空间;X86为独立编址,分为I/O地址空间和存储器地址空间。IO空间,内存空间X86:支持内存空间,IO空间,独立编址。ARM,MIPS,PowerPC只支持内存空间,即统一编址。IO端口和IO内存:对于X86系统区别很大,例如,网卡接口,可以连接在IO的这

    2022年9月1日
    2
  • 【Custom Mutator Fuzz】Libprotobuf + LibFuzzer联合使用

    【Custom Mutator Fuzz】Libprotobuf + LibFuzzer联合使用终于到了与fuzzer结合使用的章节了,本篇文章为Libprotobufmutatorfuzzinglearning项目的第二个练习,其中有一些坑点,在本文中也进行了标注编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノPS:文章末尾有联系方式,交个朋友吧~本文链接:模糊测试系列往期回顾:【CustomMutatorFuzz】简单Protobuf使用练习【CustomMutatorFuzz】ProtocolBuffer基础(下):C++生成代.

    2022年9月13日
    4
  • pycharm安装python依赖包

    pycharm安装python依赖包参考链接

    2025年7月30日
    3
  • 什么是ARM?_arm开发板

    什么是ARM?_arm开发板原文一、ARM是什么?ARM既可以认为是一个公司的名字,也可以认为是对一类处理器的统称,还可以认为是一种技术的名字。ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,而是转让设计许可,由合作公司生产各具特色的芯片。ARM处理器的内核是统一的,由ARM公司提供,而片内部件则是多样的,由各大半导体公司设计,这使得ARM设计嵌入式系统的时候,可以基于同样的核心,使用不同的片内外设,从而具有很大的优势。二、ARM内核与架构

    2022年10月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号