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 小时前
单片机USB虚拟串口实验
单片机·嵌入式硬件
崇山峻岭之间3 小时前
单片机USB U盘实验
单片机·嵌入式硬件
点灯小铭3 小时前
基于单片机的锅炉压力与温度监测报警系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
环境倒逼我学习3 小时前
无人机地面站之第13章 Mission Planner 入门与界面总览
单片机·嵌入式硬件·无人机
大阳1233 小时前
ARM.8(ADC,SPI)
单片机·嵌入式硬件·adc·spi
hoiii1873 小时前
基于 STM32 的标准遥控器架构与源码
stm32·嵌入式硬件·架构
少年、潜行3 小时前
STM32 ISP 升级体验
stm32·嵌入式硬件·isp升级·系统编程区域
杨连江4 小时前
一种三模式可调气隙式双侧定子滑移可变磁通轴向永磁电机
单片机·嵌入式硬件
Aaron158813 小时前
无人机反制中AOA+TDOA联合定位技术与雷达探测定位技术的应用对比分析
arm开发·嵌入式硬件·fpga开发·硬件工程·无人机·信息与通信·信号处理
foundbug99914 小时前
STM32 睡眠模式测试程序
stm32·单片机·嵌入式硬件