【STM32】位带操作

news2024/9/24 5:28:13

一、位带操作

1.意义

回想以前写51代码

​ P0 = 0x10; //将P0端口设置为0x10 P1_0=1; //将P1端口0号引脚设置为高电平 a = P2_2; //获取P2端口2号引脚的电平

根据上述的方法,我们可以发现快速定位修改某个引脚的电平还有获取引脚的状态

2.原因

GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit操作IO口的性能没有达到极致,因为这些函数都需要进行现场保护和现场恢复的动作,比较耗时间,没有进行一步到位,使用位带操作则没有上述的烦恼,简单快速!

示例1:

 GPIO_SetBits(GPIOF,GPIO_Pin_9); 
 修改为 PFout(9)=1;              

示例2:

GPIO_ResetBits(GPIOF,GPIO_Pin_9); 

修改为 PFout(9)=0;          

因为使用对引脚设置电平或读取电平,库函数效率是不高的,很难应付高性能的场合,如下代码,修改某引脚电平要执行起码3行代码,还不包括隐含的调用函数与函数返回的过程。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{   
	/* Check the parameters */                        		assert_param(IS_GPIO_ALL_PERIPH(GPIOx));   	           	   assert_param(IS_GPIO_PIN(GPIO_Pin));    
    GPIOx->BSRRL = GPIO_Pin; 
}   

寄存器地址分析

在这里插入图片描述

二、《Cortex M3与M4权威指南》章节6.7 P206

1.背景

位带操作常用于I/O高度密集访问的芯片。

在这里插入图片描述

Bit-band operation support allows a single load/store operation to access (read/write) to a single data bit. In the Cortex-M3 and Cortex-M4 processors, this is supported in two pre-defined memory regions(静态映射) called bit-band regions. One of them is

在这里插入图片描述

There are two regions of memory for bit-band operations:

• 0x20000000~0x200FFFFF (SRAM, 1MB)

0x40000000~0x400FFFFF (Peripherals, 1MB)

2.映射表

在这里插入图片描述

在这里插入图片描述

3.公式

关于IO引脚对应的访问地址,可以参考以下公式寄存器的位带别名地址 = 0x42000000 + (寄存器的地址-0x40000000)32 + 引脚编号x

三、寄存器地址与别名地址转换技巧

1.确定某端口访问起始地址,如端口F访问起始地址为GPIOF_BASE

#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
typedef struct
{
  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
} GPIO_TypeDef;

2.根据要访问的寄存器地址计算偏移值,如计算

GPIOF的ODR寄存器地址 = GPIOF_BASE+0x14;

3.根据以下公式进行换算

​ 寄存器的位带别名地址 = 0x42000000 + (寄存器的地址-0x40000000)32 + 引脚编号4

详细示意图参考如下:

在这里插入图片描述

4.PF9引脚的位带别名地址

示例1:

   uint32_t *PF9_BitBand = (uint32_t *)(0x42000000 + (GPIOF_BASE + 0x14 - 0x40000000)*32 + 9*4);               

示例2:

uint32_t *PF9_BitBand   = (uint32_t *)(0x42000000 + ((uint32_t)&GPIOF->ODR - 0x40000000)*32 + 9*4);

四、代码调整

将端口的访问封装为Pxout、Pxin,例如端口F引脚电平设置PFout,端口A引脚电平读取PAin。

#define PFout(x) *(volatile uint32_t *)(0x42000000 + (GPIOF_BASE + 0x14 - 0x40000000)32 + x4)

#define PAin(x) *(volatile uint32_t *)(0x42000000 + (GPIOA_BASE + 0x10 - 0x40000000)32 + x4)

五、编译优化

5.1 优化等级

优化:编译器想尽办法去压缩程序存储空间,提高运行速度。类比:新的电脑安装一个win10,默认的win10的存储空间占用是比较大、运算速度不是最快,会安装一些优化软件来优化win10,优化过后,会发现系统盘剩余空间增加了,win10的运行速度也增加了。

gcc 预处理 汇编 未链接的二进制文件 可执行程序

一般编译器,优化有多个等级:-O0、-O1、-O2、-O3。

-O0:缺省优化级别,一般情况下不压缩程序存储空间,不提高程序运行速度,保证程序的可靠执行。

-O1:轻度优化,轻度压缩程序存储空间,轻度优化程序运行速度。

-O2:推荐优化等级,在程序存储空间和程序运行速度取得平衡点。

-O3:最高级别的优化等级,有可能导致程序不能运行,也会使用以空间换时间的方法,导致程序体积增大。

示例1:-O0

在这里插入图片描述

示例1:-O2

在这里插入图片描述

按键例子1,任何时刻按下按键,灯无法响应:

​ #define PAin(n) *((uint32_t *)(0x42000000 + (((uint32_t)&GPIOA->IDR) - 0x40000000)*32 + (n)*4)) PFout(9) = PAin(0); 经过编译阶段,会得到恒定的结果。 PFout(9)=1;

按键例子2,任何时刻按下按键,灯能够立即响应点亮或熄灭:

              

六、volatile关键字

1.应用场景

volatile关键字分析,往往应用在三种场合

1)多线程编程共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要省略该变量的访问。

2)裸机编程的时候,某函数与中断服务函数共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要省略该变量的访问。

3)ARM定义寄存器的时候,寄存器是指向一个地址,要加上volatile进行修饰,让编译器不要优化而省略该变量的访问。

编译器不要优化该变量指的是防止编译器出现优化过度,导致代码运行失效。

加上volatile关键字生成的汇编代码会发生明显的变化,同样调用delay函数,灯的速度发生变化!

2.delay函数在-O2等级,是否添加volatile关键字,反汇编分析。

七、仿真调试

仿真调试实时跟踪代码的运行,程序出现问题并能跟踪到问题所在。能够观察变量的变化、逐步执行代码。

在这里插入图片描述

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

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

相关文章

2025深圳国际微波射频及天线技术应用展览会

2025深圳国际微波射频及天线技术应用展览会 2025 Shenzhen International Microwave RF and Antenna Technology Application Exhibition 时间&#xff1a;2025年04月9-11日 地点&#xff1a;深圳会展中心(福田&#xff09; 详询主办方陆先生 I38&#xff08;前三位&#…

CRMEB 多店版供应商订单管理

订单列表 一、功能介绍 查看所有供应商订单数据&#xff0c;详情&#xff0c;可以提醒发货 根据供应商筛选&#xff0c;可以查看不同类订单 二、操作流程 供应商 &#xff1e; 订单管理 > 订单列表 三、功能说明 售后列表 一、功能介绍 查看所有供应商售后订单数据&a…

一个案例讲透如何做好竞品分析!

随着国内互联网市场进入下半场&#xff0c;各个领域的相关产品层出不穷&#xff0c;即使是新鲜事物&#xff0c;一旦出现&#xff0c;也会迅速造成行业内部拥挤。行业发展如此之快&#xff0c;闭门造车绝对不是产品迭代更新应有的设计方式。敞开大门&#xff0c;出去看看别人家…

基于 Llama factory 微调 Llama3.1-70B-Chinese-Chat

​ 本文旨在探讨基于Llama factory使用LoRA&#xff08;Low-Rank Adaptation&#xff09;技术对Llama3.1-70B-Chinese-Chat模型进行微调的过程&#xff0c;重点介绍在单机多卡和多机多卡两种分布式训练环境下的实现方法。 1.环境准备 1.1 平台环境 微调Llama3.1-70B模型&…

Anthropic 公开 Claude AI 模型的系统提示词

硅纪元快讯栏目&#xff0c;每日追踪AI领域的最新动态&#xff0c;快速汇总最新科技新闻&#xff0c;助您时刻紧跟行业趋势。简明扼要的呈现资讯概要&#xff0c;让您快速了解前沿资讯。 1分钟速览新闻 特斯拉“Cortex”超级计算机亮相&#xff0c;预计10月全面运行 Anthropic…

Clickhouse集群化(一)k8s集群搭建

环境准备&#xff1a; vm 17 pro 有些功能必须pro版本才会提供&#xff08;https://download.csdn.net/download/weixin_40663313/89677277?spm1001.2014.3001.5501&#xff09;夸克下载链接 centos 7.9 docker&#xff1a;1.26 k8s&#xff1a;1.21.14 1. 创建虚拟机 …

图书馆自习预约选座小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《图书馆自习预约选座小程序》。 图书馆是日常同学学习的好去处&#xff0c;但同学们日益高涨的学习热情和图书馆座位有限的矛盾也日益凸显。经常出现座位不够的情况&#xff0c;甚至部分同学会进行占座&#…

腾讯浙大提出定制化视频生成框架CustomCrafter,只需通过少量图像就可以完成高质量视频生成!

腾讯联合浙大提出了一种定制化视频生成框架-CustomCrafter&#xff0c;它能够基于文本提示和参考图像生成自定义视频&#xff0c;同时保留运动生成和概念组合的能力。通过设计一系列灵活的模块&#xff0c;使得模型实现了无需额外视频&#xff0c;通过少量图像学习&#xff0c;…

【开端】 进行页面升级或维护时不影响用户体验NGINX配置

一、绪论 在网站管理中&#xff0c;经常需要进行页面升级或维护&#xff0c;而为了不影响用户体验&#xff0c;我们可以设置一个访问页面&#xff0c;在页面升级期间&#xff0c;用户访问网站时会直接跳转到该页面。本文将介绍如何设置访问页面进行升级&#xff0c;以确保用户…

Vue(1)——创建实例

Vue创建实例 Vue是用于构建用户界面的渐进式框架。 创建Vue实例&#xff0c;初始化渲染 准备容器引包(开发版本/生产版本)创建Vue实例指定配置项&#xff0c;渲染数据 el指定挂载点 data提供数据 <!-- 准备容器 --><div id"app"><h1>{{msg}}<…

【论文阅读】Automatic Modulation Classification Based Deep Learning: A Review(2022)

摘要 Automatic Modulation Recognition&#xff08;自动调制识别&#xff09; (AMR) is a critical component of&#xff08;重要组成部分&#xff09; smart communication&#xff08;智能通信&#xff09; and it contributed&#xff08;促进了&#xff09; to the deve…

【中学教资科目二】04中学心理

04中学心理 第一节 认知过程1.1 注意的分类1.2 想象 第二节 学习概述以及知识的学习与技能的形成2.1 知识学习的分类2.2 分化和泛化2.3 强化理论 第三节 学习理论3.1 认知学习理论3.2 建构主义学习理论3.3 行为主义学习理论 第四节 学习心理4.1 奥苏贝尔成就动机分类4.2 学习迁…

【9月持续更新】国内ChatGPT-4o中文镜像网站整理~

以前我也是通过官网使用&#xff0c;但是经常被封号&#xff0c;就非常不方便&#xff0c;后来有朋友推荐国内工具&#xff0c;用了一阵之后&#xff0c;发现&#xff1a;稳定方便&#xff0c;用着也挺好的。 最新的 GPT-4o、4o mini&#xff0c;可搭配使用~ 1、 最新模型科普&…

ES6笔记总结:第四天(ES6完结)

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; node的模块化&#xff1a; 1.CommonJS 规范&#xff1a;Node.js 遵循 CommonJS 模块规范&#xff0c;该规范定义了如何在服务器环境中实现模块化&#xff0c;包括如何定义模块、如何引入和使用模块。 2.模块的定义&…

最新网站服务器CC压力测试系统源码

最新网站服务器CC压力测试系统源码 前后端全开源 一款可测压的系统&#xff0c;但不提供接口。 环境&#xff1a;php7.3 mysql5.6 Apache 2.4.53 上传后解压 访问域名/install进行安装 后台地址&#xff1a;域名/admin 账号&#xff1a;admin 密码&#xff1a;admin 代…

护眼落地灯十大品牌排行榜:十大口碑一流护眼大路灯汇总

十大护眼落地灯品牌哪个牌子好&#xff1f;孩子在读写时经常出现揉眼睛以及眼睛酸痛等现象&#xff0c;多半是因不良光线引起的&#xff0c;光线频闪、发光不均以及太暗太亮都会对眼睛有伤害&#xff0c;而想要改善室内光线环境&#xff0c;护眼大路灯就可以起到改善室内光线环…

JavaScript计算问题

项目场景&#xff1a; 使用JavaScript做 算数运算&#xff0c;比较大小时&#xff0c;没有区分数据类型&#xff0c;导致错误 问题描述 为什么这个数学运算&#xff0c;没有按照我的预期去执行呢&#xff1f; "123" > 123 //false 123 > 123 //false&…

Oracle taf高级特性使用

0、taf介绍 TAF是Oracle数据库提供的一个高级特性&#xff0c;旨在实现应用程序在数据库连接中断时的透明重连。它允许应用程序在数据库故障发生时&#xff0c;无需修改代码或手动干预&#xff0c;就能自动连接到新的数据库实例&#xff0c;保证了事务的连续性和应用的高可用性…

什么是稀土高阻隔剂?

高阻隔性能粉末稀土是一种具有特殊性能的材料。金士镧高阻隔剂采用稀土定向生长技术与高温高压工艺相结合&#xff0c;对不同尺度的稀土材料进行规整度控制&#xff0c;获得具有结构紧密、耐强酸强碱、耐高温、低吸油的高强度稀土粉体。该稀土粉体可应用于耐高温、补强、阻隔需…

易基因:Exp Mol Med:ChIP-seq等揭示Foxo1-YAP-Notch1轴在疾病进展中的表观调控作用——重编程STING介导的先天免疫

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 非酒精性脂肪性肝炎&#xff08;nonalcoholic steatohepatitis&#xff0c;NASH&#xff09;是一种慢性肝脏疾病&#xff0c;其特征是肝脏中脂肪积累、炎症和纤维化。干扰素基因刺激因子…