采用的定时器为TIM3
(TIM1
和TIM2
已经被用于产生PWM波了),TIM3
对应的是APB1 Timer clocks
,时钟频率Tclk
为72MHz。
溢出时间(Tout = frac{(arr + 1) * (psc + 1)}{Tclk})
本项目PSC
和arr
如图所示,溢出时间为10ms,即10ms触发一次定时器中断。
定时器中断处理逻辑为(个人理解,如有不对请指正): TIM3_IRQHandler
处理TIM3
的所有中断,调用HAL_TIM_IRQHandler(&htim3)
,在HAL_TIM_IRQHandler(&htim)
中,检测到是TIM Update event
,清除TIM_FLAG_UPDATE
标志位,调用HAL_TIM_PeriodElapsedCallback(htim)
。
stm32f1xx_hal_tim.c
中,HAL_TIM_PeriodElapsedCallback(htim)
定义如下,带__weak
标识符,因此直接在main.c
里面重新定义HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
// stm32f1xx_hal_tim.c
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(htim);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
*/
}
//main.c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
//10ms for an timer interrupt
time_count_it++;
// 切换当已经清洗到泳池中心时,切换分母
if (round_count > (zDominator[zDominator_index % 4] / 2)) {
round_count = 1;
zDominator_index++;
}
if (time_count_it > (time_wall2wall * round_count / zDominator[zDominator_index % 4])) {
evt = evt_time_it;
time_count_it = 0;
HAL_TIM_Base_Stop_IT(&htim3);
}
}
如果要在HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
里判断是哪个定时器触发的中断,添加
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//添加回调后的程序逻辑
if (htim->Instance == htim3.Instance) //判断是否定时器2
{
}
//或者
if (htim == &htim3) {
}
}