单片机
返回首页

STM32基于HAL库实现微秒延时

2024-09-04 来源:elecfans

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的预设,延时效果较好。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章