#include #include "timer4.h" #include "stdio.h" #include "task.h" #include "usart.h" static u8 s_repeat_flag; static time3_callback time_cb; TIM_HandleTypeDef TIM3_Handler; //定时器3 task *timer3_task; void timer3_init(u16 time_set, u8 repeat_flag, time3_callback time3_cb) { s_repeat_flag = repeat_flag; time_cb = time3_cb; __HAL_RCC_TIM3_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM3_IRQn,3,3); HAL_NVIC_EnableIRQ(TIM3_IRQn); TIM3_Handler.Instance=TIM3; TIM3_Handler.Init.Prescaler=35999; TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; TIM3_Handler.Init.Period=2 * time_set - 1; TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&TIM3_Handler); timer3_stop(); } void timer3_start(void) { HAL_TIM_Base_Start_IT(&TIM3_Handler); } void timer3_stop(void) { HAL_TIM_Base_Stop_IT(&TIM3_Handler); } void TIM3_IRQHandler(void) { //Checks whether the TIM interrupt has occurred or not if(__HAL_TIM_GET_IT_SOURCE(&TIM3_Handler,TIM_IT_UPDATE)==SET)//溢出中断 { task *timer3_task; timer3_task = new_task(); timer3_task->handler = time_cb; timer3_task->pdata = NULL; add_task(timer3_task); if(0 == s_repeat_flag) { timer3_stop(); } __HAL_TIM_SET_COUNTER(&TIM3_Handler,0);; //清空定时器的CNT __HAL_TIM_SET_AUTORELOAD(&TIM3_Handler,1000);//恢复原来的设置 } __HAL_TIM_CLEAR_IT(&TIM3_Handler, TIM_IT_UPDATE);//清除中断标志位 }