STM32 HAL库实现微秒级别延时

STM32 HAL库实现微秒级别延时

HAL库函数中有延时函数HAL_Delay();进行毫秒级别的延时,但是在实际的开发中编写时序时有时需要进行较为准确的微秒级别延时像SSI协议接口等,本文章采用一个通用定时器的方式实现微秒级别的延时,而不采用滴答定时器是由于HAL库函数中很多地方需要使用滴答定时器进行超时判断,更改滴答配置恐引发意外,另外传统的for循环延时不太准确。

首先配置使能定时器(我选择的是定时器6)

image.png

第二步:配置定时器(当然在此步骤前默认读者已经完成了系统时钟的配置,F1系列我配置为72MHz,那么对于定时器6来说时钟也是72MHz)

image.png

进行72分频(71+1)那么得出分频后定时器的时钟为1MHz即1us进行数据变化一次,根据这个思想,我将定时器配置为向上计数,自动重装,好方目前位置cubeMX配置方面已经完成了,生成工程就行

第三步:打开工程 在tim.c 文本中的begin 和end之间添加以下代码即可

/******************************************

***功能:实现us级别延时

*******************************************/

void delay_us(uint16_t us)

{

uint16_t differ=0xffff-us-5; //设定定时器计数器起始值

__HAL_TIM_SET_COUNTER(&htim6,differ);

HAL_TIM_Base_Start(&htim6); //启动定时器

  while(differ<0xffff-6) //补偿,判断

  {

    differ=__HAL_TIM_GET_COUNTER(&htim6); //查询计数器的计数值

  }

  HAL_TIM_Base_Stop(&htim6);

}

第四步:将void delayXus(uint16_t us);添加至tim.h头文件中 在其他地方引用该头文件即可使用该延时,经过实际测试可得还是比较准备的

void delay_us(uint16_t us);

以上整理提供by 荒野大嫖客 有问题可以一起探讨探讨或者cubemx中文QQ群发表 里面大牛比较多

原文地址:https://www.cnblogs.com/aker-whale/p/14755812.html