Timer.c 23 KB

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