Timer.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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 "gd32e230x_conf.h"
  20. #include <stdbool.h>
  21. #include "Timer.h"
  22. #include "Main.h"
  23. #include "ReadEeprom.h"
  24. #include "Sn74hc573.h"
  25. #include "stdint.h"
  26. /*********************************************************************************************************
  27. * 宏定义
  28. *********************************************************************************************************/
  29. /*********************************************************************************************************
  30. * 枚举结构体
  31. *********************************************************************************************************/
  32. /*********************************************************************************************************
  33. * 内部变量定义
  34. *********************************************************************************************************/
  35. static uint8_t s_i100mSFlag = 0; //将100ms标志位的值设置为0
  36. static uint8_t s_i1secFlag = 0; //将1s标志位的值设置为0
  37. uint8_t Wr_eeprom_wait_cnt = 0;
  38. uint8_t Read_data_cnt = 0;
  39. uint8_t ch_cnt = 0;
  40. uint32_t Delay_N_mS = 0;
  41. uint32_t RL_delay_cnt[Output_ChN_default + 1] = {0};
  42. uint32_t RL_delay_Limit[Output_ChN_default + 1] = {0};
  43. uint32_t RL_N_delay_cnt = 0;
  44. uint32_t RL_N_delay_Limit = 0;
  45. extern uint8_t RL_begin_delay_flag[Output_ChN_default + 1];
  46. extern uint8_t RL_end_delay_flag[Output_ChN_default + 1];
  47. extern uint8_t RL_N_begin_delay_flag; //add by liyi
  48. extern uint8_t RL_N_end_delay_flag; // add by liyi
  49. extern uint8_t write_kwh2Eeprom_flag; // add by liyi
  50. extern uint8_t kwh_200ms_read_flag; // add by liyi
  51. /*********************************************************************************************************
  52. * 内部函数声明
  53. *********************************************************************************************************/
  54. static void ConfigTimer14(uint32_t arr, uint32_t psc); //配置TIMER14
  55. static void ConfigTimer15(uint32_t arr, uint32_t psc); //配置TIMER15
  56. static void ConfigTimer16(uint32_t arr, uint32_t psc); //配置TIMER16
  57. /*********************************************************************************************************
  58. * 内部函数实现
  59. *********************************************************************************************************/
  60. /*********************************************************************************************************
  61. * 函数名称:ConfigTimer14
  62. * 函数功能:配置TIMER14
  63. * 输入参数:arr-自动重装值,psc-预分频器值
  64. * 输出参数:void
  65. * 返 回 值:void
  66. * 创建日期:2021年07月01日
  67. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  68. *********************************************************************************************************/
  69. static void ConfigTimer14(uint32_t arr, uint32_t psc)
  70. {
  71. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  72. //使能RCU相关时钟
  73. rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
  74. timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
  75. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  76. //配置TIMER14
  77. timer_initpara.prescaler = psc; //设置预分频器值
  78. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  79. timer_initpara.period = arr; //设置自动重装载值
  80. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  81. timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
  82. timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
  83. nvic_irq_enable(TIMER14_IRQn, 2); //配置NVIC设置优先级
  84. timer_enable(TIMER14); //使能定时器
  85. }
  86. /*********************************************************************************************************
  87. * 函数名称:ConfigTimer15
  88. * 函数功能:配置TIMER15
  89. * 输入参数:arr-自动重装值,psc-预分频器值
  90. * 输出参数:void
  91. * 返 回 值:void
  92. * 创建日期:2021年07月01日
  93. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  94. *********************************************************************************************************/
  95. static void ConfigTimer15(uint32_t arr, uint32_t psc)
  96. {
  97. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  98. //使能RCU相关时钟
  99. rcu_periph_clock_enable(RCU_TIMER15); //使能TIMER15的时钟
  100. timer_deinit(TIMER15); //设置TIMER15参数恢复默认值
  101. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  102. //配置TIMER15
  103. timer_initpara.prescaler = psc; //设置预分频器值
  104. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  105. timer_initpara.period = arr; //设置自动重装载值
  106. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  107. timer_init(TIMER15, &timer_initpara); //根据参数初始化定时器
  108. timer_interrupt_enable(TIMER15, TIMER_INT_UP); //使能定时器的更新中断
  109. nvic_irq_enable(TIMER15_IRQn, 3); //配置NVIC设置优先级
  110. timer_enable(TIMER15); //使能定时器
  111. }
  112. /*********************************************************************************************************
  113. * 函数名称:ConfigTimer16
  114. * 函数功能:配置TIMER16
  115. * 输入参数:arr-自动重装值,psc-预分频器值
  116. * 输出参数:void
  117. * 返 回 值:void
  118. * 创建日期:2021年07月01日
  119. * 注 意:APB2时钟为72MHz,TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER15和TIMER16时钟为72MHz
  120. *********************************************************************************************************/
  121. static void ConfigTimer16(uint32_t arr,uint32_t psc)
  122. {
  123. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  124. //使能RCU相关时钟
  125. rcu_periph_clock_enable(RCU_TIMER16); //使能TIMER16的时钟
  126. timer_deinit(TIMER16); //设置TIMER16参数恢复默认值
  127. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  128. //配置TIMER16
  129. timer_initpara.prescaler = psc; //设置预分频器值
  130. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  131. timer_initpara.period = arr; //设置自动重装载值
  132. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  133. timer_init(TIMER16, &timer_initpara); //根据参数初始化定时器
  134. timer_interrupt_enable(TIMER16, TIMER_INT_UP); //使能定时器的更新中断
  135. nvic_irq_enable(TIMER16_IRQn, 3); //配置NVIC设置优先级
  136. timer_enable(TIMER16); //使能定时器
  137. }
  138. /*********************************************************************************************************
  139. * 函数名称:TIMER14_IRQHandler
  140. * 函数功能:TIMER14中断服务函数
  141. * 输入参数:void
  142. * 输出参数:void
  143. * 返 回 值:void
  144. * 创建日期:2021年07月01日
  145. * 注 意:每毫秒进入一次中断服务函数
  146. *********************************************************************************************************/
  147. void TIMER14_IRQHandler(void)
  148. {
  149. uint8_t i = 0;
  150. if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  151. {
  152. timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  153. }
  154. for(i = 0;i < Output_ChN_default;i++)
  155. {
  156. if(RL_begin_delay_flag[i] > 0)
  157. {
  158. if(RL_delay_cnt[i] < RL_delay_Limit[i])
  159. {
  160. RL_delay_cnt[i]++;
  161. }
  162. else
  163. {
  164. RL_delay_cnt[i] = 0;
  165. RL_end_delay_flag[i] = 1;
  166. RL_begin_delay_flag[i] = 0;
  167. }
  168. }
  169. }
  170. // Ch N add by liyi
  171. if(RL_N_begin_delay_flag > 0)
  172. {
  173. if(RL_N_delay_cnt < RL_N_delay_Limit)
  174. {
  175. RL_N_delay_cnt++;
  176. }else
  177. {
  178. RL_N_delay_cnt = 0;
  179. RL_N_end_delay_flag = 1;
  180. RL_N_begin_delay_flag = 0;
  181. }
  182. }
  183. if(Delay_N_mS > 0)
  184. {
  185. Delay_N_mS--;
  186. }
  187. }
  188. /*********************************************************************************************************
  189. * 函数名称:TIMER15_IRQHandler
  190. * 函数功能:TIMER15中断服务函数
  191. * 输入参数:void
  192. * 输出参数:void
  193. * 返 回 值:void
  194. * 创建日期:2021年07月01日
  195. * 注 意:每毫秒进入一次中断服务函数
  196. *********************************************************************************************************/
  197. void TIMER15_IRQHandler(void)
  198. {
  199. static uint32_t s_iCnt100 = 0; //定义一个静态变量s_iCnt100作为100ms计数器
  200. if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  201. {
  202. timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  203. }
  204. }
  205. /*********************************************************************************************************
  206. * 函数名称:TIMER16_IRQHandler
  207. * 函数功能:TIMER16中断服务函数
  208. * 输入参数:void
  209. * 输出参数:void
  210. * 返 回 值:void
  211. * 创建日期:2021年07月01日
  212. * 注 意:每1秒进入一次中断服务函数
  213. *********************************************************************************************************/
  214. void TIMER16_IRQHandler(void)
  215. {
  216. static uint32_t s_iCnt1000 = 0;//定义一个静态变量s_iCnt1000作为1s计数器
  217. static uint8_t s_iCntread =0;
  218. if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  219. {
  220. timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  221. }
  222. if(Read_data_cnt < 3)
  223. {
  224. Read_data_cnt++;
  225. }
  226. else
  227. {
  228. Read_data_cnt = 0;
  229. Start_Read_Flag = true;
  230. }
  231. if(s_iCnt1000 == 60)
  232. {
  233. s_iCnt1000 = 0;
  234. write_kwh2Eeprom_flag = 1;
  235. }
  236. if( s_iCntread == 5 )
  237. {
  238. kwh_200ms_read_flag = 1;
  239. s_iCntread = 0;
  240. }
  241. s_iCnt1000 ++;
  242. s_iCntread++;
  243. s_i1secFlag = 1; //将1s标志位的值设置为1
  244. }
  245. /*********************************************************************************************************
  246. * API函数实现
  247. *********************************************************************************************************/
  248. /*********************************************************************************************************
  249. * 函数名称:InitTimer
  250. * 函数功能:初始化Timer模块
  251. * 输入参数:void
  252. * 输出参数:void
  253. * 返 回 值:void
  254. * 创建日期:2021年07月01日
  255. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  256. *********************************************************************************************************/
  257. void InitTimer(void)
  258. {
  259. Delay_N_mS = 0;
  260. ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  261. //ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  262. ConfigTimer16(9999, 7199); //72MHz/(7199+1)=0.01MHz,由0计数到9999为1s
  263. }
  264. /*********************************************************************************************************
  265. * 函数名称:Get1SecFlag
  266. * 函数功能:获取1s标志位的值
  267. * 输入参数:void
  268. * 输出参数:void
  269. * 返 回 值:s_i1secFlag-1s标志位的值
  270. * 创建日期:2021年07月01日
  271. * 注 意:
  272. *********************************************************************************************************/
  273. uint8_t Get1SecFlag(void)
  274. {
  275. return(s_i1secFlag); //返回1s标志位的值
  276. }
  277. /*********************************************************************************************************
  278. * 函数名称:Clr1SecFlag
  279. * 函数功能:清除1s标志位
  280. * 输入参数:void
  281. * 输出参数:void
  282. * 返 回 值:void
  283. * 创建日期:2021年07月01日
  284. * 注 意:
  285. *********************************************************************************************************/
  286. void Clr1SecFlag(void)
  287. {
  288. s_i1secFlag = 0; //将1s标志位的值设置为0
  289. }
  290. /*********************************************************************************************************
  291. * 函数名称:Get100msFlag
  292. * 函数功能:获取100ms标志位的值
  293. * 输入参数:void
  294. * 输出参数:void
  295. * 返 回 值:s_i1secFlag-1s标志位的值
  296. * 创建日期:2021年07月01日
  297. * 注 意:
  298. *********************************************************************************************************/
  299. unsigned char Get100msFlag(void)
  300. {
  301. return(s_i100mSFlag); //返回1s标志位的值
  302. }
  303. /*********************************************************************************************************
  304. * 函数名称:Clr100msFlag
  305. * 函数功能:清除100ms标志位
  306. * 输入参数:void
  307. * 输出参数:void
  308. * 返 回 值:void
  309. * 创建日期:2021年07月01日
  310. * 注 意:
  311. *********************************************************************************************************/
  312. void Clr100msFlag(void)
  313. {
  314. s_i100mSFlag = 0; //将1s标志位的值设置为0
  315. }
  316. void delay_ms(uint32_t n_del_ms)
  317. {
  318. Delay_N_mS = n_del_ms;
  319. while(Delay_N_mS > 0);
  320. }