HAL慢、ODR中、BSRR快:GPIO翻转速度的三重境界

你有没有想过一个问题:同样是翻转GPIO引脚,用HAL库、用ODR寄存器、用BSRR寄存器,速度能差多少?教程中用示波器实测了三种方法:

  1. HAL库的HAL_GPIO_WritePin:最慢
  2. ODR寄存器的"读-改-写":中等
  3. BSRR寄存器的"只写":最快

速度差距,肉眼可见。那个"函数调用"的开销(对应教程3.14节),HAL库的HAL_GPIO_WritePin,代码写起来很简单:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);

但背后有函数调用的代价

  • 入栈:保存当前函数的现场(LR、R0-R3等)
  • 跳转:跳转到HAL_GPIO_WritePin函数
  • 执行:函数内部的参数判断、寄存器操作
  • 出栈:恢复现场,返回

一条GPIO操作,背后是一堆指令。 教程中用示波器测量:HAL库方式翻转频率约1-3MHz 。**那个"读-改-写"的ODR(对应教程3.15节)**直接操作ODR寄存器:

GPIOA->ODR |= (1 << 8); // PA8置1

GPIOA->ODR &= ~(1 << 8); // PA8清0

但这里有个问题:读-改-写不是原子操作。|= 和 &= 编译后变成:

  1. 读ODR寄存器到CPU
  2. 修改某一位
  3. 写回ODR寄存器

三步操作,比直接写多了一步"读"。教程中用示波器测量:ODR方式翻转频率约9-18MHz。

**那个"只写"的BSRR(对应教程3.15节),**BSRR寄存器专门为"原子修改单个引脚"设计:

GPIOA->BSRR = (1 << 8); // 置位BS8,PA8输出高

GPIOA->BSRR = (1 << (8+16)); // 置位BR8,PA8输出低

BSRR分为低16位(置位)和高16位(复位)。

写1到BS8 → PA8高

写1到BR8 → PA8低

不需要读,直接写,一条指令搞定。 教程中用示波器测量:BSRR方式翻转频率可达50MHz以上(受GPIO速度模式限制)。

**那个"BSRR"的妙用,**BSRR还能同时设置多个引脚的状态:

GPIOA->BSRR = 0x000F0000; // 同时复位PA0-PA3

GPIOA->BSRR = 0x0000000F; // 同时置位PA0-PA3

一条指令,同时改多个引脚,原子操作

那个"实测"的数据(对应教程3.15节)

方法 翻转频率 相对速度
HAL_GPIO_WritePin ~1-3 MHz 1x
ODR读-改-写 ~9-18 MHz ~6x
BSRR只写 ~50 MHz+ ~25x

差距巨大。

那个"速度模式"的影响(对应教程3.15节)

BSRR能跑50MHz,但前提是GPIO速度模式要设对。

教程中演示了:GPIO速度模式设2MHz,输出4MHz方波 → 方波变三角波。

速度模式要匹配实际翻转频率。这个故事的启示 ,为什么BSRR比ODR快?因为ODR需要"读-改-写",BSRR只需要"写" 。为什么寄存器比HAL快?因为函数调用有入栈出栈开销HAL方便,寄存器高效------看你要什么。

**写在最后,**下次你需要高速翻转GPIO(比如模拟SPI、驱动WS2812),别用HAL。

想想BSRR。一条指令,只写不读。快,才是硬道理。

(本文灵感源于于振南《新概念ARM32单片机》教程第3.14节"GPIO操作效率对比:库函数与寄存器"和第3.15节"GPIO速率实测",感谢作者将GPIO性能优化的底层逻辑讲得如此通透。)

如果您觉得这个故事对您有启发,欢迎点赞、转发,让更多工程师看到这个藏在BSRR背后的"只写"哲学。

相关推荐
实在太懒于是不想取名2 小时前
STM32N6的开发日记(7):摄像头+NPU联动,完成 YOLO 实时目标检测与显示
stm32·嵌入式硬件·yolo
小柯博客3 小时前
STM32MP2安全启动技术深度解析
c语言·c++·stm32·嵌入式硬件·安全·开源·github
实在太懒于是不想取名4 小时前
STM32N6的开发日记(8):在N6中部署自训练的火焰检测模型
stm32·单片机·嵌入式硬件
木子单片机4 小时前
基于51单片机温度上下限报警设计 数码管显示
stm32·单片机·嵌入式硬件·51单片机·keil
森利威尔电子-5 小时前
森利威尔SL3180 替换LTC3639 150V降压恒压芯片 3A峰值电流能力转换效率高 静态电流低
单片机·嵌入式硬件·集成电路·芯片·电源芯片
qq_401700416 小时前
合宙4G模块Air724UG
嵌入式硬件
yugi9878387 小时前
基于51单片机的篮球计分器设计
单片机·嵌入式硬件·51单片机
编程之升级打怪7 小时前
什么是PWM
嵌入式硬件
zmj3203247 小时前
单片机内存在C 语言编译后的 “逻辑分区”
c语言·单片机·内存分区