前言

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

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

位带操作

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

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

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

示例详解

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

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

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

    1. 系统时钟树

  1. 定时器配置

  1. 引脚配置

  1. 中断配置(保持默认)

  1. 工程代码
  1. 本节以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

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

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

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

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!

文中源码资料下载,在公众号里给十三发消息:

下载|STM32进阶教程 8

关注十三公众号

STM32 进阶教程 8 - 位带操作相关推荐

  1. 【STM32】标准库与HAL库对照学习教程六--位带操作

    [STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...

  2. STM32 进阶教程 13 – FLASH的读写操作

    前言 在嵌入式应用开发中,经常会遇到掉电后还要保存的信息,这些信息通常只能保存在外部的一些存储芯片中,如外部flash,外部EEPROM, 其实这些信息同样可以保存在STM32自带的内部flash中, ...

  3. STM32笔记 GPIO介绍及IO口操作 STM32F0 利用C语言位域实现仿位带操作

    文章目录 GPIO简介 工作方式 相关寄存器介绍 IO 操作步骤 IO口三种操作细解 附录:C语言相关 偏移地址与绝对地址 GPIO简介 GPIO:每个连接到I/O总线上的设备都有自己的I/O地址集, ...

  4. STM32(五)------GPIO位带操作

    GPIO位带操作 介绍 位带简介 外设位带区 SRAM位带区 位带区和位带别名区地址转换 GPIO 位带操作 代码解析 GPIO 寄存器映射 GPIO位操作 主函数 介绍 位带简介 位操作就是可以单独 ...

  5. STM32的位带操作

    1. 什么是位带操作? 学习 51 单片机的时候就使用过位操作,通过关键字 sbit 对单片机IO口进行位定义.但STM32没有这样的关键字,于是便要通过访问位带别名区的方式来实现.即:将每一位膨胀成 ...

  6. 我对STM32所用位带操作宏的超详细剖析、优势分析及应用推广探索研究(持续更新,欢迎讨论交流)

    在原子例程的sys.h中,使用宏定义建立了位带操作的基础, 使得操作IO端口可以像51一样实现位操作. 其实深入了解了位带操作的原理,几乎就可以实现对STM32所有外设寄存器的访问, 极端情况下,什么 ...

  7. STM32:内存单元,一个单元一个字节--------位带操作

    学到了位带操作,发现不懂0~0x10 0000 地址内如何保存1MB的数据,分析了一会明白了. 起初我以为STM32内存单元里是每个单元都是32位的,其实都是8位的,也就是一个字节一个单元. 0x00 ...

  8. STM32位带操作实现过程解析

    编辑这篇文档时候,听说相关的解析过程在<Cortex-M3权威指南>里有详细讲解. 前几日被一个跑马灯语句勾引 LED1=!LED1; 于是深入探究一下这句话的实现过程. #include ...

  9. STM32开发项目:GPIO的位带操作

    目录 背景介绍 GPIO位带操作的实现 使用指南 背景介绍 位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见.51 单片机中通过关键字 sbit 来实现位定义,STM32-M3, ...

最新文章

  1. 每次新版本build时,让软件的版本号自增
  2. IOS 设置视图半透明子控件不透明
  3. 抓取网页并解析HTML
  4. 网络编程Socket之UDP
  5. 可变车道怎么走不违章_郑州街头现可变车道?该咋走?记者实地探访
  6. 几款常用的编辑器介绍,给刚入门学Web前端的人
  7. Swift4.0复习特性、编译标志和检查API的可用性
  8. (117)FPGA面试题-使用三态缓冲器实现漏极开路缓冲
  9. “技术需求”与“技术成果”项目之间关联度计算模型 复赛top1解决方案
  10. 2018 蓝桥杯省赛 B 组模拟赛(五)题 F题
  11. linux sed用法
  12. Officescan防毒墙安装部署手册
  13. 基于IAR for RH850的瑞萨RH850 FCL库用法介绍
  14. Xilinx VIVADO 中 DDR3(AXI4)的使用(3)模块封装
  15. 多线程ADSL切换IP
  16. 实变函数与泛函分析课本pdf_免费推荐几本实变函数和泛函分析的书
  17. DICOMRT:XXX Target Volume,各种目标体积浅析
  18. 计算机主机的拆卸的注意事项,拆解笔记本注意事项及技巧!
  19. Android组件化架构实践,成功拿下大厂offer
  20. C++判断两个链表是否相交算法

热门文章

  1. Linux云自动化运维第六课
  2. 请教各位高手!手机要如何访问电脑的tomcat呢!
  3. 锋利的JQuery学习笔记01
  4. android sdk入门(1)
  5. SQL Server FOR XML PATH 语句的应用
  6. UA PHYS515A 电磁理论III 静磁学问题1 Maxwell方程与静磁学问题
  7. UA MATH567 高维统计II 随机向量7 Grothendieck不等式
  8. UA MATH564 概率论 多项分布
  9. Windows 内核数据结构学习总结
  10. dp_c_区间dp_g