Timer.c 38 KB

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