STM32基于HAL库实现微秒延时
HAL只提供了ms级的延时,但有些特殊场景,比如与通信速率较慢的设备通信时,会需要用到us级延时。STM32标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱,所以此时就需要自己实现一个us级别延时函数。
这里介绍一种使用定时器设计us级延时函数的方法。
思路:我们将定时器设置为1MHZ的计数频率,这样定时器计一个数就是1us,我们就可以通过定时器计数值得知计时时间。
以使用TIM1为例,这里我们采用STM32F103内部8MHz晶振,故需要设置预分频系数PSC为8-1=7。同时配置PA1为GPIO输出模式,之后用于测试延时函数的效果。

Untitled
编写微秒延时函数:
/* USER CODE BEGIN PD */
#define DLY_TIM_Handle (&htim1) // Timer handle
/* USER CODE END PD */
/* USER CODE BEGIN PFP */
void delay_us(uint16_t nus);
/* USER CODE END PFP */
/* USER CODE BEGIN 4 */
void delay_us(uint16_t nus)
{
__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0); // set the counter value a 0
__HAL_TIM_ENABLE(DLY_TIM_Handle); // start the counter
// wait for the counter to reach the us input in the parameter
while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus);
__HAL_TIM_DISABLE(DLY_TIM_Handle); // stop the counter
}
/* USER CODE END 4 */
编写微秒延时函数测试程序,使PA1高低电平间隔100us转换一次:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
delay_us(100);
}
/* USER CODE END 3 */
烧录程序,通过逻辑分析仪观察PA1电平变化:


可以看到PA1高电平持续时间和低电平持续时间都和符合100us的预设,延时效果较好。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
STM32
+关注
关注
2313文章
11206浏览量
375230 -
定时器
+关注
关注
23文章
3378浏览量
125074 -
GPIO
+关注
关注
16文章
1336浏览量
56587 -
Systick
+关注
关注
0文章
67浏览量
14036 -
HAL库
+关注
关注
1文章
121浏览量
7786
发布评论请先 登录
相关推荐
热点推荐
STM32标准库改为HAL库的程序实现
标准库占绝大多数,自己买的板子跟的资料也一般是标准库,HAL库很少,不过要是使用STM32CubeMx配置,那么就是使用的
发表于 11-22 11:23
•3.6w次阅读
通用定时器实现STM32单片机微秒级延时函数
一、前言在实际应用中,经常用到延时函数,而HAL库的延时函数是毫秒级的,虽然可以自行修改,但该函数使用的地方较多,修改不慎可能会引起其他问题,所以本文使用一个定时器,
发表于 11-24 18:51
•20次下载
STM32 HAL库的功能和使用方法 STM32 HAL库和标准库的区别
HAL(Hardware Abstraction Layer)是指硬件抽象层,是一种封装底层硬件接口驱动的编程库。在嵌入式系统中,HAL库可以更加方便地
发表于 08-08 18:21
•7807次阅读
STM32基于HAL库实现微秒延时
评论