当前位置: 首页 > news >正文

MCU_STM32的位带操作 -- bit banding

位带操作

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

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

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

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

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

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

 

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

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,如下图

 

其次,在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

相关文章:

  • C++的问题:变量“xxx”不是类型名
  • UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, FLOAT, DOUBLE
  • c++ 如何给数组批量赋值--利用结构定义数组以提高程序的可读性
  • c++ windows 之下 CreateThread vs CreateProcess
  • libusb源码学习:list_entry
  • libusb源码学习:几个函数加载的宏(windows)
  • MCU_如何通过硬件VID 查找生产厂家
  • MCU_WireShark USB抓包内容解析
  • MCU_Wireshark USB 抓包过滤(抓特定端口地址)
  • STM32F4xx usb库源码详解 custom HID
  • STM32F4xx usb库源码详解:HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo
  • Libuv 1.34.2 源码详解 ---- 以uvCat为例讲解
  • 步进电机的细分驱动中1-2相, W1-2相, 2W1-2相, 4W1-2相 表示什么意思?
  • MCU_关于STM32Fxxx中断EXTI产生时多次(两次)进入中断的原因
  • MCU_通过windows串口API控制RTS和DTR
  • ES6指北【2】—— 箭头函数
  • ➹使用webpack配置多页面应用(MPA)
  • 2017前端实习生面试总结
  • 345-反转字符串中的元音字母
  • create-react-app做的留言板
  • docker容器内的网络抓包
  • EventListener原理
  • Laravel5.4 Queues队列学习
  • mysql外键的使用
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Cloud Feign的两种使用姿势
  • v-if和v-for连用出现的问题
  • 工作手记之html2canvas使用概述
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 自制字幕遮挡器
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Spring Batch JSON 支持
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Micro Framework 4.2 beta 源码探析
  • .net6 webapi log4net完整配置使用流程
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ 数据结构 - C++] AVL树原理及实现
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [HDU3710]Battle over Cities
  • [I2C]I2C通信协议详解(二) --- I2C时序及规格指引
  • [java] 23种设计模式之责任链模式
  • [LeetCode] Minimum Path Sum
  • [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
  • [NOIP2011DAY1P1]铺地毯
  • [NowCoder]牛客OI周赛3