1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #include <stdlib.h>
- #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);//清除中断标志位
-
- }
|