Timer.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*********************************************************************************************************
  2. * 模块名称:Timer.c
  3. * 摘 要:Timer模块
  4. * 当前版本:1.0.0
  5. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. * 完成日期:2021年07月01日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include <stdbool.h>
  20. #include "Timer.h"
  21. #include "stdint.h"
  22. #include "gd32e230x_conf.h"
  23. #include "main.h"
  24. /*********************************************************************************************************
  25. * 内部函数声明
  26. *********************************************************************************************************/
  27. static void ConfigTimer14(uint32_t arr, uint32_t psc); //配置TIMER14
  28. /*********************************************************************************************************
  29. * 内部函数实现
  30. *********************************************************************************************************/
  31. /*********************************************************************************************************
  32. * 函数名称:ConfigTimer14
  33. * 函数功能:配置TIMER14
  34. * 输入参数:arr-自动重装值,psc-预分频器值
  35. * 输出参数:void
  36. * 返 回 值:void
  37. * 创建日期:2021年07月01日
  38. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  39. *********************************************************************************************************/
  40. static void ConfigTimer14(uint32_t arr, uint32_t psc)
  41. {
  42. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  43. //使能RCU相关时钟
  44. rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
  45. timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
  46. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  47. //配置TIMER14
  48. timer_initpara.prescaler = psc; //设置预分频器值
  49. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  50. timer_initpara.period = arr; //设置自动重装载值
  51. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  52. timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
  53. timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
  54. nvic_irq_enable(TIMER14_IRQn, 3); //配置NVIC设置优先级
  55. timer_enable(TIMER14); //使能定时器
  56. }
  57. void delete_Timer14()
  58. {
  59. timer_disable(TIMER14);
  60. nvic_irq_disable(TIMER14_IRQn);
  61. timer_interrupt_disable(TIMER14,TIMER_INT_UP);
  62. timer_deinit(TIMER14);
  63. rcu_periph_clock_disable(RCU_TIMER14);
  64. }
  65. extern uint8_t flash_flag;
  66. extern uint8_t upgrade_count;
  67. void TIMER14_IRQHandler(void)
  68. {
  69. static uint16_t int_cnt = 0;
  70. static uint16_t reboot_cnt = 0;
  71. if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  72. {
  73. timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  74. }
  75. if(int_cnt == 3)
  76. {
  77. flash_flag = 1;
  78. Upgrade *up = get_upgrade();
  79. up->led_flash_flag = 1;
  80. int_cnt = 0;
  81. }
  82. upgrade_count++;
  83. int_cnt ++;
  84. }
  85. /*********************************************************************************************************
  86. * API函数实现
  87. *********************************************************************************************************/
  88. /*********************************************************************************************************
  89. * 函数名称:InitTimer
  90. * 函数功能:初始化Timer模块
  91. * 输入参数:void
  92. * 输出参数:void
  93. * 返 回 值:void
  94. * 创建日期:2021年07月01日
  95. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  96. *********************************************************************************************************/
  97. void InitTimer(void)
  98. {
  99. ConfigTimer14(9999, 7199); //72MHz/(71+1)=1MHz,由0计数到999为1s
  100. }