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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 关于数据连接配置connectionStrings的写法[通俗易懂]

    关于数据连接配置connectionStrings的写法[通俗易懂]参考http://www.connectionstrings.com/1、SQLServer<addname="ApplicationName"connectionSt

  • goland 2021.5.1激活码【在线注册码/序列号/破解码】

    goland 2021.5.1激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • HTML5知识初级题目

    在HTML5中,onblur和onfocus是:在HTML5中,哪个元素用于组合标题元素?HTML5中不再支持下面哪个元素?HTML5中不再支持下面哪个元素?HTML5之前的HT

    2021年12月21日
  • aspectjweaver的作用[通俗易懂]

    aspectjweaver的作用[通俗易懂]aspectjweaver的作用欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown将代码片显示选择的

  • 压力单位换算bar psi_150psi等于多少bar

    压力单位换算bar psi_150psi等于多少bar压力单位MPa、Psi和bar之间换算公式1bar=10^5PaPsi为英制压力单位.“磅力每平方英寸(1bf/in2)为1psi=6894.76pa;1bar等于10的5次方=10^5pa;

  • nginx相关面试题_结构化面试题库及答案

    nginx相关面试题_结构化面试题库及答案Nginx是什么?Nginx(enginex)是一个由c语音编写的高性能的HTTP和反向代理web服务器可以用来做什么?1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。基于端口的,不同的端口基于域名的,不同域名3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多..

发表回复

您的电子邮箱地址不会被公开。

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