STM32 bit-band位带操作

news2024/11/23 2:28:24

在51单片机中,我们可以通过sbit命令来操作存储器中的位,在STM32中,我们同样可以操作存储器中特定的位。

1、为何使用位带操作?

总结来说,一个是因为访问速度快,另一个是因为安全。

如果在裸机开发中,位带操作相比于直接的读-改-写操作除了访问速度快一点以外好像也没有什么可以说的了,但是如果在带操作系统的开发中,多任务并发运行的时候就有可能在任务切换的过程中发生不可预料的问题,而位带操作由于是属于硬件完成的不可被异常打断的操作(原子操作),所以相对于读-写-改的操作模式的话会更安全些。

2、位带操作的优点

《Cortex M3权威指南》中推荐的是在IO密集型的底层代码中使用。在时序要求较严格的情况下,可以使用位带操作,如使用IO口模拟某种通信协议。另外,由于位带操作异常不可打断(原子操作),在带操作系统的开发中出于安全性考虑可以使用位带操作。

3、位带操作原理

STM32中有两个位带:SRAM位带区(地址0x2000,0000~0x200F,FFFF共1MB)以及片上外设位带区(地址0x2000,0000~0x200F,FFFF共1MB),分别将其一一对应到各自的32M大小的位带别名区。

 即:位带区的一个字节空间对应位带别名区的32个字节空间,而一个字节包含8bit,因此位带区的每1bit对应位带别名区的32个bit,共4个字节,每个字节对应一个地址,即4个地址,取这4个地址中最低位的地址对应选中的bit位。

 在这里插入图片描述

 SRAM位带别名区计算公式:Address=0x2200,0000+(m-0x2000,0000)*8*4+n*4

片上外设位带别名区计算公式:Address=0x4200,0000+(m-0x4000,0000)*8*4+n*4

式中:m为位带区的地址(0x2000,0000~0x200F,FFFF),n为位带区对应字节的第0~7位,

为了计算方便,统一为如下公式:

Address=(m & 0xF000,0000)+0x0200,0000+(m & 0x000F,FFFF)<<5+n<<2

其中:(m & 0xF000,0000)目的是为了取出最高位的4和2,分别对应SRAM和片上外设;0x0200,0000为固定偏移;(m & 0x000F,FFFF)<<5是为了计算m偏移0x2000,0000的量,<<5相当于乘以32;n<<2计算每一位对应的字节地址偏移;

4、用位带控制GPIO口点灯

以GPIOA口的pin0口点灯操作为例。我们知道,GPIOA口的ODR寄存器的低16位控制GPIOA PA0~PA15的输出,如下图:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //按公式计算位带别名区的地址
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) //强制unsigned long类型转换后解引用
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) //获得的位带别名区地址所存储的值 

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启APB2时钟
	GPIO_InitTypeDef GPIO_InitStructure={GPIO_Pin_0,GPIO_Speed_50MHz,GPIO_Mode_Out_PP};//声明GPIO类型结构体并初始化
	GPIO_Init(GPIOA, &GPIO_InitStructure);//配置好GPIOA口
	while (1)
	{
		BIT_ADDR((uint32_t)&GPIOA->ODR ,0)=0x001;//为GPIOA口ODR寄存器的0位赋值1,对应pin0口
		Delay_ms(500);//延时500ms
		BIT_ADDR((uint32_t)&GPIOA->ODR ,0)=0x000;//为GPIOA口ODR寄存器的0位赋值0,对应pin0口
		Delay_ms(500);
		BIT_ADDR((uint32_t)&GPIOA->ODR ,0)=0x111;//仅末位值有效,无论位带别名区的32位空间中存储什么值,都只取末尾的值赋给对应的位带区的1位
		Delay_ms(500);
		BIT_ADDR((uint32_t)&GPIOA->ODR ,0)=0x110;//仅末位值有效,无论位带别名区的32位空间中存储什么值,都只取末尾的值赋给对应的位带区的1位
		Delay_ms(500);
	}
}

 5、程序现象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/47758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记69】函数的柯里化

一、认识函数的柯里化 将一个接受多个参数的函数&#xff0c;更改为需要调用多次, 每次只传一个参数的函数利用了闭包, 延长了 外部函数的参数使用时间&#xff08;一&#xff09;基础版 function sum (a, b) {console.log(a b)}sum(10, 20);sum(10, 30);sum(10, 40); &#x…

2022卡塔尔世界杯小组赛出线形势分析指南——德国队会被西班牙做掉吗?

早点关注我&#xff0c;精彩不错过&#xff01;&#xff08;德国队出现形势分析在文末&#xff0c;可直接跳转。&#xff09;北京时间今天晚上11点整&#xff0c;如火如荼的卡塔尔世界杯就将展开小组赛第三轮比赛的争夺&#xff0c;8个小组轮番同时进行最后一轮较量&#xff0c…

2022年全网最全AI绘画产品整理(一共23款,免费的绘画次数用到你手软)

1、飞链云版图 【免费】 扫码或搜索微信小程序&#xff1a;飞链云版图 注册即赠送100次AI绘画次数&#xff0c;每天分享可以免费获取到110次AI绘画次数&#xff1b; 完全够普通人到日常绘画需求&#xff1b;如果你有大量的绘画需求&#xff08;月绘画次数过万&#xff09;&am…

Win10升级Win11必备的5款免费软件

目前win7渐渐退出视野&#xff0c;大部分人都开始使用win10了&#xff0c;甚至win11都开始渐渐进入视野了。 1.文件预览工具——Seer 以前我们在预览文件的时候&#xff0c;需要通过双击打开才能查看内容&#xff0c;如果文件过多&#xff0c;一个个点开就太麻烦了。Seer以前…

Flutter 应用程序更新

Flutter 应用程序更新 原文 https://medium.com/flutter-community/in-app-update-the-flutter-way-2f25e4a02c02 前言 当您推出应用程序的新版本时&#xff0c;您希望您的用户了解它。无论是因为您修复了一个关键的 bug&#xff0c;添加了一个新特性&#xff0c;还是仅仅因为应…

Python基础(八):循环深入讲解

文章目录 循环深入讲解 一、循环简介 1、循环的作用 2、循环的分类 二、while的语法 1、快速体验 三、while的应用 1、应用一&#xff1a;计算1-100累加和 2、应用二&#xff1a;计算1-100偶数累加和 四、break和continue 1、理解 五、while循环嵌套 1、应用场景 …

YOLO V3 详解

YOLO V3 论文链接&#xff1a;YOLOv3: An Incremental Improvement 主要改进 Anchor: 9个大小的anchor&#xff0c;每个尺度分配3个anchor。Backbone改为Darknet-53, 引入了残差模块。引入了FPN&#xff0c;可以进行多个尺度的训练&#xff0c;同时对于小目标的检测有了一定…

【微服务】RestClient操作文档

为了与索引库操作分离&#xff0c;我们再增加一个测试类&#xff0c;做两件事情&#xff1a; 初始化RestHighLevelClient我们的酒店数据在数据库&#xff0c;需要利用IHotelService去查询&#xff0c;所以注入这个接口 package cn.itcast.hotel;import cn.itcast.hotel.pojo.…

【车载开发系列】UDS诊断---电控单元复位 ($0x11)

【车载开发系列】UDS诊断—电控单元复位&#xff08;$0x11&#xff09; UDS诊断---电控单元复位&#xff08;$0x11&#xff09;【车载开发系列】UDS诊断---电控单元复位&#xff08;$0x11&#xff09;一.概念定义二.应用场景三.报文格式1&#xff09;请求2&#xff09;肯定响应…

js文字提示层案例分析

前言 &#x1f496;js文字提示层在项目中比较常见&#xff0c;今天初次学习记录一下 功能介绍 在一段文本中鼠标触及红色字体&#xff0c;下方显示一个文字提示信息&#xff0c;鼠标离开红色字体区域&#xff0c;文字提示层消失。 知识点 onmouseover&#xff1a;鼠标指针移…

平衡搜索树——B-树小记

文章目录B- 树系列定义插入规则代码B-树结点定义查找key在结点哪个子树插入分裂B- 树系列 定义 B-树是一棵多叉 平衡 搜索树(不是二叉树&#xff0c;B-树中每个结点中可以有多个key&#xff0c;也有多个孩子) B-树中每个结点在实现时人为规定一个key的上限(KEY_LIMIT 4) B-…

Mysql语法五:idea连接数据库和jdbc

目录 1.连接数据库 1.1.下载驱动包 1.2&#xff1a;连接数据库 2.jdbc编程 2.1&#xff1a;何为jdbc 2.2&#xff1a;jdbc的使用。 2.2.1&#xff1a;直接插入操作 2.2.2&#xff1a;利用&#xff1f;进行插入 2.2.3&#xff1a;修改操作 2.2.4&#xff1a;删除操作 …

算法基础:动态规划

目录 动态规划之禅 多种纬度解决Fibonacci 数列 什么是Fibonacci数列 朴素递归方案 朴素递归的问题 Fib自上而下、备忘录方案 Fib自下而上法 动态规划之禅 动态规划是算法基础部分中最有趣的一个了&#xff0c;我想了很多天&#xff0c;怎么用很短的一些话把动态规划像之…

onnx删除无用属性

这里写自定义目录标题在推理onnx模型时&#xff0c;报了一个错&#xff0c;如下&#xff1a;InvalidGraph: [ONNXRuntimeError] : 10 : INVALID_GRAPH : This is an invalid model. In Node, ("Conv_0", Conv, "", -1) : ("x": tensor(float),&q…

DPVS时间轮移植

DPDK自带的定时器采用跳表实现&#xff0c;时间复杂度是O(logn)&#xff0c;当有大量事件要定时触发时&#xff0c;比如会话session老化&#xff0c;效率并不高。因此DPVS采用了O(1)复杂度的时间轮。0. 概述 a. 添加定时器事件的核心是 static int __dpvs_timer_sched(struct…

为何 SPARK 在应用 GPU 后表现更出色

什么是 APACHE SPARK&#xff1f; 伴随数据的巨量增长&#xff0c;Apache Spark 已成为分布式横向扩展数据处理的热门框架之一&#xff0c;可以在本地和云端数以百万计的服务器上运行。 Apache Spark 是应用于大型数据处理的快速通用分析引擎&#xff0c;可在 YARN、Apache Mes…

程序员还在为变量取名苦恼,那是因为你不知道,这个变量命名神器

作为程序员&#xff0c;变量命名应该是我们编程的开端&#xff0c;也是我们每天都必须需要做的事情。变量命名规范的重要性&#xff0c;相信大家都知道非常重要&#xff0c;良好的代码风格&#xff0c;带来好处有&#xff1a; 1、具有良好的可读性&#xff1b; 2、维护代码时…

【独立篇】React UI组件库

文章目录1、React UI组件库1.1、material-ui&#xff08;国外&#xff09;1.2、ant-design&#xff08;国内蚂蚁金服-antd&#xff09;2、AntD的简单使用2.1、CODE2.2、Result1、React UI组件库 1.1、material-ui&#xff08;国外&#xff09; 官网: http://www.material-ui.…

硬件定义软件?还是,软件定义硬件?

文章目录**1 软件和硬件****1.1 软件和硬件的定义****1.2 “硬件定义软件”和“软件定义硬件”的定义****1.3 CPU&#xff0c;软件和硬件解耦****1.4 CPU的软硬件定义****2 硬件定义软件****2.1 系统从软件逐步到硬件****2.2 硬件架构决定了软件设计****2.2.1 ASIC的硬件定义**…

【车辆配送】基于模拟退火 (SA)求解车辆配送 (VPR) (Matlab代码实现)

目录 1 车辆配送问题 2 模拟退火法 3 实现结果 4 参考文献 5 Matlab代码实现 1 车辆配送问题 式(9)~( 12)中, 为配送车辆到达需求点i的时间;为需求点i到需求点j的运输成本;、分别为配送车辆提前到达需求点i的或者滞后到达需求点i的单位时间内的等待成本以及惩罚成本。该数…