timer4.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <stdlib.h>
  2. #include "timer4.h"
  3. #include "stdio.h"
  4. #include "task.h"
  5. #include "usart.h"
  6. static u8 s_repeat_flag;
  7. static time3_callback time_cb;
  8. TIM_HandleTypeDef TIM3_Handler; //定时器3
  9. task *timer3_task;
  10. void timer3_init(u16 time_set, u8 repeat_flag, time3_callback time3_cb)
  11. {
  12. s_repeat_flag = repeat_flag;
  13. time_cb = time3_cb;
  14. __HAL_RCC_TIM3_CLK_ENABLE();
  15. HAL_NVIC_SetPriority(TIM3_IRQn,3,3);
  16. HAL_NVIC_EnableIRQ(TIM3_IRQn);
  17. TIM3_Handler.Instance=TIM3;
  18. TIM3_Handler.Init.Prescaler=35999;
  19. TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
  20. TIM3_Handler.Init.Period=2 * time_set - 1;
  21. TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  22. HAL_TIM_Base_Init(&TIM3_Handler);
  23. timer3_stop();
  24. }
  25. void timer3_start(void)
  26. {
  27. HAL_TIM_Base_Start_IT(&TIM3_Handler);
  28. }
  29. void timer3_stop(void)
  30. {
  31. HAL_TIM_Base_Stop_IT(&TIM3_Handler);
  32. }
  33. void TIM3_IRQHandler(void)
  34. {
  35. //Checks whether the TIM interrupt has occurred or not
  36. if(__HAL_TIM_GET_IT_SOURCE(&TIM3_Handler,TIM_IT_UPDATE)==SET)//溢出中断
  37. {
  38. task *timer3_task;
  39. timer3_task = new_task();
  40. timer3_task->handler = time_cb;
  41. timer3_task->pdata = NULL;
  42. add_task(timer3_task);
  43. if(0 == s_repeat_flag)
  44. {
  45. timer3_stop();
  46. }
  47. __HAL_TIM_SET_COUNTER(&TIM3_Handler,0);; //清空定时器的CNT
  48. __HAL_TIM_SET_AUTORELOAD(&TIM3_Handler,1000);//恢复原来的设置
  49. }
  50. __HAL_TIM_CLEAR_IT(&TIM3_Handler, TIM_IT_UPDATE);//清除中断标志位
  51. }