Timer.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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_SWITCH
  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_SWITCH
  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. #endif
  304. #if (RelaySlaveChaNum >= 1)
  305. 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))//确保这里的和读取电能参数的顺序是一致的
  306. {
  307. BUFF;
  308. Relay1State();
  309. LOCK;
  310. }
  311. #endif
  312. #if (RelaySlaveChaNum >= 2)
  313. 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))//确保这里的和读取电能参数的顺序是一致的
  314. {
  315. BUFF;
  316. Relay2State();
  317. LOCK;
  318. }
  319. #endif
  320. #if (RelaySlaveChaNum >= 3)
  321. 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))//确保这里的和读取电能参数的顺序是一致的
  322. {
  323. BUFF;
  324. Relay3State();
  325. LOCK;
  326. }
  327. #endif
  328. #if (RelaySlaveChaNum >= 4)
  329. 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))//确保这里的和读取电能参数的顺序是一致的
  330. {
  331. BUFF;
  332. Relay4State();
  333. LOCK;
  334. }
  335. #endif
  336. #if (RelaySlaveChaNum >= 5)
  337. 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))//确保这里的和读取电能参数的顺序是一致的
  338. {
  339. BUFF;
  340. Relay5State();
  341. LOCK;
  342. }
  343. #endif
  344. #if (RelaySlaveChaNum >= 6)
  345. 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))//确保这里的和读取电能参数的顺序是一致的
  346. {
  347. BUFF;
  348. Relay6State();
  349. LOCK;
  350. }
  351. #endif
  352. #if (RelaySlaveChaNum >= 7)
  353. 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))//确保这里的和读取电能参数的顺序是一致的
  354. {
  355. BUFF;
  356. Relay7State();
  357. LOCK;
  358. }
  359. #endif
  360. #if (RelaySlaveChaNum >= 8)
  361. 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))//确保这里的和读取电能参数的顺序是一致的
  362. {
  363. BUFF;
  364. Relay8State();
  365. LOCK;
  366. }
  367. #endif
  368. if((Sort_Onbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Onbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  369. {
  370. timer_disable(TIMER14); //关闭定时器
  371. Delay_Ms_2 = 0;
  372. All_On_Flag = 0;
  373. }
  374. }else {
  375. }
  376. s_i2msFlag = 1; //将2ms标志位的值设置为1
  377. }
  378. }
  379. /*********************************************************************************************************
  380. * 函数名称:TIMER15_IRQHandler
  381. * 函数功能:TIMER15中断服务函数
  382. * 输入参数:void
  383. * 输出参数:void
  384. * 返 回 值:void
  385. * 创建日期:2021年07月01日
  386. * 注 意:每毫秒进入一次中断服务函数
  387. *********************************************************************************************************/
  388. void TIMER15_IRQHandler(void)
  389. {
  390. static unsigned short s_iCnt100 = 0; //定义一个静态变量s_iCnt100作为100ms计数器
  391. if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  392. {
  393. timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  394. }
  395. s_iCnt100++; //100ms计数器的计数值加1
  396. if(s_iCnt100 >= 100) //100ms计数器的计数值大于或等于
  397. {
  398. s_iCnt100 = 0; //重置100ms计数器的计数值为0
  399. s_i100msFlag = 1; //将100ms标志位的值设置为1
  400. }
  401. }
  402. /*********************************************************************************************************
  403. * 函数名称:TIMER16_IRQHandler
  404. * 函数功能:TIMER16中断服务函数
  405. * 输入参数:void
  406. * 输出参数:void
  407. * 返 回 值:void
  408. * 创建日期:2021年07月01日
  409. * 注 意:每毫秒进入一次中断服务函数
  410. *********************************************************************************************************/
  411. extern uint8_t read_kWh_flag;
  412. void TIMER16_IRQHandler(void)
  413. {
  414. static short s_iCnt1000 = 0; //定义一个静态变量s_iCnt1000作为1s计数器
  415. static uint32_t cnt = 0;
  416. if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  417. {
  418. timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  419. }
  420. s_iCnt1000++; //1000ms计数器的计数值加1
  421. cnt++;
  422. if(s_iCnt1000 >= 1000) //1000ms计数器的计数值大于或等于1000
  423. {
  424. s_iCnt1000 = 0; //重置1000ms计数器的计数值为0
  425. s_i1secFlag = 1; //将1s标志位的值设置为1
  426. }
  427. if(cnt == 60000)
  428. {
  429. write_2_minute_flag = 1;
  430. cnt = 0;
  431. }
  432. }
  433. /*********************************************************************************************************
  434. * API函数实现
  435. *********************************************************************************************************/
  436. /*********************************************************************************************************
  437. * 函数名称:InitTimer
  438. * 函数功能:初始化Timer模块
  439. * 输入参数:void
  440. * 输出参数:void
  441. * 返 回 值:void
  442. * 创建日期:2021年07月01日
  443. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  444. *********************************************************************************************************/
  445. void InitTimer(void)
  446. {
  447. // ConfigTimer2(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  448. ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  449. ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  450. ConfigTimer16(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  451. }
  452. /*********************************************************************************************************
  453. * 函数名称:Get20msFlag
  454. * 函数功能:获取2ms标志位的值
  455. * 输入参数:void
  456. * 输出参数:void
  457. * 返 回 值:s_i2msFlag-2ms标志位的值
  458. * 创建日期:2021年07月01日
  459. * 注 意:
  460. *********************************************************************************************************/
  461. unsigned char Get2msFlag(void)
  462. {
  463. return(s_i2msFlag); //返回2ms标志位的值
  464. }
  465. /*********************************************************************************************************
  466. * 函数名称:Clr20msFlag
  467. * 函数功能:清除2ms标志位
  468. * 输入参数:void
  469. * 输出参数:void
  470. * 返 回 值:void
  471. * 创建日期:2021年07月01日
  472. * 注 意:
  473. *********************************************************************************************************/
  474. void Clr2msFlag(void)
  475. {
  476. s_i2msFlag = 0; //将2ms标志位的值设置为0
  477. }
  478. /*********************************************************************************************************
  479. * 函数名称:Get100msFlag
  480. * 函数功能:获取100ms标志位的值
  481. * 输入参数:void
  482. * 输出参数:void
  483. * 返 回 值:s_i2msFlag-100ms标志位的值
  484. * 创建日期:2021年07月01日
  485. * 注 意:
  486. *********************************************************************************************************/
  487. unsigned char Get100msFlag(void)
  488. {
  489. return(s_i100msFlag); //返回100ms标志位的值
  490. }
  491. /*********************************************************************************************************
  492. * 函数名称:Clr100msFlags
  493. * 函数功能:清除100ms标志位
  494. * 输入参数:void
  495. * 输出参数:void
  496. * 返 回 值:void
  497. * 创建日期:2021年07月01日
  498. * 注 意:
  499. *********************************************************************************************************/
  500. void Clr100msFlag(void)
  501. {
  502. s_i100msFlag = 0; //将100ms标志位的值设置为0
  503. }
  504. /*********************************************************************************************************
  505. * 函数名称:Get1SecFlag
  506. * 函数功能:获取1s标志位的值
  507. * 输入参数:void
  508. * 输出参数:void
  509. * 返 回 值:s_i1secFlag-1s标志位的值
  510. * 创建日期:2021年07月01日
  511. * 注 意:
  512. *********************************************************************************************************/
  513. unsigned char Get1SecFlag(void)
  514. {
  515. return(s_i1secFlag); //返回1s标志位的值
  516. }
  517. /*********************************************************************************************************
  518. * 函数名称:Clr1SecFlag
  519. * 函数功能:清除1s标志位
  520. * 输入参数:void
  521. * 输出参数:void
  522. * 返 回 值:void
  523. * 创建日期:2021年07月01日
  524. * 注 意:
  525. *********************************************************************************************************/
  526. void Clr1SecFlag(void)
  527. {
  528. s_i1secFlag = 0; //将1s标志位的值设置为0
  529. }