Timer.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  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. /*********************************************************************************************************
  25. * 宏定义
  26. *********************************************************************************************************/
  27. /*********************************************************************************************************
  28. * 枚举结构体
  29. *********************************************************************************************************/
  30. /*********************************************************************************************************
  31. * 内部变量定义
  32. *********************************************************************************************************/
  33. static unsigned char s_i100msFlag = 0; //将100ms标志位的值设置为0
  34. static unsigned char s_i2msFlag = 0; //将2ms标志位的值设置为0
  35. static unsigned char s_i1secFlag = 0; //将1s标志位的值设置为0
  36. volatile unsigned long int g_del_ms =0;
  37. unsigned long int Delay_Ms_2=0;
  38. unsigned int All_On_Flag;
  39. unsigned int All_Off_Flag;
  40. extern uint32_t write_2_minute_flag;
  41. /*********************************************************************************************************
  42. * 内部函数声明
  43. *********************************************************************************************************/
  44. //static void ConfigTimer2(unsigned short arr, unsigned short psc); //配置TIMER2
  45. static void ConfigTimer14(unsigned short arr, unsigned short psc); //配置TIMER14
  46. static void ConfigTimer15(unsigned short arr, unsigned short psc); //配置TIMER15
  47. static void ConfigTimer16(unsigned short arr, unsigned short psc); //配置TIMER16
  48. /*********************************************************************************************************
  49. * 内部函数实现
  50. *********************************************************************************************************/
  51. ///*********************************************************************************************************
  52. //* 函数名称:ConfigTimer2
  53. //* 函数功能:配置TIMER2
  54. //* 输入参数:arr-自动重装值,psc-预分频器值
  55. //* 输出参数:void
  56. //* 返 回 值:void
  57. //* 创建日期:2021年07月01日
  58. //* 注 意:APB1时钟为72MHz,TIMER2时钟选择为APB2的1分频,因此,TIMER2时钟为72MHz
  59. //*********************************************************************************************************/
  60. //static void ConfigTimer2(unsigned short arr, unsigned short psc)
  61. //{
  62. // timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  63. // //使能RCU相关时钟
  64. // rcu_periph_clock_enable(RCU_TIMER2); //使能TIMER2的时钟
  65. // timer_deinit(TIMER2); //设置TIMER2参数恢复默认值
  66. // timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  67. // //配置TIMER14
  68. // timer_initpara.prescaler = psc; //设置预分频器值
  69. // timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  70. // timer_initpara.period = arr; //设置自动重装载值
  71. // timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  72. // timer_init(TIMER2, &timer_initpara); //根据参数初始化定时器
  73. // timer_interrupt_enable(TIMER2, TIMER_INT_UP); //使能定时器的更新中断
  74. // nvic_irq_enable(TIMER2_IRQn, 3); //配置NVIC设置优先级
  75. // timer_enable(TIMER2); //使能定时器
  76. //}
  77. /*********************************************************************************************************
  78. * 函数名称:ConfigTimer14
  79. * 函数功能:配置TIMER14
  80. * 输入参数:arr-自动重装值,psc-预分频器值
  81. * 输出参数:void
  82. * 返 回 值:void
  83. * 创建日期:2021年07月01日
  84. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  85. *********************************************************************************************************/
  86. static void ConfigTimer14(unsigned short arr, unsigned short psc)
  87. {
  88. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  89. //使能RCU相关时钟
  90. rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
  91. timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
  92. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  93. //配置TIMER14
  94. timer_initpara.prescaler = psc; //设置预分频器值
  95. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  96. timer_initpara.period = arr; //设置自动重装载值
  97. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  98. timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
  99. timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
  100. nvic_irq_enable(TIMER14_IRQn, 2); //配置NVIC设置优先级
  101. timer_enable(TIMER14); //使能定时器
  102. }
  103. /*********************************************************************************************************
  104. * 函数名称:ConfigTimer15
  105. * 函数功能:配置TIMER15
  106. * 输入参数:arr-自动重装值,psc-预分频器值
  107. * 输出参数:void
  108. * 返 回 值:void
  109. * 创建日期:2021年07月01日
  110. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  111. *********************************************************************************************************/
  112. static void ConfigTimer15(unsigned short arr, unsigned short psc)
  113. {
  114. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  115. //使能RCU相关时钟
  116. rcu_periph_clock_enable(RCU_TIMER15); //使能TIMER15的时钟
  117. timer_deinit(TIMER15); //设置TIMER15参数恢复默认值
  118. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  119. //配置TIMER15
  120. timer_initpara.prescaler = psc; //设置预分频器值
  121. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  122. timer_initpara.period = arr; //设置自动重装载值
  123. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  124. timer_init(TIMER15, &timer_initpara); //根据参数初始化定时器
  125. timer_interrupt_enable(TIMER15, TIMER_INT_UP); //使能定时器的更新中断
  126. nvic_irq_enable(TIMER15_IRQn, 3); //配置NVIC设置优先级
  127. timer_enable(TIMER15); //使能定时器
  128. }
  129. /*********************************************************************************************************
  130. * 函数名称:ConfigTimer16
  131. * 函数功能:配置TIMER16
  132. * 输入参数:arr-自动重装值,psc-预分频器值
  133. * 输出参数:void
  134. * 返 回 值:void
  135. * 创建日期:2021年07月01日
  136. * 注 意:APB2时钟为72MHz,TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER15和TIMER16时钟为72MHz
  137. *********************************************************************************************************/
  138. static void ConfigTimer16(unsigned short arr,unsigned short psc)
  139. {
  140. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  141. //使能RCU相关时钟
  142. rcu_periph_clock_enable(RCU_TIMER16); //使能TIMER16的时钟
  143. timer_deinit(TIMER16); //设置TIMER16参数恢复默认值
  144. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  145. //配置TIMER16
  146. timer_initpara.prescaler = psc; //设置预分频器值
  147. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  148. timer_initpara.period = arr; //设置自动重装载值
  149. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  150. timer_init(TIMER16, &timer_initpara); //根据参数初始化定时器
  151. timer_interrupt_enable(TIMER16, TIMER_INT_UP); //使能定时器的更新中断
  152. nvic_irq_enable(TIMER16_IRQn, 3); //配置NVIC设置优先级
  153. timer_enable(TIMER16); //使能定时器
  154. }
  155. ///*********************************************************************************************************
  156. //* 函数名称:TIMER2_IRQHandler
  157. //* 函数功能:TIMER14中断服务函数
  158. //* 输入参数:void
  159. //* 输出参数:void
  160. //* 返 回 值:void
  161. //* 创建日期:2021年07月01日
  162. //* 注 意:每毫秒进入一次中断服务函数
  163. //*********************************************************************************************************/
  164. //void TIMER2_IRQHandler(void)
  165. //{
  166. // if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  167. // {
  168. // timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  169. // g_del_ms--;
  170. // }
  171. //}
  172. ///*********************************************************************************************************
  173. //* 函数名称:Delay_Ms_2
  174. //* 函数功能: 定义毫秒级别的延时函数
  175. //* 输入参数:n_del_ms延时毫秒数
  176. //* 输出参数:void
  177. //* 返 回 值:void
  178. //* 创建日期:2021年07月01日
  179. //* 注 意:
  180. //*********************************************************************************************************/
  181. //void delay_ms(unsigned long int n_del_ms)
  182. //{
  183. // g_del_ms = n_del_ms;
  184. // while(g_del_ms);
  185. //}
  186. /*********************************************************************************************************
  187. * 函数名称:TIMER14_IRQHandler
  188. * 函数功能:TIMER14中断服务函数
  189. * 输入参数:void
  190. * 输出参数:void
  191. * 返 回 值:void
  192. * 创建日期:2021年07月01日
  193. * 注 意:每毫秒进入一次中断服务函数
  194. *********************************************************************************************************/
  195. void TIMER14_IRQHandler(void)
  196. {
  197. static unsigned short s_iCnt2 = 0; //定义一个静态变量s_iCnt2作为2ms计数器
  198. if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  199. {
  200. timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  201. }
  202. s_iCnt2++; //2ms计数器的计数值加1
  203. if(s_iCnt2 >= 1) //2ms计数器的计数值大于或等于
  204. {
  205. s_iCnt2 = 0; //重置2ms计数器的计数值为0
  206. Delay_Ms_2 = Delay_Ms_2 +1;
  207. if(All_Off_Flag) //
  208. {
  209. if(RelaySlaveChaNum==8)
  210. {
  211. 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))//确保这里的和读取电能参数的顺序是一致的
  212. {
  213. BUFF;
  214. Relay1State();
  215. LOCK;
  216. }
  217. 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))//确保这里的和读取电能参数的顺序是一致的
  218. {
  219. BUFF;
  220. Relay2State();
  221. LOCK;
  222. }
  223. 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))//确保这里的和读取电能参数的顺序是一致的
  224. {
  225. BUFF;
  226. Relay3State();
  227. LOCK;
  228. }
  229. 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))//确保这里的和读取电能参数的顺序是一致的
  230. {
  231. BUFF;
  232. Relay4State();
  233. LOCK;
  234. }
  235. 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))//确保这里的和读取电能参数的顺序是一致的
  236. {
  237. BUFF;
  238. Relay5State();
  239. LOCK;
  240. }
  241. 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))//确保这里的和读取电能参数的顺序是一致的
  242. {
  243. BUFF;
  244. Relay6State();
  245. LOCK;
  246. }
  247. 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))//确保这里的和读取电能参数的顺序是一致的
  248. {
  249. BUFF;
  250. Relay7State();
  251. LOCK;
  252. }
  253. 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))//确保这里的和读取电能参数的顺序是一致的
  254. {
  255. BUFF;
  256. Relay8State();
  257. LOCK;
  258. }
  259. }
  260. else if(RelaySlaveChaNum==7)
  261. {
  262. 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))//确保这里的和读取电能参数的顺序是一致的
  263. {
  264. BUFF;
  265. Relay1State();
  266. LOCK;
  267. }
  268. 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))//确保这里的和读取电能参数的顺序是一致的
  269. {
  270. BUFF;
  271. Relay2State();
  272. LOCK;
  273. }
  274. 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))//确保这里的和读取电能参数的顺序是一致的
  275. {
  276. BUFF;
  277. Relay3State();
  278. LOCK;
  279. }
  280. 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))//确保这里的和读取电能参数的顺序是一致的
  281. {
  282. BUFF;
  283. Relay4State();
  284. LOCK;
  285. }
  286. 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))//确保这里的和读取电能参数的顺序是一致的
  287. {
  288. BUFF;
  289. Relay5State();
  290. LOCK;
  291. }
  292. 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))//确保这里的和读取电能参数的顺序是一致的
  293. {
  294. BUFF;
  295. Relay6State();
  296. LOCK;
  297. }
  298. 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))//确保这里的和读取电能参数的顺序是一致的
  299. {
  300. BUFF;
  301. Relay7State();
  302. LOCK;
  303. }
  304. }
  305. else if(RelaySlaveChaNum==6)
  306. {
  307. 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))//确保这里的和读取电能参数的顺序是一致的
  308. {
  309. BUFF;
  310. Relay1State();
  311. LOCK;
  312. }
  313. 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))//确保这里的和读取电能参数的顺序是一致的
  314. {
  315. BUFF;
  316. Relay2State();
  317. LOCK;
  318. }
  319. 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))//确保这里的和读取电能参数的顺序是一致的
  320. {
  321. BUFF;
  322. Relay3State();
  323. LOCK;
  324. }
  325. 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))//确保这里的和读取电能参数的顺序是一致的
  326. {
  327. BUFF;
  328. Relay4State();
  329. LOCK;
  330. }
  331. 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))//确保这里的和读取电能参数的顺序是一致的
  332. {
  333. BUFF;
  334. Relay5State();
  335. LOCK;
  336. }
  337. 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))//确保这里的和读取电能参数的顺序是一致的
  338. {
  339. BUFF;
  340. Relay6State();
  341. LOCK;
  342. }
  343. }
  344. else if(RelaySlaveChaNum==5)
  345. {
  346. 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))//确保这里的和读取电能参数的顺序是一致的
  347. {
  348. BUFF;
  349. Relay1State();
  350. LOCK;
  351. }
  352. 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))//确保这里的和读取电能参数的顺序是一致的
  353. {
  354. BUFF;
  355. Relay2State();
  356. LOCK;
  357. }
  358. 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))//确保这里的和读取电能参数的顺序是一致的
  359. {
  360. BUFF;
  361. Relay3State();
  362. LOCK;
  363. }
  364. 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))//确保这里的和读取电能参数的顺序是一致的
  365. {
  366. BUFF;
  367. Relay4State();
  368. LOCK;
  369. }
  370. 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))//确保这里的和读取电能参数的顺序是一致的
  371. {
  372. BUFF;
  373. Relay5State();
  374. LOCK;
  375. }
  376. }
  377. else if(RelaySlaveChaNum==4)
  378. {
  379. 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))//确保这里的和读取电能参数的顺序是一致的
  380. {
  381. BUFF;
  382. Relay1State();
  383. LOCK;
  384. }
  385. 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))//确保这里的和读取电能参数的顺序是一致的
  386. {
  387. BUFF;
  388. Relay2State();
  389. LOCK;
  390. }
  391. 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))//确保这里的和读取电能参数的顺序是一致的
  392. {
  393. BUFF;
  394. Relay3State();
  395. LOCK;
  396. }
  397. 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))//确保这里的和读取电能参数的顺序是一致的
  398. {
  399. BUFF;
  400. Relay4State();
  401. LOCK;
  402. }
  403. }
  404. else if(RelaySlaveChaNum==3)
  405. {
  406. 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))//确保这里的和读取电能参数的顺序是一致的
  407. {
  408. BUFF;
  409. Relay1State();
  410. LOCK;
  411. }
  412. 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))//确保这里的和读取电能参数的顺序是一致的
  413. {
  414. BUFF;
  415. Relay2State();
  416. LOCK;
  417. }
  418. 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))//确保这里的和读取电能参数的顺序是一致的
  419. {
  420. BUFF;
  421. Relay3State();
  422. LOCK;
  423. }
  424. }
  425. else if(RelaySlaveChaNum==2)
  426. {
  427. 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))//确保这里的和读取电能参数的顺序是一致的
  428. {
  429. BUFF;
  430. Relay1State();
  431. LOCK;
  432. }
  433. 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))//确保这里的和读取电能参数的顺序是一致的
  434. {
  435. BUFF;
  436. Relay2State();
  437. LOCK;
  438. }
  439. }
  440. else if(RelaySlaveChaNum==1)
  441. {
  442. 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))//确保这里的和读取电能参数的顺序是一致的
  443. {
  444. BUFF;
  445. Relay1State();
  446. LOCK;
  447. }
  448. }
  449. if((Sort_Offbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Offbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  450. {
  451. timer_disable(TIMER14); //关闭定时器
  452. Delay_Ms_2 = 0;
  453. All_Off_Flag = 0;
  454. }
  455. }
  456. else if(All_On_Flag)
  457. {
  458. if(RelaySlaveChaNum==8)
  459. {
  460. 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))//确保这里的和读取电能参数的顺序是一致的
  461. {
  462. BUFF;
  463. Relay1State();
  464. LOCK;
  465. }
  466. 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))//确保这里的和读取电能参数的顺序是一致的
  467. {
  468. BUFF;
  469. Relay2State();
  470. LOCK;
  471. }
  472. 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))//确保这里的和读取电能参数的顺序是一致的
  473. {
  474. BUFF;
  475. Relay3State();
  476. LOCK;
  477. }
  478. 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))//确保这里的和读取电能参数的顺序是一致的
  479. {
  480. BUFF;
  481. Relay4State();
  482. LOCK;
  483. }
  484. 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))//确保这里的和读取电能参数的顺序是一致的
  485. {
  486. BUFF;
  487. Relay5State();
  488. LOCK;
  489. }
  490. 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))//确保这里的和读取电能参数的顺序是一致的
  491. {
  492. BUFF;
  493. Relay6State();
  494. LOCK;
  495. }
  496. 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))//确保这里的和读取电能参数的顺序是一致的
  497. {
  498. BUFF;
  499. Relay7State();
  500. LOCK;
  501. }
  502. 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))//确保这里的和读取电能参数的顺序是一致的
  503. {
  504. BUFF;
  505. Relay8State();
  506. LOCK;
  507. }
  508. }
  509. else if(RelaySlaveChaNum==7)
  510. {
  511. 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))//确保这里的和读取电能参数的顺序是一致的
  512. {
  513. BUFF;
  514. Relay1State();
  515. LOCK;
  516. }
  517. 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))//确保这里的和读取电能参数的顺序是一致的
  518. {
  519. BUFF;
  520. Relay2State();
  521. LOCK;
  522. }
  523. 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))//确保这里的和读取电能参数的顺序是一致的
  524. {
  525. BUFF;
  526. Relay3State();
  527. LOCK;
  528. }
  529. 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))//确保这里的和读取电能参数的顺序是一致的
  530. {
  531. BUFF;
  532. Relay4State();
  533. LOCK;
  534. }
  535. 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))//确保这里的和读取电能参数的顺序是一致的
  536. {
  537. BUFF;
  538. Relay5State();
  539. LOCK;
  540. }
  541. 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))//确保这里的和读取电能参数的顺序是一致的
  542. {
  543. BUFF;
  544. Relay6State();
  545. LOCK;
  546. }
  547. 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))//确保这里的和读取电能参数的顺序是一致的
  548. {
  549. BUFF;
  550. Relay7State();
  551. LOCK;
  552. }
  553. }
  554. else if(RelaySlaveChaNum==6)
  555. {
  556. 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))//确保这里的和读取电能参数的顺序是一致的
  557. {
  558. BUFF;
  559. Relay1State();
  560. LOCK;
  561. }
  562. 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))//确保这里的和读取电能参数的顺序是一致的
  563. {
  564. BUFF;
  565. Relay2State();
  566. LOCK;
  567. }
  568. 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))//确保这里的和读取电能参数的顺序是一致的
  569. {
  570. BUFF;
  571. Relay3State();
  572. LOCK;
  573. }
  574. 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))//确保这里的和读取电能参数的顺序是一致的
  575. {
  576. BUFF;
  577. Relay4State();
  578. LOCK;
  579. }
  580. 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))//确保这里的和读取电能参数的顺序是一致的
  581. {
  582. BUFF;
  583. Relay5State();
  584. LOCK;
  585. }
  586. 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))//确保这里的和读取电能参数的顺序是一致的
  587. {
  588. BUFF;
  589. Relay6State();
  590. LOCK;
  591. }
  592. }
  593. else if(RelaySlaveChaNum==5)
  594. {
  595. 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))//确保这里的和读取电能参数的顺序是一致的
  596. {
  597. BUFF;
  598. Relay1State();
  599. LOCK;
  600. }
  601. 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))//确保这里的和读取电能参数的顺序是一致的
  602. {
  603. BUFF;
  604. Relay2State();
  605. LOCK;
  606. }
  607. 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))//确保这里的和读取电能参数的顺序是一致的
  608. {
  609. BUFF;
  610. Relay3State();
  611. LOCK;
  612. }
  613. 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))//确保这里的和读取电能参数的顺序是一致的
  614. {
  615. BUFF;
  616. Relay4State();
  617. LOCK;
  618. }
  619. 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))//确保这里的和读取电能参数的顺序是一致的
  620. {
  621. BUFF;
  622. Relay5State();
  623. LOCK;
  624. }
  625. }
  626. else if(RelaySlaveChaNum==4)
  627. {
  628. 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))//确保这里的和读取电能参数的顺序是一致的
  629. {
  630. BUFF;
  631. Relay1State();
  632. LOCK;
  633. }
  634. 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))//确保这里的和读取电能参数的顺序是一致的
  635. {
  636. BUFF;
  637. Relay2State();
  638. LOCK;
  639. }
  640. 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))//确保这里的和读取电能参数的顺序是一致的
  641. {
  642. BUFF;
  643. Relay3State();
  644. LOCK;
  645. }
  646. 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))//确保这里的和读取电能参数的顺序是一致的
  647. {
  648. BUFF;
  649. Relay4State();
  650. LOCK;
  651. }
  652. }
  653. else if(RelaySlaveChaNum==3)
  654. {
  655. 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))//确保这里的和读取电能参数的顺序是一致的
  656. {
  657. BUFF;
  658. Relay1State();
  659. LOCK;
  660. }
  661. 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))//确保这里的和读取电能参数的顺序是一致的
  662. {
  663. BUFF;
  664. Relay2State();
  665. LOCK;
  666. }
  667. 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))//确保这里的和读取电能参数的顺序是一致的
  668. {
  669. BUFF;
  670. Relay3State();
  671. LOCK;
  672. }
  673. }
  674. else if(RelaySlaveChaNum==2)
  675. {
  676. 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))//确保这里的和读取电能参数的顺序是一致的
  677. {
  678. BUFF;
  679. Relay1State();
  680. LOCK;
  681. }
  682. 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))//确保这里的和读取电能参数的顺序是一致的
  683. {
  684. BUFF;
  685. Relay2State();
  686. LOCK;
  687. }
  688. }
  689. else if(RelaySlaveChaNum==1)
  690. {
  691. 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))//确保这里的和读取电能参数的顺序是一致的
  692. {
  693. BUFF;
  694. Relay1State();
  695. LOCK;
  696. }
  697. }
  698. if((Sort_Onbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Onbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  699. {
  700. timer_disable(TIMER14); //关闭定时器
  701. Delay_Ms_2 = 0;
  702. All_On_Flag = 0;
  703. }
  704. }
  705. s_i2msFlag = 1; //将2ms标志位的值设置为1
  706. }
  707. }
  708. /*********************************************************************************************************
  709. * 函数名称:TIMER15_IRQHandler
  710. * 函数功能:TIMER15中断服务函数
  711. * 输入参数:void
  712. * 输出参数:void
  713. * 返 回 值:void
  714. * 创建日期:2021年07月01日
  715. * 注 意:每毫秒进入一次中断服务函数
  716. *********************************************************************************************************/
  717. void TIMER15_IRQHandler(void)
  718. {
  719. static unsigned short s_iCnt100 = 0; //定义一个静态变量s_iCnt100作为100ms计数器
  720. if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  721. {
  722. timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  723. }
  724. s_iCnt100++; //100ms计数器的计数值加1
  725. if(s_iCnt100 >= 100) //100ms计数器的计数值大于或等于
  726. {
  727. s_iCnt100 = 0; //重置100ms计数器的计数值为0
  728. s_i100msFlag = 1; //将100ms标志位的值设置为1
  729. }
  730. }
  731. /*********************************************************************************************************
  732. * 函数名称:TIMER16_IRQHandler
  733. * 函数功能:TIMER16中断服务函数
  734. * 输入参数:void
  735. * 输出参数:void
  736. * 返 回 值:void
  737. * 创建日期:2021年07月01日
  738. * 注 意:每毫秒进入一次中断服务函数
  739. *********************************************************************************************************/
  740. extern uint8_t read_kWh_flag;
  741. void TIMER16_IRQHandler(void)
  742. {
  743. static short s_iCnt1000 = 0; //定义一个静态变量s_iCnt1000作为1s计数器
  744. static uint32_t cnt = 0;
  745. // static uint32_t cntReadkWh = 0;
  746. if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  747. {
  748. timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  749. }
  750. s_iCnt1000++; //1000ms计数器的计数值加1
  751. cnt++;
  752. // cntReadkWh++;
  753. if(s_iCnt1000 >= 1000) //1000ms计数器的计数值大于或等于1000
  754. {
  755. s_iCnt1000 = 0; //重置1000ms计数器的计数值为0
  756. s_i1secFlag = 1; //将1s标志位的值设置为1
  757. }
  758. if(cnt == 60000)
  759. {
  760. write_2_minute_flag = 1;
  761. cnt = 0;
  762. }
  763. // if(cntReadkWh == 5000)
  764. // {
  765. // read_kWh_flag = 1;
  766. // cntReadkWh = 0;
  767. // }
  768. }
  769. /*********************************************************************************************************
  770. * API函数实现
  771. *********************************************************************************************************/
  772. /*********************************************************************************************************
  773. * 函数名称:InitTimer
  774. * 函数功能:初始化Timer模块
  775. * 输入参数:void
  776. * 输出参数:void
  777. * 返 回 值:void
  778. * 创建日期:2021年07月01日
  779. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  780. *********************************************************************************************************/
  781. void InitTimer(void)
  782. {
  783. // ConfigTimer2(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  784. ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  785. ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  786. ConfigTimer16(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  787. }
  788. /*********************************************************************************************************
  789. * 函数名称:Get20msFlag
  790. * 函数功能:获取2ms标志位的值
  791. * 输入参数:void
  792. * 输出参数:void
  793. * 返 回 值:s_i2msFlag-2ms标志位的值
  794. * 创建日期:2021年07月01日
  795. * 注 意:
  796. *********************************************************************************************************/
  797. unsigned char Get2msFlag(void)
  798. {
  799. return(s_i2msFlag); //返回2ms标志位的值
  800. }
  801. /*********************************************************************************************************
  802. * 函数名称:Clr20msFlag
  803. * 函数功能:清除2ms标志位
  804. * 输入参数:void
  805. * 输出参数:void
  806. * 返 回 值:void
  807. * 创建日期:2021年07月01日
  808. * 注 意:
  809. *********************************************************************************************************/
  810. void Clr2msFlag(void)
  811. {
  812. s_i2msFlag = 0; //将2ms标志位的值设置为0
  813. }
  814. /*********************************************************************************************************
  815. * 函数名称:Get100msFlag
  816. * 函数功能:获取100ms标志位的值
  817. * 输入参数:void
  818. * 输出参数:void
  819. * 返 回 值:s_i2msFlag-100ms标志位的值
  820. * 创建日期:2021年07月01日
  821. * 注 意:
  822. *********************************************************************************************************/
  823. unsigned char Get100msFlag(void)
  824. {
  825. return(s_i100msFlag); //返回100ms标志位的值
  826. }
  827. /*********************************************************************************************************
  828. * 函数名称:Clr100msFlags
  829. * 函数功能:清除100ms标志位
  830. * 输入参数:void
  831. * 输出参数:void
  832. * 返 回 值:void
  833. * 创建日期:2021年07月01日
  834. * 注 意:
  835. *********************************************************************************************************/
  836. void Clr100msFlag(void)
  837. {
  838. s_i100msFlag = 0; //将100ms标志位的值设置为0
  839. }
  840. /*********************************************************************************************************
  841. * 函数名称:Get1SecFlag
  842. * 函数功能:获取1s标志位的值
  843. * 输入参数:void
  844. * 输出参数:void
  845. * 返 回 值:s_i1secFlag-1s标志位的值
  846. * 创建日期:2021年07月01日
  847. * 注 意:
  848. *********************************************************************************************************/
  849. unsigned char Get1SecFlag(void)
  850. {
  851. return(s_i1secFlag); //返回1s标志位的值
  852. }
  853. /*********************************************************************************************************
  854. * 函数名称:Clr1SecFlag
  855. * 函数功能:清除1s标志位
  856. * 输入参数:void
  857. * 输出参数:void
  858. * 返 回 值:void
  859. * 创建日期:2021年07月01日
  860. * 注 意:
  861. *********************************************************************************************************/
  862. void Clr1SecFlag(void)
  863. {
  864. s_i1secFlag = 0; //将1s标志位的值设置为0
  865. }