背景
STM32 HAL库中有一个延时函数HAL_Delay(),可以实现毫秒级的延时,能够满足一般延时需求。在有些场合下,我们需要更精准的延时,同时可能会有较长时间的延时,需要对定时器进行一些特殊的设计。
定时器初始化
定时器分频为1MHz,计数方式设置为向上计数
//定时器2初始化函数
void MX_TIM2_Init(void)
{
//部分代码略
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; //根据定时器2的频率进行分频
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535; //计数上限不变
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
//以下代码略
}
主程序中的设计
- 定义一个32位整数,用于定时器的溢出次数计数
volatile uint32_t t2_count =0;
2.定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim2.Instance)
t2_count ++;
}
3.定义一个长延时函数文章来源:https://www.toymoban.com/news/detail-524129.html
//精度为us级的长延时函数,delay_time为延时时长,单位为us
//最大可计4294967296 * 65536us,约78186小时。
void delay_long_us(uint32_t delay_time)
{
volatile uint32_t t0,t1;
t0 = t2_count * 65536 + __HAL_TIM_GET_COUNTER(&htim2);
while(1)
{
t1 = t2_count * 65536 + __HAL_TIM_GET_COUNTER(&htim2);
if( t1-t0 >= delay_time) break;
}
}
4.使用示例文章来源地址https://www.toymoban.com/news/detail-524129.html
delay_long_us(5); //延时5us
delay_long_us(100000); //延时100ms
delay_long_us(5000000); //延时5s
到了这里,关于STM32 使用HAL库实现微秒级长延时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!