Stm32 利用HAL库 实现微秒级的延时
本博客的方法基于HAL库和CubeMX开发的stm32芯片通用
介绍
由于HAL只提供了ms级的延时,但有些特殊场景,比如与通信速率较慢的设备通信时,会需要用到us级延时。
接下来直接进入正题。
CubeMX的配置
时钟源的选择
在这里我是使用了外部晶振作为时钟源
时钟树的配置
在这里我直接将频率拉满至84MHz
定时器的配置
为了实现1us的延时,我需要一个定时器(timer),并确保定时器的频率是1MHz,也就是1us记一次数。比如我的系统时钟是84MHz,那么我的分频就应该选择 84-1 = 83
下图是我定时器的配置。
要注意选择Internal Clock
代码部分
TIM_HandleTypeDef *TIMER; //需要传入一个指向我们所配置的定时器的指针变量(句柄)
//例如 TIMER = &htim1;
void delay_us(uint16_t us) {
__HAL_TIM_SET_COUNTER(TIMER, 0); // 把TIMER的counter设为0
while (__HAL_TIM_GET_COUNTER(TIMER) < us); //读取定时器的counter值
}
//由于定时器的频率是1MHz,所以其counter每次加1的时候,就表示过了1us
//每次调用时都把定时器的counter先置为0
结语
参考了Github上的思路
Github链接:https://github.com/MR-Addict/STM32-HAL-PS2-Library
写的有什么问题或者有疑惑的地方欢迎评论区留言
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?