Timer.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  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 "Timer.h"
  20. #include "gd32e230x_conf.h"
  21. #include "Main.h"
  22. #include "ReadEeprom.h"
  23. #include "Sn74lvc573.h"
  24. #include "Key.h"
  25. /*********************************************************************************************************
  26. * 宏定义
  27. *********************************************************************************************************/
  28. /*********************************************************************************************************
  29. * 枚举结构体
  30. *********************************************************************************************************/
  31. /*********************************************************************************************************
  32. * 内部变量定义
  33. *********************************************************************************************************/
  34. static unsigned char s_i100msFlag = 0; //将100ms标志位的值设置为0
  35. static unsigned char s_i2msFlag = 0; //将2ms标志位的值设置为0
  36. static unsigned char s_i1secFlag = 0; //将1s标志位的值设置为0
  37. volatile unsigned long int g_del_ms =0;
  38. unsigned long int Delay_Ms_2=0;
  39. unsigned int All_On_Flag;
  40. unsigned int All_Off_Flag;
  41. extern uint16_t detection_value;
  42. extern uint32_t write_2_minute_flag;
  43. /*********************************************************************************************************
  44. * 内部函数声明
  45. *********************************************************************************************************/
  46. //static void ConfigTimer2(unsigned short arr, unsigned short psc); //配置TIMER2
  47. static void ConfigTimer14(unsigned short arr, unsigned short psc); //配置TIMER14
  48. static void ConfigTimer15(unsigned short arr, unsigned short psc); //配置TIMER15
  49. static void ConfigTimer16(unsigned short arr, unsigned short psc); //配置TIMER16
  50. /*********************************************************************************************************
  51. * 内部函数实现
  52. *********************************************************************************************************/
  53. ///*********************************************************************************************************
  54. //* 函数名称:ConfigTimer2
  55. //* 函数功能:配置TIMER2
  56. //* 输入参数:arr-自动重装值,psc-预分频器值
  57. //* 输出参数:void
  58. //* 返 回 值:void
  59. //* 创建日期:2021年07月01日
  60. //* 注 意:APB1时钟为72MHz,TIMER2时钟选择为APB2的1分频,因此,TIMER2时钟为72MHz
  61. //*********************************************************************************************************/
  62. //static void ConfigTimer2(unsigned short arr, unsigned short psc)
  63. //{
  64. // timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  65. // //使能RCU相关时钟
  66. // rcu_periph_clock_enable(RCU_TIMER2); //使能TIMER2的时钟
  67. // timer_deinit(TIMER2); //设置TIMER2参数恢复默认值
  68. // timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  69. // //配置TIMER14
  70. // timer_initpara.prescaler = psc; //设置预分频器值
  71. // timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  72. // timer_initpara.period = arr; //设置自动重装载值
  73. // timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  74. // timer_init(TIMER2, &timer_initpara); //根据参数初始化定时器
  75. // timer_interrupt_enable(TIMER2, TIMER_INT_UP); //使能定时器的更新中断
  76. // nvic_irq_enable(TIMER2_IRQn, 3); //配置NVIC设置优先级
  77. // timer_enable(TIMER2); //使能定时器
  78. //}
  79. /*********************************************************************************************************
  80. * 函数名称:ConfigTimer14
  81. * 函数功能:配置TIMER14
  82. * 输入参数:arr-自动重装值,psc-预分频器值
  83. * 输出参数:void
  84. * 返 回 值:void
  85. * 创建日期:2021年07月01日
  86. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  87. *********************************************************************************************************/
  88. static void ConfigTimer14(unsigned short arr, unsigned short psc)
  89. {
  90. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  91. //使能RCU相关时钟
  92. rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
  93. timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
  94. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  95. //配置TIMER14
  96. timer_initpara.prescaler = psc; //设置预分频器值
  97. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  98. timer_initpara.period = arr; //设置自动重装载值
  99. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  100. timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
  101. timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
  102. nvic_irq_enable(TIMER14_IRQn, 2); //配置NVIC设置优先级
  103. timer_enable(TIMER14); //使能定时器
  104. }
  105. /*********************************************************************************************************
  106. * 函数名称:ConfigTimer15
  107. * 函数功能:配置TIMER15
  108. * 输入参数:arr-自动重装值,psc-预分频器值
  109. * 输出参数:void
  110. * 返 回 值:void
  111. * 创建日期:2021年07月01日
  112. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  113. *********************************************************************************************************/
  114. static void ConfigTimer15(unsigned short arr, unsigned short psc)
  115. {
  116. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  117. //使能RCU相关时钟
  118. rcu_periph_clock_enable(RCU_TIMER15); //使能TIMER15的时钟
  119. timer_deinit(TIMER15); //设置TIMER15参数恢复默认值
  120. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  121. //配置TIMER15
  122. timer_initpara.prescaler = psc; //设置预分频器值
  123. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  124. timer_initpara.period = arr; //设置自动重装载值
  125. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  126. timer_init(TIMER15, &timer_initpara); //根据参数初始化定时器
  127. timer_interrupt_enable(TIMER15, TIMER_INT_UP); //使能定时器的更新中断
  128. nvic_irq_enable(TIMER15_IRQn, 3); //配置NVIC设置优先级
  129. timer_enable(TIMER15); //使能定时器
  130. }
  131. /*********************************************************************************************************
  132. * 函数名称:ConfigTimer16
  133. * 函数功能:配置TIMER16
  134. * 输入参数:arr-自动重装值,psc-预分频器值
  135. * 输出参数:void
  136. * 返 回 值:void
  137. * 创建日期:2021年07月01日
  138. * 注 意:APB2时钟为72MHz,TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER15和TIMER16时钟为72MHz
  139. *********************************************************************************************************/
  140. static void ConfigTimer16(unsigned short arr,unsigned short psc)
  141. {
  142. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  143. //使能RCU相关时钟
  144. rcu_periph_clock_enable(RCU_TIMER16); //使能TIMER16的时钟
  145. timer_deinit(TIMER16); //设置TIMER16参数恢复默认值
  146. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  147. //配置TIMER16
  148. timer_initpara.prescaler = psc; //设置预分频器值
  149. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  150. timer_initpara.period = arr; //设置自动重装载值
  151. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  152. timer_init(TIMER16, &timer_initpara); //根据参数初始化定时器
  153. timer_interrupt_enable(TIMER16, TIMER_INT_UP); //使能定时器的更新中断
  154. nvic_irq_enable(TIMER16_IRQn, 3); //配置NVIC设置优先级
  155. timer_enable(TIMER16); //使能定时器
  156. }
  157. ///*********************************************************************************************************
  158. //* 函数名称:TIMER2_IRQHandler
  159. //* 函数功能:TIMER14中断服务函数
  160. //* 输入参数:void
  161. //* 输出参数:void
  162. //* 返 回 值:void
  163. //* 创建日期:2021年07月01日
  164. //* 注 意:每毫秒进入一次中断服务函数
  165. //*********************************************************************************************************/
  166. //void TIMER2_IRQHandler(void)
  167. //{
  168. // if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  169. // {
  170. // timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  171. // g_del_ms--;
  172. // }
  173. //}
  174. ///*********************************************************************************************************
  175. //* 函数名称:Delay_Ms_2
  176. //* 函数功能: 定义毫秒级别的延时函数
  177. //* 输入参数:n_del_ms延时毫秒数
  178. //* 输出参数:void
  179. //* 返 回 值:void
  180. //* 创建日期:2021年07月01日
  181. //* 注 意:
  182. //*********************************************************************************************************/
  183. //void delay_ms(unsigned long int n_del_ms)
  184. //{
  185. // g_del_ms = n_del_ms;
  186. // while(g_del_ms);
  187. //}
  188. /*********************************************************************************************************
  189. * 函数名称:TIMER14_IRQHandler
  190. * 函数功能:TIMER14中断服务函数
  191. * 输入参数:void
  192. * 输出参数:void
  193. * 返 回 值:void
  194. * 创建日期:2021年07月01日
  195. * 注 意:每毫秒进入一次中断服务函数
  196. *********************************************************************************************************/
  197. void TIMER14_IRQHandler(void)
  198. {
  199. static unsigned short s_iCnt2 = 0; //定义一个静态变量s_iCnt2作为2ms计数器
  200. if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  201. {
  202. timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  203. }
  204. s_iCnt2++; //2ms计数器的计数值加1
  205. if(s_iCnt2 >= 1) //2ms计数器的计数值大于或等于
  206. {
  207. s_iCnt2 = 0; //重置2ms计数器的计数值为0
  208. Delay_Ms_2 = Delay_Ms_2 +1;
  209. s_i2msFlag = 1;
  210. if(All_Off_Flag)
  211. {
  212. #if SUPPORT_DETECTION
  213. if(detection_value == 0) // no elect
  214. {
  215. timer_disable(TIMER14); //关闭定时器
  216. Delay_Ms_2 = 0;
  217. All_On_Flag = 0;
  218. All_Off_Flag = 0;
  219. return;
  220. }
  221. #endif
  222. #if (RelaySlaveChaNum >= 1)
  223. if((EE_ACDC_Delay_ReadReg_Off[0].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[0].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[0].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  224. {
  225. BUFF;
  226. Relay1State();
  227. LOCK;
  228. }
  229. #endif
  230. #if (RelaySlaveChaNum >= 2)
  231. if((EE_ACDC_Delay_ReadReg_Off[1].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[1].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[1].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  232. {
  233. BUFF;
  234. Relay2State();
  235. LOCK;
  236. }
  237. #endif
  238. #if (RelaySlaveChaNum >= 3)
  239. if((EE_ACDC_Delay_ReadReg_Off[2].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[2].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[2].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  240. {
  241. BUFF;
  242. Relay3State();
  243. LOCK;
  244. }
  245. #endif
  246. #if (RelaySlaveChaNum >= 4)
  247. if((EE_ACDC_Delay_ReadReg_Off[3].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[3].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[3].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  248. {
  249. BUFF;
  250. Relay4State();
  251. LOCK;
  252. }
  253. #endif
  254. #if (RelaySlaveChaNum >= 5)
  255. if((EE_ACDC_Delay_ReadReg_Off[4].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[4].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[4].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  256. {
  257. BUFF;
  258. Relay5State();
  259. LOCK;
  260. }
  261. #endif
  262. #if (RelaySlaveChaNum >= 6)
  263. if((EE_ACDC_Delay_ReadReg_Off[5].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[5].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[5].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  264. {
  265. BUFF;
  266. Relay6State();
  267. LOCK;
  268. }
  269. #endif
  270. #if (RelaySlaveChaNum >= 7)
  271. if((EE_ACDC_Delay_ReadReg_Off[6].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[6].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[6].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  272. {
  273. BUFF;
  274. Relay7State();
  275. LOCK;
  276. }
  277. #endif
  278. #if (RelaySlaveChaNum >= 8)
  279. if((EE_ACDC_Delay_ReadReg_Off[7].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_Off[7].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_Off[7].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  280. {
  281. BUFF;
  282. Relay8State();
  283. LOCK;
  284. }
  285. #endif
  286. if((Sort_Offbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Offbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  287. {
  288. timer_disable(TIMER14); //关闭定时器
  289. Delay_Ms_2 = 0;
  290. All_Off_Flag = 0;
  291. }
  292. }else if(All_On_Flag)
  293. {
  294. #if SUPPORT_DETECTION
  295. if(detection_value == 0) // no elect
  296. {
  297. timer_disable(TIMER14); //关闭定时器
  298. Delay_Ms_2 = 0;
  299. All_On_Flag = 0;
  300. All_Off_Flag = 0;
  301. return;
  302. }
  303. #if ((RelaySlaveChaNum == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
  304. if((detection_value & 0x1) == 0)
  305. {
  306. uint8_t k = 0;
  307. for(k=0;k <(RelaySlaveChaNum)/2;k++)
  308. EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
  309. }
  310. if((detection_value & 0x2) == 0)
  311. {
  312. uint8_t k = 0;
  313. for(k=(RelaySlaveChaNum)/2;k <RelaySlaveChaNum;k++)
  314. EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
  315. }
  316. #endif
  317. #endif
  318. #if (RelaySlaveChaNum >= 1)
  319. if((EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  320. {
  321. BUFF;
  322. Relay1State();
  323. LOCK;
  324. }
  325. #endif
  326. #if (RelaySlaveChaNum >= 2)
  327. if((EE_ACDC_Delay_ReadReg_On[1].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[1].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[1].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  328. {
  329. BUFF;
  330. Relay2State();
  331. LOCK;
  332. }
  333. #endif
  334. #if (RelaySlaveChaNum >= 3)
  335. if((EE_ACDC_Delay_ReadReg_On[2].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[2].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[2].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  336. {
  337. BUFF;
  338. Relay3State();
  339. LOCK;
  340. }
  341. #endif
  342. #if (RelaySlaveChaNum >= 4)
  343. if((EE_ACDC_Delay_ReadReg_On[3].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[3].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[3].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  344. {
  345. BUFF;
  346. Relay4State();
  347. LOCK;
  348. }
  349. #endif
  350. #if (RelaySlaveChaNum >= 5)
  351. if((EE_ACDC_Delay_ReadReg_On[4].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[4].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[4].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  352. {
  353. BUFF;
  354. Relay5State();
  355. LOCK;
  356. }
  357. #endif
  358. #if (RelaySlaveChaNum >= 6)
  359. if((EE_ACDC_Delay_ReadReg_On[5].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[5].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[5].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  360. {
  361. BUFF;
  362. Relay6State();
  363. LOCK;
  364. }
  365. #endif
  366. #if (RelaySlaveChaNum >= 7)
  367. if((EE_ACDC_Delay_ReadReg_On[6].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[6].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[6].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  368. {
  369. BUFF;
  370. Relay7State();
  371. LOCK;
  372. }
  373. #endif
  374. #if (RelaySlaveChaNum >= 8)
  375. if((EE_ACDC_Delay_ReadReg_On[7].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[7].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[7].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  376. {
  377. BUFF;
  378. Relay8State();
  379. LOCK;
  380. }
  381. #endif
  382. if((Sort_Onbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Onbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  383. {
  384. timer_disable(TIMER14); //关闭定时器
  385. Delay_Ms_2 = 0;
  386. All_On_Flag = 0;
  387. }
  388. }else {
  389. }
  390. s_i2msFlag = 1; //将2ms标志位的值设置为1
  391. }
  392. }
  393. /*********************************************************************************************************
  394. * 函数名称:TIMER15_IRQHandler
  395. * 函数功能:TIMER15中断服务函数
  396. * 输入参数:void
  397. * 输出参数:void
  398. * 返 回 值:void
  399. * 创建日期:2021年07月01日
  400. * 注 意:每毫秒进入一次中断服务函数
  401. *********************************************************************************************************/
  402. void TIMER15_IRQHandler(void)
  403. {
  404. static unsigned short s_iCnt100 = 0; //定义一个静态变量s_iCnt100作为100ms计数器
  405. if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  406. {
  407. timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  408. }
  409. s_iCnt100++; //100ms计数器的计数值加1
  410. if(s_iCnt100 >= 100) //100ms计数器的计数值大于或等于
  411. {
  412. s_iCnt100 = 0; //重置100ms计数器的计数值为0
  413. s_i100msFlag = 1; //将100ms标志位的值设置为1
  414. }
  415. }
  416. /*********************************************************************************************************
  417. * 函数名称:TIMER16_IRQHandler
  418. * 函数功能:TIMER16中断服务函数
  419. * 输入参数:void
  420. * 输出参数:void
  421. * 返 回 值:void
  422. * 创建日期:2021年07月01日
  423. * 注 意:每毫秒进入一次中断服务函数
  424. *********************************************************************************************************/
  425. extern uint8_t read_kWh_flag;
  426. void TIMER16_IRQHandler(void)
  427. {
  428. static short s_iCnt1000 = 0; //定义一个静态变量s_iCnt1000作为1s计数器
  429. static uint32_t cnt = 0;
  430. if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  431. {
  432. timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  433. }
  434. s_iCnt1000++; //1000ms计数器的计数值加1
  435. cnt++;
  436. if(s_iCnt1000 >= 1000) //1000ms计数器的计数值大于或等于1000
  437. {
  438. s_iCnt1000 = 0; //重置1000ms计数器的计数值为0
  439. s_i1secFlag = 1; //将1s标志位的值设置为1
  440. }
  441. if(cnt == 30000)
  442. {
  443. write_2_minute_flag = 1;
  444. cnt = 0;
  445. }
  446. }
  447. /*********************************************************************************************************
  448. * API函数实现
  449. *********************************************************************************************************/
  450. /*********************************************************************************************************
  451. * 函数名称:InitTimer
  452. * 函数功能:初始化Timer模块
  453. * 输入参数:void
  454. * 输出参数:void
  455. * 返 回 值:void
  456. * 创建日期:2021年07月01日
  457. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  458. *********************************************************************************************************/
  459. void InitTimer(void)
  460. {
  461. // ConfigTimer2(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  462. ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  463. ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  464. ConfigTimer16(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  465. }
  466. /*********************************************************************************************************
  467. * 函数名称:Get20msFlag
  468. * 函数功能:获取2ms标志位的值
  469. * 输入参数:void
  470. * 输出参数:void
  471. * 返 回 值:s_i2msFlag-2ms标志位的值
  472. * 创建日期:2021年07月01日
  473. * 注 意:
  474. *********************************************************************************************************/
  475. unsigned char Get2msFlag(void)
  476. {
  477. return(s_i2msFlag); //返回2ms标志位的值
  478. }
  479. /*********************************************************************************************************
  480. * 函数名称:Clr20msFlag
  481. * 函数功能:清除2ms标志位
  482. * 输入参数:void
  483. * 输出参数:void
  484. * 返 回 值:void
  485. * 创建日期:2021年07月01日
  486. * 注 意:
  487. *********************************************************************************************************/
  488. void Clr2msFlag(void)
  489. {
  490. s_i2msFlag = 0; //将2ms标志位的值设置为0
  491. }
  492. /*********************************************************************************************************
  493. * 函数名称:Get100msFlag
  494. * 函数功能:获取100ms标志位的值
  495. * 输入参数:void
  496. * 输出参数:void
  497. * 返 回 值:s_i2msFlag-100ms标志位的值
  498. * 创建日期:2021年07月01日
  499. * 注 意:
  500. *********************************************************************************************************/
  501. unsigned char Get100msFlag(void)
  502. {
  503. return(s_i100msFlag); //返回100ms标志位的值
  504. }
  505. /*********************************************************************************************************
  506. * 函数名称:Clr100msFlags
  507. * 函数功能:清除100ms标志位
  508. * 输入参数:void
  509. * 输出参数:void
  510. * 返 回 值:void
  511. * 创建日期:2021年07月01日
  512. * 注 意:
  513. *********************************************************************************************************/
  514. void Clr100msFlag(void)
  515. {
  516. s_i100msFlag = 0; //将100ms标志位的值设置为0
  517. }
  518. /*********************************************************************************************************
  519. * 函数名称:Get1SecFlag
  520. * 函数功能:获取1s标志位的值
  521. * 输入参数:void
  522. * 输出参数:void
  523. * 返 回 值:s_i1secFlag-1s标志位的值
  524. * 创建日期:2021年07月01日
  525. * 注 意:
  526. *********************************************************************************************************/
  527. unsigned char Get1SecFlag(void)
  528. {
  529. return(s_i1secFlag); //返回1s标志位的值
  530. }
  531. /*********************************************************************************************************
  532. * 函数名称:Clr1SecFlag
  533. * 函数功能:清除1s标志位
  534. * 输入参数:void
  535. * 输出参数:void
  536. * 返 回 值:void
  537. * 创建日期:2021年07月01日
  538. * 注 意:
  539. *********************************************************************************************************/
  540. void Clr1SecFlag(void)
  541. {
  542. s_i1secFlag = 0; //将1s标志位的值设置为0
  543. }