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
+关注
关注
2239文章
10671浏览量
348743 -
定时器
+关注
关注
23文章
3147浏览量
112037 -
GPIO
+关注
关注
16文章
1133浏览量
50570 -
Systick
+关注
关注
0文章
62浏览量
12950 -
HAL库
+关注
关注
1文章
112浏览量
5878
发布评论请先 登录
相关推荐
【STM32L476 Nucleo试用体验】SysTick微秒级延时函数的实现
STM32L476的HAL库中只提供了毫秒级延时函数:HAL_Delay(),但这个函数在很多时候并不能满足我们的需要,因为在很多情况下,我
发表于 10-03 11:51
通用定时器实现STM32单片机微秒级延时函数
一、前言在实际应用中,经常用到延时函数,而HAL库的延时函数是毫秒级的,虽然可以自行修改,但该函数使用的地方较多,修改不慎可能会引起其他问题,所以本文使用一个定时器,实现
发表于 11-24 18:51
•20次下载
在HAL库中用定时器实现自定义延时函数delay_us()
STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有
评论