STM32基于HAL库实现微秒延时

描述

STM32基于HAL库实现微秒延时

HAL只提供了ms级的延时,但有些特殊场景,比如与通信速率较慢的设备通信时,会需要用到us级延时。STM32标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱,所以此时就需要自己实现一个us级别延时函数。

这里介绍一种使用定时器设计us级延时函数的方法。

思路:我们将定时器设置为1MHZ的计数频率,这样定时器计一个数就是1us,我们就可以通过定时器计数值得知计时时间。

以使用TIM1为例,这里我们采用STM32F103内部8MHz晶振,故需要设置预分频系数PSC为8-1=7。同时配置PA1为GPIO输出模式,之后用于测试延时函数的效果。

Systick
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电平变化:

Systick

Systick

可以看到PA1高电平持续时间和低电平持续时间都和符合100us的预设,延时效果较好。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分