Timer.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  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(detection_value == 0) // no elect
  213. {
  214. timer_disable(TIMER14); //关闭定时器
  215. Delay_Ms_2 = 0;
  216. All_On_Flag = 0;
  217. All_Off_Flag = 0;
  218. return;
  219. }
  220. if(RelaySlaveChaNum==8)
  221. {
  222. 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))//确保这里的和读取电能参数的顺序是一致的
  223. {
  224. BUFF;
  225. Relay1State();
  226. LOCK;
  227. }
  228. 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))//确保这里的和读取电能参数的顺序是一致的
  229. {
  230. BUFF;
  231. Relay2State();
  232. LOCK;
  233. }
  234. 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))//确保这里的和读取电能参数的顺序是一致的
  235. {
  236. BUFF;
  237. Relay3State();
  238. LOCK;
  239. }
  240. 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))//确保这里的和读取电能参数的顺序是一致的
  241. {
  242. BUFF;
  243. Relay4State();
  244. LOCK;
  245. }
  246. 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))//确保这里的和读取电能参数的顺序是一致的
  247. {
  248. BUFF;
  249. Relay5State();
  250. LOCK;
  251. }
  252. 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))//确保这里的和读取电能参数的顺序是一致的
  253. {
  254. BUFF;
  255. Relay6State();
  256. LOCK;
  257. }
  258. 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))//确保这里的和读取电能参数的顺序是一致的
  259. {
  260. BUFF;
  261. Relay7State();
  262. LOCK;
  263. }
  264. 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))//确保这里的和读取电能参数的顺序是一致的
  265. {
  266. BUFF;
  267. Relay8State();
  268. LOCK;
  269. }
  270. }
  271. else if(RelaySlaveChaNum==7)
  272. {
  273. 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))//确保这里的和读取电能参数的顺序是一致的
  274. {
  275. BUFF;
  276. Relay1State();
  277. LOCK;
  278. }
  279. 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))//确保这里的和读取电能参数的顺序是一致的
  280. {
  281. BUFF;
  282. Relay2State();
  283. LOCK;
  284. }
  285. 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))//确保这里的和读取电能参数的顺序是一致的
  286. {
  287. BUFF;
  288. Relay3State();
  289. LOCK;
  290. }
  291. 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))//确保这里的和读取电能参数的顺序是一致的
  292. {
  293. BUFF;
  294. Relay4State();
  295. LOCK;
  296. }
  297. 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))//确保这里的和读取电能参数的顺序是一致的
  298. {
  299. BUFF;
  300. Relay5State();
  301. LOCK;
  302. }
  303. 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))//确保这里的和读取电能参数的顺序是一致的
  304. {
  305. BUFF;
  306. Relay6State();
  307. LOCK;
  308. }
  309. 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))//确保这里的和读取电能参数的顺序是一致的
  310. {
  311. BUFF;
  312. Relay7State();
  313. LOCK;
  314. }
  315. }
  316. else if(RelaySlaveChaNum==6)
  317. {
  318. 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))//确保这里的和读取电能参数的顺序是一致的
  319. {
  320. BUFF;
  321. Relay1State();
  322. LOCK;
  323. }
  324. 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))//确保这里的和读取电能参数的顺序是一致的
  325. {
  326. BUFF;
  327. Relay2State();
  328. LOCK;
  329. }
  330. 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))//确保这里的和读取电能参数的顺序是一致的
  331. {
  332. BUFF;
  333. Relay3State();
  334. LOCK;
  335. }
  336. 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))//确保这里的和读取电能参数的顺序是一致的
  337. {
  338. BUFF;
  339. Relay4State();
  340. LOCK;
  341. }
  342. 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))//确保这里的和读取电能参数的顺序是一致的
  343. {
  344. BUFF;
  345. Relay5State();
  346. LOCK;
  347. }
  348. 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))//确保这里的和读取电能参数的顺序是一致的
  349. {
  350. BUFF;
  351. Relay6State();
  352. LOCK;
  353. }
  354. }
  355. else if(RelaySlaveChaNum==5)
  356. {
  357. 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))//确保这里的和读取电能参数的顺序是一致的
  358. {
  359. BUFF;
  360. Relay1State();
  361. LOCK;
  362. }
  363. 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))//确保这里的和读取电能参数的顺序是一致的
  364. {
  365. BUFF;
  366. Relay2State();
  367. LOCK;
  368. }
  369. 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))//确保这里的和读取电能参数的顺序是一致的
  370. {
  371. BUFF;
  372. Relay3State();
  373. LOCK;
  374. }
  375. 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))//确保这里的和读取电能参数的顺序是一致的
  376. {
  377. BUFF;
  378. Relay4State();
  379. LOCK;
  380. }
  381. 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))//确保这里的和读取电能参数的顺序是一致的
  382. {
  383. BUFF;
  384. Relay5State();
  385. LOCK;
  386. }
  387. }
  388. else if(RelaySlaveChaNum==4)
  389. {
  390. 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))//确保这里的和读取电能参数的顺序是一致的
  391. {
  392. BUFF;
  393. Relay1State();
  394. LOCK;
  395. }
  396. 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))//确保这里的和读取电能参数的顺序是一致的
  397. {
  398. BUFF;
  399. Relay2State();
  400. LOCK;
  401. }
  402. 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))//确保这里的和读取电能参数的顺序是一致的
  403. {
  404. BUFF;
  405. Relay3State();
  406. LOCK;
  407. }
  408. 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))//确保这里的和读取电能参数的顺序是一致的
  409. {
  410. BUFF;
  411. Relay4State();
  412. LOCK;
  413. }
  414. }
  415. else if(RelaySlaveChaNum==3)
  416. {
  417. 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))//确保这里的和读取电能参数的顺序是一致的
  418. {
  419. BUFF;
  420. Relay1State();
  421. LOCK;
  422. }
  423. 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))//确保这里的和读取电能参数的顺序是一致的
  424. {
  425. BUFF;
  426. Relay2State();
  427. LOCK;
  428. }
  429. 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))//确保这里的和读取电能参数的顺序是一致的
  430. {
  431. BUFF;
  432. Relay3State();
  433. LOCK;
  434. }
  435. }
  436. else if(RelaySlaveChaNum==2)
  437. {
  438. 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))//确保这里的和读取电能参数的顺序是一致的
  439. {
  440. BUFF;
  441. Relay1State();
  442. LOCK;
  443. }
  444. 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))//确保这里的和读取电能参数的顺序是一致的
  445. {
  446. BUFF;
  447. Relay2State();
  448. LOCK;
  449. }
  450. }
  451. else if(RelaySlaveChaNum==1)
  452. {
  453. 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))//确保这里的和读取电能参数的顺序是一致的
  454. {
  455. BUFF;
  456. Relay1State();
  457. LOCK;
  458. }
  459. }
  460. if((Sort_Offbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Offbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  461. {
  462. timer_disable(TIMER14); //关闭定时器
  463. Delay_Ms_2 = 0;
  464. All_Off_Flag = 0;
  465. }
  466. }
  467. else if(All_On_Flag)
  468. {
  469. if(detection_value == 0) // no elect
  470. {
  471. timer_disable(TIMER14); //关闭定时器
  472. Delay_Ms_2 = 0;
  473. All_On_Flag = 0;
  474. All_Off_Flag = 0;
  475. return;
  476. }
  477. if(RelaySlaveChaNum==8)
  478. {
  479. 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))//确保这里的和读取电能参数的顺序是一致的
  480. {
  481. BUFF;
  482. Relay1State();
  483. LOCK;
  484. }
  485. 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))//确保这里的和读取电能参数的顺序是一致的
  486. {
  487. BUFF;
  488. Relay2State();
  489. LOCK;
  490. }
  491. 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))//确保这里的和读取电能参数的顺序是一致的
  492. {
  493. BUFF;
  494. Relay3State();
  495. LOCK;
  496. }
  497. 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))//确保这里的和读取电能参数的顺序是一致的
  498. {
  499. BUFF;
  500. Relay4State();
  501. LOCK;
  502. }
  503. 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))//确保这里的和读取电能参数的顺序是一致的
  504. {
  505. BUFF;
  506. Relay5State();
  507. LOCK;
  508. }
  509. 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))//确保这里的和读取电能参数的顺序是一致的
  510. {
  511. BUFF;
  512. Relay6State();
  513. LOCK;
  514. }
  515. 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))//确保这里的和读取电能参数的顺序是一致的
  516. {
  517. BUFF;
  518. Relay7State();
  519. LOCK;
  520. }
  521. 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))//确保这里的和读取电能参数的顺序是一致的
  522. {
  523. BUFF;
  524. Relay8State();
  525. LOCK;
  526. }
  527. }
  528. else if(RelaySlaveChaNum==7)
  529. {
  530. 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))//确保这里的和读取电能参数的顺序是一致的
  531. {
  532. BUFF;
  533. Relay1State();
  534. LOCK;
  535. }
  536. 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))//确保这里的和读取电能参数的顺序是一致的
  537. {
  538. BUFF;
  539. Relay2State();
  540. LOCK;
  541. }
  542. 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))//确保这里的和读取电能参数的顺序是一致的
  543. {
  544. BUFF;
  545. Relay3State();
  546. LOCK;
  547. }
  548. 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))//确保这里的和读取电能参数的顺序是一致的
  549. {
  550. BUFF;
  551. Relay4State();
  552. LOCK;
  553. }
  554. 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))//确保这里的和读取电能参数的顺序是一致的
  555. {
  556. BUFF;
  557. Relay5State();
  558. LOCK;
  559. }
  560. 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))//确保这里的和读取电能参数的顺序是一致的
  561. {
  562. BUFF;
  563. Relay6State();
  564. LOCK;
  565. }
  566. 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))//确保这里的和读取电能参数的顺序是一致的
  567. {
  568. BUFF;
  569. Relay7State();
  570. LOCK;
  571. }
  572. }
  573. else if(RelaySlaveChaNum==6)
  574. {
  575. 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))//确保这里的和读取电能参数的顺序是一致的
  576. {
  577. BUFF;
  578. Relay1State();
  579. LOCK;
  580. }
  581. 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))//确保这里的和读取电能参数的顺序是一致的
  582. {
  583. BUFF;
  584. Relay2State();
  585. LOCK;
  586. }
  587. 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))//确保这里的和读取电能参数的顺序是一致的
  588. {
  589. BUFF;
  590. Relay3State();
  591. LOCK;
  592. }
  593. 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))//确保这里的和读取电能参数的顺序是一致的
  594. {
  595. BUFF;
  596. Relay4State();
  597. LOCK;
  598. }
  599. 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))//确保这里的和读取电能参数的顺序是一致的
  600. {
  601. BUFF;
  602. Relay5State();
  603. LOCK;
  604. }
  605. 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))//确保这里的和读取电能参数的顺序是一致的
  606. {
  607. BUFF;
  608. Relay6State();
  609. LOCK;
  610. }
  611. }
  612. else if(RelaySlaveChaNum==5)
  613. {
  614. 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))//确保这里的和读取电能参数的顺序是一致的
  615. {
  616. BUFF;
  617. Relay1State();
  618. LOCK;
  619. }
  620. 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))//确保这里的和读取电能参数的顺序是一致的
  621. {
  622. BUFF;
  623. Relay2State();
  624. LOCK;
  625. }
  626. 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))//确保这里的和读取电能参数的顺序是一致的
  627. {
  628. BUFF;
  629. Relay3State();
  630. LOCK;
  631. }
  632. 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))//确保这里的和读取电能参数的顺序是一致的
  633. {
  634. BUFF;
  635. Relay4State();
  636. LOCK;
  637. }
  638. 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))//确保这里的和读取电能参数的顺序是一致的
  639. {
  640. BUFF;
  641. Relay5State();
  642. LOCK;
  643. }
  644. }
  645. else if(RelaySlaveChaNum==4)
  646. {
  647. 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))//确保这里的和读取电能参数的顺序是一致的
  648. {
  649. BUFF;
  650. Relay1State();
  651. LOCK;
  652. }
  653. 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))//确保这里的和读取电能参数的顺序是一致的
  654. {
  655. BUFF;
  656. Relay2State();
  657. LOCK;
  658. }
  659. 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))//确保这里的和读取电能参数的顺序是一致的
  660. {
  661. BUFF;
  662. Relay3State();
  663. LOCK;
  664. }
  665. 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))//确保这里的和读取电能参数的顺序是一致的
  666. {
  667. BUFF;
  668. Relay4State();
  669. LOCK;
  670. }
  671. }
  672. else if(RelaySlaveChaNum==3)
  673. {
  674. 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))//确保这里的和读取电能参数的顺序是一致的
  675. {
  676. BUFF;
  677. Relay1State();
  678. LOCK;
  679. }
  680. 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))//确保这里的和读取电能参数的顺序是一致的
  681. {
  682. BUFF;
  683. Relay2State();
  684. LOCK;
  685. }
  686. 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))//确保这里的和读取电能参数的顺序是一致的
  687. {
  688. BUFF;
  689. Relay3State();
  690. LOCK;
  691. }
  692. }
  693. else if(RelaySlaveChaNum==2)
  694. {
  695. 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))//确保这里的和读取电能参数的顺序是一致的
  696. {
  697. BUFF;
  698. Relay1State();
  699. LOCK;
  700. }
  701. 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))//确保这里的和读取电能参数的顺序是一致的
  702. {
  703. BUFF;
  704. Relay2State();
  705. LOCK;
  706. }
  707. }
  708. else if(RelaySlaveChaNum==1)
  709. {
  710. 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))//确保这里的和读取电能参数的顺序是一致的
  711. {
  712. BUFF;
  713. Relay1State();
  714. LOCK;
  715. }
  716. }
  717. if((Sort_Onbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Onbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  718. {
  719. timer_disable(TIMER14); //关闭定时器
  720. Delay_Ms_2 = 0;
  721. All_On_Flag = 0;
  722. }
  723. }
  724. s_i2msFlag = 1; //将2ms标志位的值设置为1
  725. }
  726. }
  727. /*********************************************************************************************************
  728. * 函数名称:TIMER15_IRQHandler
  729. * 函数功能:TIMER15中断服务函数
  730. * 输入参数:void
  731. * 输出参数:void
  732. * 返 回 值:void
  733. * 创建日期:2021年07月01日
  734. * 注 意:每毫秒进入一次中断服务函数
  735. *********************************************************************************************************/
  736. void TIMER15_IRQHandler(void)
  737. {
  738. static unsigned short s_iCnt100 = 0; //定义一个静态变量s_iCnt100作为100ms计数器
  739. if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  740. {
  741. timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  742. }
  743. s_iCnt100++; //100ms计数器的计数值加1
  744. if(s_iCnt100 >= 100) //100ms计数器的计数值大于或等于
  745. {
  746. s_iCnt100 = 0; //重置100ms计数器的计数值为0
  747. s_i100msFlag = 1; //将100ms标志位的值设置为1
  748. }
  749. }
  750. /*********************************************************************************************************
  751. * 函数名称:TIMER16_IRQHandler
  752. * 函数功能:TIMER16中断服务函数
  753. * 输入参数:void
  754. * 输出参数:void
  755. * 返 回 值:void
  756. * 创建日期:2021年07月01日
  757. * 注 意:每毫秒进入一次中断服务函数
  758. *********************************************************************************************************/
  759. extern uint8_t read_kWh_flag;
  760. void TIMER16_IRQHandler(void)
  761. {
  762. static short s_iCnt1000 = 0; //定义一个静态变量s_iCnt1000作为1s计数器
  763. static uint32_t cnt = 0;
  764. // static uint32_t cntReadkWh = 0;
  765. if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  766. {
  767. timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  768. }
  769. s_iCnt1000++; //1000ms计数器的计数值加1
  770. cnt++;
  771. // cntReadkWh++;
  772. if(s_iCnt1000 >= 1000) //1000ms计数器的计数值大于或等于1000
  773. {
  774. s_iCnt1000 = 0; //重置1000ms计数器的计数值为0
  775. s_i1secFlag = 1; //将1s标志位的值设置为1
  776. }
  777. if(cnt == 60000)
  778. {
  779. write_2_minute_flag = 1;
  780. cnt = 0;
  781. }
  782. // if(cntReadkWh == 5000)
  783. // {
  784. // read_kWh_flag = 1;
  785. // cntReadkWh = 0;
  786. // }
  787. }
  788. /*********************************************************************************************************
  789. * API函数实现
  790. *********************************************************************************************************/
  791. /*********************************************************************************************************
  792. * 函数名称:InitTimer
  793. * 函数功能:初始化Timer模块
  794. * 输入参数:void
  795. * 输出参数:void
  796. * 返 回 值:void
  797. * 创建日期:2021年07月01日
  798. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  799. *********************************************************************************************************/
  800. void InitTimer(void)
  801. {
  802. // ConfigTimer2(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  803. ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  804. ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  805. ConfigTimer16(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  806. }
  807. /*********************************************************************************************************
  808. * 函数名称:Get20msFlag
  809. * 函数功能:获取2ms标志位的值
  810. * 输入参数:void
  811. * 输出参数:void
  812. * 返 回 值:s_i2msFlag-2ms标志位的值
  813. * 创建日期:2021年07月01日
  814. * 注 意:
  815. *********************************************************************************************************/
  816. unsigned char Get2msFlag(void)
  817. {
  818. return(s_i2msFlag); //返回2ms标志位的值
  819. }
  820. /*********************************************************************************************************
  821. * 函数名称:Clr20msFlag
  822. * 函数功能:清除2ms标志位
  823. * 输入参数:void
  824. * 输出参数:void
  825. * 返 回 值:void
  826. * 创建日期:2021年07月01日
  827. * 注 意:
  828. *********************************************************************************************************/
  829. void Clr2msFlag(void)
  830. {
  831. s_i2msFlag = 0; //将2ms标志位的值设置为0
  832. }
  833. /*********************************************************************************************************
  834. * 函数名称:Get100msFlag
  835. * 函数功能:获取100ms标志位的值
  836. * 输入参数:void
  837. * 输出参数:void
  838. * 返 回 值:s_i2msFlag-100ms标志位的值
  839. * 创建日期:2021年07月01日
  840. * 注 意:
  841. *********************************************************************************************************/
  842. unsigned char Get100msFlag(void)
  843. {
  844. return(s_i100msFlag); //返回100ms标志位的值
  845. }
  846. /*********************************************************************************************************
  847. * 函数名称:Clr100msFlags
  848. * 函数功能:清除100ms标志位
  849. * 输入参数:void
  850. * 输出参数:void
  851. * 返 回 值:void
  852. * 创建日期:2021年07月01日
  853. * 注 意:
  854. *********************************************************************************************************/
  855. void Clr100msFlag(void)
  856. {
  857. s_i100msFlag = 0; //将100ms标志位的值设置为0
  858. }
  859. /*********************************************************************************************************
  860. * 函数名称:Get1SecFlag
  861. * 函数功能:获取1s标志位的值
  862. * 输入参数:void
  863. * 输出参数:void
  864. * 返 回 值:s_i1secFlag-1s标志位的值
  865. * 创建日期:2021年07月01日
  866. * 注 意:
  867. *********************************************************************************************************/
  868. unsigned char Get1SecFlag(void)
  869. {
  870. return(s_i1secFlag); //返回1s标志位的值
  871. }
  872. /*********************************************************************************************************
  873. * 函数名称:Clr1SecFlag
  874. * 函数功能:清除1s标志位
  875. * 输入参数:void
  876. * 输出参数:void
  877. * 返 回 值:void
  878. * 创建日期:2021年07月01日
  879. * 注 意:
  880. *********************************************************************************************************/
  881. void Clr1SecFlag(void)
  882. {
  883. s_i1secFlag = 0; //将1s标志位的值设置为0
  884. }