历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2021年09月30日 | STM32 进阶教程 8 - 位带操作

2021-09-30 来源:eefocus

前言


有过51单片机开发经历的朋友应该都对51的IO口或一些特殊寄存器可以直接按位操作的方式不陌生吧,那么在stm32中有没有类似的操作呢,答案是肯定的,本节将给大家介绍如何在STM32中实现位带操作。


在《ARM Cortex-M3权为指南》中的第87页对位带操作如下描述:


位带操作


支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在 CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。

位带区与位带别名区的膨胀关系图 A

位带区与位带别名区的膨胀对应关系图 B


示例详解


基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。

本示例所用的最小系统板原理图:

关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:

系统时钟树

定时器配置

引脚配置

中断配置(保持默认)

工程代码

 


本节以stm32f103芯片为例,关于位带操作的基本说明/举例(可参看《ARM Cortex-M3权为指南》):

位带操作的概念其实30年前就有了,那还是8051 单片机开创的先河。如今,CM3 将此能力进化,这里的位带操作是 8051 位寻址区的威力大幅加强版。


CM3 使用如下术语来表示位带存储的相关地址


z 位带区: 支持位带操作的地址区


z 位带别名: 对别名地址的访问最终作用到位带区的访问上(注意:这中途有一个对


地址映射过程)


在位带区中,每个比特都映射到别名地址区的一个字——这是只有 LSB 有效的字。当一个别名地址被访问时,会先把该地址变换成位带地址。对于读操作,读取位带地址中的一个字,再把需要的位右移到 LSB,并把 LSB 返回。对于写操作,把需要写的位左移至对应的位序号处,然后执行一个原子的“读-改-写”过程。


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


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


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


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


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


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


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


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


对于 SRAM 内存区,位带别名的重映射如表 5.2 所示:


表 5.2 SRAM 区中的位带地址映射


位带区         等效的别名地址


0x20000000.0 0x22000000.0


0x20000000.1 0x22000004.0


0x20000000.2 0x22000008.0



0x20000000.31 0x2200007C.0


0x20000004.0 0x22000080.0


0x20000004.1 0x22000084.0


0x20000004.2 0x22000088.0



0x200FFFFC.31 0x23FFFFFC.0


对于片上外设,映射关系如下表所示:


表 5.3 SRAM 区中的位带地址映射


位带区         等效的别名地址


0x40000000.0 0x42000000.0


0x40000000.1 0x42000004.0


0x40000000.2 0x42000008.0



0x40000000.31 0x4200007C.0


0x40000004.0 0x42000080.0


0x40000004.1 0x42000084.0


0x40000004.2 0x42000088.0



0x400FFFFC.31 0x43FFFFFC.0


在main.c中加入如下图所示代码:

编译工程,下载程序看效果,可以看到LED(PC13引脚驱动)亮500ms灭500ms交替进行,查看PC13引脚上的波形:

通过上面的实例,我们成功地通过使用位带别名地址实现对寄存器中位的操作程,成功控制PC13引脚来控制LED的亮灭。是不是很简单,对于在SRAMSRAM 内存区,通过位带别名同样可以轻易实现对位操作,有兴趣的同学可以自行实险一下。

推荐阅读

史海拾趣

ENSIGN公司的发展小趣事

ENSIGN在资本市场上的表现也备受关注。近年来,ENSIGN的股价稳步上涨,市值不断扩大。多家投资机构对ENSIGN的前景表示乐观,并上调了其目标股价。ENSIGN凭借其稳健的财务表现、强大的研发能力和广阔的市场前景,吸引了众多投资者的关注。

这些故事概述了ENSIGN在电子行业中的发展历程和多元化战略。通过不断创新和拓展业务领域,ENSIGN逐渐成为了电子行业中备受瞩目的企业之一。

Everspin Technologies公司的发展小趣事

2010年,Everspin在北京召开了一场盛大的媒体发布会,正式推出了其16MB MRAM存储器产品。这款产品的推出标志着Everspin在MRAM技术领域的领先地位。该产品在市场上受到了广泛关注,不仅因其存储容量大,还因其独特的数据持久性和非易失性特性,使得关键任务数据即使在断电的情况下也能得到保护。

维峰电子(WCON)公司的发展小趣事

质量是企业的生命线。维峰电子始终将质量管理作为公司发展的重中之重。公司建立了完善的质量管理体系,从原材料采购、生产过程到产品检验等各个环节都进行严格把控。同时,公司还引入了先进的检测设备和技术,确保产品的质量和性能达到最高标准。这些措施的实施不仅提升了产品的竞争力,也赢得了客户的信任和好评。

Cramer公司的发展小趣事

随着5G技术的普及,Cramer公司紧跟时代潮流,开始研发5G通信设备。他们与多家通信巨头合作,共同推进5G技术的发展。经过不懈的努力,Cramer公司成功研发出了一款高性能的5G路由器。这款产品的推出,使得Cramer公司在5G市场上取得了先机,并为其带来了丰厚的回报。

Bombardier Inc公司的发展小趣事

进入20世纪中叶,庞巴迪公司在航空领域的业务持续扩大。其生产的PBV-1A水上巡逻机,不仅装备了加拿大空军,还出口到美国海军。这一时期,庞巴迪在航空电子系统的集成和创新上取得了重要突破,提高了飞机的性能和安全性。这些技术进步使得庞巴迪在全球航空领域树立了良好的声誉。

FUJIKURA公司的发展小趣事

随着全球航空市场的不断变化,庞巴迪公司在商用航空领域也取得了显著成就。其生产的CRJ系列区域喷气客机和Q系列涡桨飞机在全球范围内广受欢迎。这些飞机配备了先进的电子设备和系统,提供了更高的安全性和舒适性。庞巴迪还推出了C系列单通道中距客机,该机型以其环保、经济和人性化的设计赢得了市场的广泛认可。

问答坊 | AI 解惑

基于CygnalF040的RTOS51的研究与开发

0.引 言 目前,我国对于大部分供电电力设备的监控和管理上基本还停留在人工巡查这种比较原始的管理方式下(例如铁路道口的信号电源),不但管理效率低下,而且供电质量和水平都得不到有效的保证。本文以实时操作系统small RTOS51为基础,主要探 ...…

查看全部问答>

扬声器阻抗特性测试

为什么,我在测试测量时从低频到高频逐渐改变信号发生器输出信号频率测试扬声器阻抗特性时,发现在20-20khz电压值随频率增大而增大,不知道是方法不对还是具体操作有误…

查看全部问答>

【藏书阁】电路原理 (上、下册)江辑光

目录: 上册: 第1章 电路元件的电路定律 1.1 电路和电路模型 1.2 电流、电压、电动势 1.3 电路元件的功率 1.4 电阻元件 1.5 电感元件 1.6 电容元件 1.7 电源元件 1.8 受控电源 1.9 基尔霍夫定律 习题 第2章 简单电阻电路 ...…

查看全部问答>

偶新来的,还请各位帅哥多关照啊。

一个人在沙漠行走,终于找到一片绿洲。 纯散分。…

查看全部问答>

有关Verilog HDL 的问题

本人最近正在用VeriLog HDL语言编写一个异步FIFO,我采用的是二进制转换为格雷码来判空判满。但能力有限,两天下来都没有结果,希望得到高人指点。…

查看全部问答>

哈哈,超级高兴,老大表扬我喽!!

近来公司网络很不稳定,时不时出现所有人不能上网的现象,我在其中一台电脑上装上了赛门铁克的网络安全特警NIS2007,马上2007就发现了一个ARP病毒,我把所有的电脑都装上了NIS2007,老大很高兴,当即批准购买8套正版NIS2007。…

查看全部问答>

PWM Buck circuit 电容 电压求解

本帖最后由 dontium 于 2015-1-23 13:21 编辑 问题描述写在附件的图片上。望高人指点迷津。谢谢! 实际测量一个样品,Vp=2.84V。 [ 本帖最后由 y651848590 于 2011-7-14 21:42 编辑 ] …

查看全部问答>

电动消防车

本帖最后由 paulhyde 于 2014-9-15 04:05 编辑 2012年大学生电子设计竞赛黑龙江赛区TI杯竞赛题A题: 电动消防车(本科)一、任务设计制作一个电动消防车,能到消防场地任意地点进行灭火作业。以蜡烛模拟火源,火源随机分布在场地中,消防场地如图1 ...…

查看全部问答>

基于msp430f149移位寄存器595

#ifndef __YIWEI595_H__#define __YIWEI595_H__#include \"msp430x14x.h\"#include \"delay.h\"   #define  LCK_OUT  P3DIR|=BIT3 #define  LCK_IN  P3DIR&=~BIT3 #define  LCK_H  P3OUT|=BIT3 #def ...…

查看全部问答>