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
    +关注

    关注

    2266

    文章

    10880

    浏览量

    355080
  • 定时器
    +关注

    关注

    23

    文章

    3242

    浏览量

    114575
  • GPIO
    +关注

    关注

    16

    文章

    1197

    浏览量

    51968
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13048
  • HAL库
    +关注

    关注

    1

    文章

    121

    浏览量

    6190
收藏 人收藏

    评论

    相关推荐

    STM32 HAL微秒延时

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

    如何利用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的程序实现

    标准占绝大多数,自己买的板子跟的资料也一般是标准HAL很少,不过要是使用STM32CubeMx配置,那么就是使用的
    发表于 11-22 11:23 3.5w次阅读

    STM32单片机使用定时器中断方式实现毫秒级延时的设计

    因为STM32 HAL中仅有对HAl_Delay()毫秒级的延时,为实现精确的
    发表于 06-04 14:55 1.1w次阅读
    <b class='flag-5'>STM32</b>单片机使用定时器中断方式<b class='flag-5'>实现</b>毫秒级<b class='flag-5'>延时</b>的设计

    通用定时器实现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><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><b class='flag-5'>实现</b>us<b class='flag-5'>延时</b>方法

    STM32 HAL 延时函数 HAL_Delay 解析

    HAL 有提供延时函数,只不过它只能实现简单的毫秒级别延时,没有实现 us 级别
    发表于 01-17 09:48 8次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b> <b class='flag-5'>库</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><b class='flag-5'>延时</b>(μs)

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

    STM32程序从标准移植到HAL的时候,会发现HAL中只有一个毫秒级
    的头像 发表于 09-21 10:33 1.1w次阅读

    STM32 HAL的功能和使用方法 STM32 HAL和标准的区别

    HAL(Hardware Abstraction Layer)是指硬件抽象层,是一种封装底层硬件接口驱动的编程。在嵌入式系统中,HAL可以更加方便地
    发表于 08-08 18:21 4241次阅读

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

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