0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32基于HAL库实现微秒延时

CHANBAEK 来源:上下求索电子er 作者:上下求索电子er 2023-10-25 15:31 次阅读

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

    STM32F407使用HAL延时微妙实现方法

    STM32F407 使用HAL延时微妙实现方法(STM32CubeMX配置)作者 : 李剀出处
    发表于 08-04 08:20

    STM32 HAL微秒延时

    STM32HAL微秒(μs)延时
    发表于 08-24 07:19

    HAL实现延时相关的函数

    HAL 有提供延时函数,只不过它只能实现简单的毫秒级别延时,没有实现 us 级别
    发表于 08-24 07:45

    如何利用SysTick实现微秒延时函数?

    怎么实现STM32 HAL微秒延时函数? 如何利用SysTick
    发表于 11-25 08:06

    怎么实现STM32CubeIDE HAL微秒us的延时Delay?

    怎么实现STM32CubeIDE HAL微秒us的延时Delay?
    发表于 11-25 07:40

    HAL如何实现us延时

    stm32HAL实现us延时方法HAL_Delay()源码为ms级别的
    发表于 01-17 07:53

    HAL微秒级的延时实现

    目录前言一、代码和使用二、使用和验证1.引入头文件2.初始化3.使用和验证总结前言接触HAL差不多两年了,一直苦于HAL没有自带微秒级的
    发表于 01-20 07:49

    通用定时器实现STM32单片机微秒延时函数

    一、前言在实际应用中,经常用到延时函数,而HAL库的延时函数是毫秒级的,虽然可以自行修改,但该函数使用的地方较多,修改不慎可能会引起其他问题,所以本文使用一个定时器,实现
    发表于 11-24 18:51 20次下载
    通用定时器<b class='flag-5'>实现</b><b class='flag-5'>STM32</b>单片机<b class='flag-5'>微秒</b>级<b class='flag-5'>延时</b>函数

    STM32CubeMX 配置STM32F407 实现HAL延时微妙方案

    STM32CubeMX 配置STM32F407 实现HAL延时微妙方案
    发表于 11-24 20:51 20次下载
    <b class='flag-5'>STM32</b>CubeMX 配置<b class='flag-5'>STM32</b>F407 <b class='flag-5'>实现</b><b class='flag-5'>HAL</b>库<b class='flag-5'>延时</b>微妙方案

    stm32HAL实现us延时方法

    stm32HAL实现us延时方法HAL_Delay()源码为ms级别的延时如下:/** *
    发表于 01-17 09:32 5次下载
    <b class='flag-5'>stm32</b>之<b class='flag-5'>HAL</b>库<b class='flag-5'>实现</b>us<b class='flag-5'>延时</b>方法

    STM32 HAL延时函数 HAL_Delay 解析

    HAL 库有提供延时函数,只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时。下面我们
    发表于 01-17 09:48 7次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b> 库<b class='flag-5'>延时</b>函数 <b class='flag-5'>HAL</b>_Delay 解析

    STM32HAL微秒延时(μs)

    STM32HAL微秒(μs)延时
    发表于 01-18 10:39 48次下载
    <b class='flag-5'>STM32HAL</b>库<b class='flag-5'>微秒</b><b class='flag-5'>延时</b>(μs)

    HAL库中用定时器实现自定义延时函数delay_us()

    STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有
    的头像 发表于 09-21 10:33 7538次阅读

    STM32如何使用定时器实现微秒(us)级延时

    STM32如何使用定时器实现微秒(us)级延时? 在STM32微控制器中,可以使用定时器实现
    的头像 发表于 11-06 11:05 3034次阅读