历史上的今天

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

正在发生

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

发布者:创意小巨人 来源: eefocus关键字:STM32  进阶教程  位带操作 手机看文章 扫描二维码
随时随地手机看文章

前言


有过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 内存区,通过位带别名同样可以轻易实现对位操作,有兴趣的同学可以自行实险一下。

关键字:STM32  进阶教程  位带操作 引用地址:STM32 进阶教程 8 - 位带操作

上一篇:STM32位带操作的详解
下一篇:STM32F103固件库编程(2)—位带操作

推荐阅读

国内服务机器人、教育机器人以及工业机器人并驾齐驱,智能化发展正普遍落地于各行各业。其中,最受民众关注的一类机器人产业便是教育机器人,而教育类机器人对孩子的健康成长将会起着积极地引导启蒙作用,教育机器人的发展现状与行业趋势同样是每个家庭都关心的问题。 目前,在市场上,功能低端的学习机每年都还有几百万台的出产量。面对如此庞大的一...
是德科技公司日前宣布与高通公司(Qualcomm Incorporated)旗下全资子公司高通科技扩大合作,协力加速 DSS(动态频谱共享)技术的商用化进程,支持移动运营商经济高效地快速推出 5G 新空口(NR)业务。是德科技是一家领先的技术公司,致力于帮助企业、服务提供商和政府客户加速创新,创造一个安全互联的世界。 在双方合作下,将会使用是德科技的 5G 网络...
  斯帝尔机器人科技自2005年成立以来就专注柔性打磨机器人的核心技术,定位于“柔性技术专家”,集中于打磨机器人、机器人打磨力控系统、视觉系统、打磨工艺等技术的研究,斯帝尔完整的产品链为柔性制造提供了最佳的解决方案。   由于柔性打磨机器人不同于传统机器人,不是通过点到点的线性轨迹方式运作,而是通过机器人的感知技术实现柔性打磨,而...
据 MacRumors 报道,DisplayMate 今天授予了苹果 iPhone 13 Pro Max“最佳智能手机显示屏奖”。  iPhone 13 Pro Max 获得了 DisplayMate 有史以来最高的显示性能等级 A+,并达到或刷新了 12 项智能手机显示性能记录。  IT之家了解到,苹果表示,iPhone 13 Pro 和 iPhone 13 Pro Max 采用迄今最先进的 iPhone 显示屏,支...

史海拾趣

问答坊 | AI 解惑

2008 HELLODSP 会员"有奖"调查

各位HELLODSP会员: 感谢您对HELLODSP的支持!为了能够使HELLODSP更好的为您服务,能让我们听到您的心声,特举办“2008 HELLODSP 会员有奖调查”活动,可能需要占用您五分钟时间。作为对于大家参与的回报,我们设立了如下奖项: 一等奖 2名 HELLO ...…

查看全部问答∨

SDRAM问题

FPGA控制SDRAM读写,先写两个数据到SDRAM的两个存储单元,再读出第一次写进去的数据。 请问,SDRAM加电后的第一步是不是必须需要初始化,设置模式寄存器,然后才能进行读写操作???…

查看全部问答∨

如何在VIVI上扩展USB下载功能,1000分相送,谢谢!

需要在VIVI上扩展USB下载功能,希望大家指点 也可通过EMAIL跟我联系,谢谢!…

查看全部问答∨

使用Proteus仿真AT89C51的串口时,发送数据正常,可是怎么也接收不到数据吗,怎么回事!

我使用串口虚拟软件虚拟了一对物理上连通的串口COM3, COM4,在Proteus里面的COMPIM里面使用的是COM3,在串口调试助手里面使用的是COM4.当单片机给PC的COM4发送数据时,串口调试助手上面正常接收并显示到接收文本框里。 但是,当使用串口调试助手向P ...…

查看全部问答∨

在UCOSII里,中断里能否改变任务优先级

在UCOSII里,中断里能否改变任务优先级…

查看全部问答∨

单片机产生正弦信号

请问下大家,利用单片机通过DA能产生一个频率在1KHZ-4KHZ的可程控正弦信号吗?要于何产生?  给点建议,  还有别的法字没?  (不考滤用DDS芯片)…

查看全部问答∨

STM32时钟晶体

                                 STM32的RTC外部时钟晶体必须用6P谐振电容的晶体,否则容易出现不起振,6P晶体1.4元一个,还不好买,我是这样做的: ...…

查看全部问答∨

如何计算430执行代码的时间?

用汇编语言写代码时,可以通过将汇编指令的指令周期相加得到一段代码执行的时间。那如果用C语言写的代码,譬如调用一个子函数,我们有什么方法可以确定它的执行时间吗?请高手赐教!…

查看全部问答∨

求高手 开发恒温箱 控制

要求有实践开发经验 人在北京QQ:2279325463tel:18201633625…

查看全部问答∨

msp430g2553 使用内部的adc10采集一正弦交流电压信号(程序) 望大侠指点!!!

需要采集的交流电压信号(A1通道)大约是:0.5v~2.5v       VR+ = VCC and VR- = VSS   //                MSP430G2553   //     ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved