定时器中断实现以固定频率执行某项操作
...Less than 1 minute
定时器中断实现以固定频率执行某项操作
作用:定时器中断可以提供精确定时,无论主线程在执行什么操作,只要到达设定的定时时间,定时器中断都会触发。因此,定时器中断可以确保数据帧上传的时间间隔非常精确。
1. 初始化定时器
TIM_HandleTypeDef htim4;
void MX_TIM4_Init(void)
{
htim4.Instance = TIM4;
htim4.Init.Prescaler = 7199; // 10K频率
htim4.Init.CounterMode = TIM_COUNTERMODE_UP; // 递增计数器
htim4.Init.Period = 500; // 50毫秒产生一次中断
HAL_TIM_Base_Init(&htim4);
HAL_TIM_Base_Start_IT(&htim4);
}
2. 配置NVIC中断优先级
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM4)
{
// TIM4时钟使能
__HAL_RCC_TIM4_CLK_ENABLE();
// TIM4中断配置
HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM4_IRQn);
}
}
3. 实现回调函数
void TIM4_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim4);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM4)
{
// 此处调用需要固定频率执行的操作
UploadDateFrame();
}
}
4. 思考
STM32在执行裸机程序时只有一个线程,一旦功能复杂,不同功能模块之间相互阻塞,就很难保证时效性。使用定时器中断不但可以实现类似多线程的效果,也可以实现非阻塞的按键防抖。