Timer.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 "gd32e23x_timer.h"
  23. #include "main.h"
  24. static uint8_t s_i100mSFlag = 0; //将100ms标志位的值设置为0
  25. static uint8_t s_i1secFlag = 0; //将1s标志位的值设置为0
  26. uint8_t Read_data_cnt = 0;
  27. uint32_t Delay_N_mS = 0;
  28. uint32_t RL_delay_cnt[Output_ChN_default + 1] = {0};
  29. uint32_t RL_delay_Limit[Output_ChN_default + 1] = {0};
  30. #if SUPPORT_ZERO_LINE
  31. uint32_t RL_N_delay_cnt = 0;
  32. uint32_t RL_N_delay_Limit = 0;
  33. #endif
  34. extern uint8_t RL_begin_delay_flag[Output_ChN_default + 1];
  35. extern uint8_t RL_end_delay_flag[Output_ChN_default + 1];
  36. #if SUPPORT_ZERO_LINE
  37. extern uint8_t RL_N_begin_delay_flag; //add by liyi
  38. extern uint8_t RL_N_end_delay_flag; // add by liyi
  39. #endif
  40. extern uint8_t write_kwh2Eeprom_flag; // add by liyi
  41. extern uint8_t kwh_200ms_read_flag; // add by liyi
  42. /*********************************************************************************************************
  43. * 内部函数声明
  44. *********************************************************************************************************/
  45. static void ConfigTimer14(uint32_t arr, uint32_t psc); //配置TIMER14
  46. static void ConfigTimer16(uint32_t arr, uint32_t psc);
  47. static void ConfigTimer14(uint32_t arr, uint32_t psc)
  48. {
  49. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  50. //使能RCU相关时钟
  51. rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
  52. timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
  53. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  54. //配置TIMER14
  55. timer_initpara.prescaler = psc; //设置预分频器值
  56. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  57. timer_initpara.period = arr; //设置自动重装载值
  58. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  59. timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
  60. timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
  61. nvic_irq_enable(TIMER14_IRQn, 3); //配置NVIC设置优先级
  62. timer_enable(TIMER14); //使能定时器
  63. }
  64. static void ConfigTimer16(uint32_t arr,uint32_t psc)
  65. {
  66. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  67. //使能RCU相关时钟
  68. rcu_periph_clock_enable(RCU_TIMER16); //使能TIMER16的时钟
  69. timer_deinit(TIMER16); //设置TIMER16参数恢复默认值
  70. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  71. //配置TIMER16
  72. timer_initpara.prescaler = psc; //设置预分频器值
  73. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  74. timer_initpara.period = arr; //设置自动重装载值
  75. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  76. timer_init(TIMER16, &timer_initpara); //根据参数初始化定时器
  77. timer_interrupt_enable(TIMER16, TIMER_INT_UP); //使能定时器的更新中断
  78. nvic_irq_enable(TIMER16_IRQn, 3); //配置NVIC设置优先级
  79. timer_enable(TIMER16); //使能定时器
  80. }
  81. extern uint8_t flash_flag;
  82. void TIMER14_IRQHandler(void)
  83. {
  84. uint8_t i = 0;
  85. //static int count = 0;
  86. if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  87. {
  88. timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  89. }
  90. for(i = 0;i < Output_ChN_default;i++)
  91. {
  92. if(RL_begin_delay_flag[i] > 0)
  93. {
  94. if(RL_delay_cnt[i] < RL_delay_Limit[i])
  95. {
  96. RL_delay_cnt[i]++;
  97. }
  98. else
  99. {
  100. RL_delay_cnt[i] = 0;
  101. RL_end_delay_flag[i] = 1;
  102. RL_begin_delay_flag[i] = 0;
  103. }
  104. }
  105. }
  106. // Ch N add by liyi
  107. #if SUPPORT_ZERO_LINE
  108. if(RL_N_begin_delay_flag > 0)
  109. {
  110. if(RL_N_delay_cnt < RL_N_delay_Limit)
  111. {
  112. RL_N_delay_cnt++;
  113. }else
  114. {
  115. RL_N_delay_cnt = 0;
  116. RL_N_end_delay_flag = 1;
  117. RL_N_begin_delay_flag = 0;
  118. }
  119. }
  120. #endif
  121. // if(count == 2000)
  122. // {
  123. // write_kwh2Eeprom_flag = 1;
  124. // count = 0;
  125. // }
  126. // count ++;
  127. if(Delay_N_mS > 0)
  128. {
  129. Delay_N_mS--;
  130. }
  131. }
  132. void TIMER16_IRQHandler(void)
  133. {
  134. if(timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  135. {
  136. timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  137. }
  138. if(Read_data_cnt < 3)
  139. {
  140. Read_data_cnt++;
  141. }
  142. else
  143. {
  144. Read_data_cnt = 0;
  145. flash_flag = 1;
  146. Start_Read_Flag = true;
  147. }
  148. s_i1secFlag = 1;
  149. }
  150. /*********************************************************************************************************
  151. * API函数实现
  152. *********************************************************************************************************/
  153. /*********************************************************************************************************
  154. * 函数名称:InitTimer
  155. * 函数功能:初始化Timer模块
  156. * 输入参数:void
  157. * 输出参数:void
  158. * 返 回 值:void
  159. * 创建日期:2021年07月01日
  160. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  161. *********************************************************************************************************/
  162. void InitTimer(void)
  163. {
  164. ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1s
  165. ConfigTimer16(2999, 7199); // data ....
  166. }
  167. uint8_t Get1SecFlag(void)
  168. {
  169. return(s_i1secFlag); //返回1s标志位的值
  170. }
  171. void Clr1SecFlag(void)
  172. {
  173. s_i1secFlag = 0; //将1s标志位的值设置为0
  174. }
  175. unsigned char Get100msFlag(void)
  176. {
  177. return(s_i100mSFlag); //返回1s标志位的值
  178. }
  179. void Clr100msFlag(void)
  180. {
  181. s_i100mSFlag = 0; //将1s标志位的值设置为0
  182. }