Timer.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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 "Sn74hc573.h"
  24. #include <stdbool.h>
  25. /*********************************************************************************************************
  26. * 宏定义
  27. *********************************************************************************************************/
  28. /*********************************************************************************************************
  29. * 枚举结构体
  30. *********************************************************************************************************/
  31. /*********************************************************************************************************
  32. * 内部变量定义
  33. *********************************************************************************************************/
  34. static unsigned char s_i100mSFlag = 0; //将100ms标志位的值设置为0
  35. static unsigned char s_i1secFlag = 0; //将1s标志位的值设置为0
  36. uint8_t Wr_eeprom_wait_cnt = 0;
  37. uint32_t Delay_N_mS = 0;
  38. uint8_t ch_cnt = 0;
  39. uint8_t Read_IM1253E_cnt = 0;
  40. uint8_t Init_IM1253E_wait_cnt = 0;
  41. uint32_t RL_delay_cnt[RELAY_ChN_default] = {0};
  42. uint32_t RL_delay_Limit[RELAY_ChN_default] = {0};
  43. extern bool Read_IM1253E_flag;
  44. extern bool Init_IM1253E_flag;
  45. extern uint8_t RL_begin_delay_flag[RELAY_ChN_default];
  46. extern uint8_t RL_end_delay_flag[RELAY_ChN_default];
  47. /*********************************************************************************************************
  48. * 内部函数声明
  49. *********************************************************************************************************/
  50. static void ConfigTimer14(unsigned short arr, unsigned short psc); //配置TIMER14
  51. static void ConfigTimer15(unsigned short arr, unsigned short psc); //配置TIMER15
  52. static void ConfigTimer16(unsigned short arr, unsigned short psc); //配置TIMER16
  53. /*********************************************************************************************************
  54. * 内部函数实现
  55. *********************************************************************************************************/
  56. /*********************************************************************************************************
  57. * 函数名称:ConfigTimer14
  58. * 函数功能:配置TIMER14
  59. * 输入参数:arr-自动重装值,psc-预分频器值
  60. * 输出参数:void
  61. * 返 回 值:void
  62. * 创建日期:2021年07月01日
  63. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  64. *********************************************************************************************************/
  65. static void ConfigTimer14(unsigned short arr, unsigned short psc)
  66. {
  67. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  68. //使能RCU相关时钟
  69. rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
  70. timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
  71. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  72. //配置TIMER14
  73. timer_initpara.prescaler = psc; //设置预分频器值
  74. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  75. timer_initpara.period = arr; //设置自动重装载值
  76. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  77. timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
  78. timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
  79. nvic_irq_enable(TIMER14_IRQn, 2); //配置NVIC设置优先级
  80. timer_enable(TIMER14); //使能定时器
  81. }
  82. /*********************************************************************************************************
  83. * 函数名称:ConfigTimer15
  84. * 函数功能:配置TIMER15
  85. * 输入参数:arr-自动重装值,psc-预分频器值
  86. * 输出参数:void
  87. * 返 回 值:void
  88. * 创建日期:2021年07月01日
  89. * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
  90. *********************************************************************************************************/
  91. static void ConfigTimer15(unsigned short arr, unsigned short psc)
  92. {
  93. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  94. //使能RCU相关时钟
  95. rcu_periph_clock_enable(RCU_TIMER15); //使能TIMER15的时钟
  96. timer_deinit(TIMER15); //设置TIMER15参数恢复默认值
  97. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  98. //配置TIMER15
  99. timer_initpara.prescaler = psc; //设置预分频器值
  100. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  101. timer_initpara.period = arr; //设置自动重装载值
  102. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  103. timer_init(TIMER15, &timer_initpara); //根据参数初始化定时器
  104. timer_interrupt_enable(TIMER15, TIMER_INT_UP); //使能定时器的更新中断
  105. nvic_irq_enable(TIMER15_IRQn, 3); //配置NVIC设置优先级
  106. timer_enable(TIMER15); //使能定时器
  107. }
  108. /*********************************************************************************************************
  109. * 函数名称:ConfigTimer16
  110. * 函数功能:配置TIMER16
  111. * 输入参数:arr-自动重装值,psc-预分频器值
  112. * 输出参数:void
  113. * 返 回 值:void
  114. * 创建日期:2021年07月01日
  115. * 注 意:APB2时钟为72MHz,TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER15和TIMER16时钟为72MHz
  116. *********************************************************************************************************/
  117. static void ConfigTimer16(unsigned short arr,unsigned short psc)
  118. {
  119. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  120. //使能RCU相关时钟
  121. rcu_periph_clock_enable(RCU_TIMER16); //使能TIMER16的时钟
  122. timer_deinit(TIMER16); //设置TIMER16参数恢复默认值
  123. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  124. //配置TIMER16
  125. timer_initpara.prescaler = psc; //设置预分频器值
  126. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  127. timer_initpara.period = arr; //设置自动重装载值
  128. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  129. timer_init(TIMER16, &timer_initpara); //根据参数初始化定时器
  130. timer_interrupt_enable(TIMER16, TIMER_INT_UP); //使能定时器的更新中断
  131. nvic_irq_enable(TIMER16_IRQn, 3); //配置NVIC设置优先级
  132. timer_enable(TIMER16); //使能定时器
  133. }
  134. /*********************************************************************************************************
  135. * 函数名称:TIMER14_IRQHandler
  136. * 函数功能:TIMER14中断服务函数
  137. * 输入参数:void
  138. * 输出参数:void
  139. * 返 回 值:void
  140. * 创建日期:2021年07月01日
  141. * 注 意:每毫秒进入一次中断服务函数
  142. *********************************************************************************************************/
  143. void TIMER14_IRQHandler(void)
  144. {
  145. uint8_t i = 0;
  146. if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  147. {
  148. timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  149. }
  150. for(i = 0;i < RELAY_ChN_default;i++)
  151. {
  152. if(RL_begin_delay_flag[i] > 0)
  153. {
  154. if(RL_delay_cnt[i] < RL_delay_Limit[i])
  155. {
  156. RL_delay_cnt[i]++;
  157. }
  158. else
  159. {
  160. RL_delay_cnt[i] = 0;
  161. RL_end_delay_flag[i] = 1;
  162. RL_begin_delay_flag[i] = 0;
  163. }
  164. }
  165. else
  166. {
  167. RL_delay_cnt[i] = 0;
  168. }
  169. }
  170. if(Delay_N_mS > 0)
  171. {
  172. Delay_N_mS--;
  173. }
  174. }
  175. /*********************************************************************************************************
  176. * 函数名称:TIMER15_IRQHandler
  177. * 函数功能:TIMER15中断服务函数
  178. * 输入参数:void
  179. * 输出参数:void
  180. * 返 回 值:void
  181. * 创建日期:2021年07月01日
  182. * 注 意:每毫秒进入一次中断服务函数
  183. *********************************************************************************************************/
  184. extern uint8_t read_adc_flag;
  185. void TIMER15_IRQHandler(void)
  186. {
  187. static unsigned short s_iCnt100 = 0; //定义一个静态变量s_iCnt100作为100ms计数器
  188. if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  189. {
  190. timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  191. }
  192. s_iCnt100++;
  193. if(s_iCnt100 == 200)
  194. {
  195. read_adc_flag = 1;
  196. s_iCnt100 = 0;
  197. }
  198. }
  199. /*********************************************************************************************************
  200. * 函数名称:TIMER16_IRQHandler
  201. * 函数功能:TIMER16中断服务函数
  202. * 输入参数:void
  203. * 输出参数:void
  204. * 返 回 值:void
  205. * 创建日期:2021年07月01日
  206. * 注 意:每1秒进入一次中断服务函数
  207. *********************************************************************************************************/
  208. void TIMER16_IRQHandler(void)
  209. {
  210. static short s_iCnt1000 = 0; //定义一个静态变量s_iCnt1000作为1s计数器
  211. if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  212. {
  213. timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  214. }
  215. s_i1secFlag = 1; //将1s标志位的值设置为1
  216. if(Read_IM1253E_cnt < Read_IM1253E_Deltatime)
  217. {
  218. Read_IM1253E_cnt ++ ;
  219. }
  220. else
  221. {
  222. Read_IM1253E_cnt = 0;
  223. Read_IM1253E_flag = true;
  224. }
  225. if(Init_IM1253E_flag)
  226. {
  227. if(Init_IM1253E_wait_cnt < 10)
  228. {
  229. Init_IM1253E_wait_cnt++;
  230. }
  231. else
  232. {
  233. Init_IM1253E_wait_cnt = 0;
  234. Init_IM1253E_flag = false;
  235. }
  236. }
  237. else
  238. {
  239. Init_IM1253E_wait_cnt = 0;
  240. }
  241. }
  242. /*********************************************************************************************************
  243. * API函数实现
  244. *********************************************************************************************************/
  245. /*********************************************************************************************************
  246. * 函数名称:InitTimer
  247. * 函数功能:初始化Timer模块
  248. * 输入参数:void
  249. * 输出参数:void
  250. * 返 回 值:void
  251. * 创建日期:2021年07月01日
  252. * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
  253. *********************************************************************************************************/
  254. void InitTimer(void)
  255. {
  256. Delay_N_mS = 0;
  257. Read_IM1253E_cnt = 0;
  258. ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  259. ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
  260. ConfigTimer16(9999, 7199); //72MHz/(7199+1)=0.01MHz,由0计数到9999为1s
  261. }
  262. /*********************************************************************************************************
  263. * 函数名称:Get1SecFlag
  264. * 函数功能:获取1s标志位的值
  265. * 输入参数:void
  266. * 输出参数:void
  267. * 返 回 值:s_i1secFlag-1s标志位的值
  268. * 创建日期:2021年07月01日
  269. * 注 意:
  270. *********************************************************************************************************/
  271. unsigned char Get1SecFlag(void)
  272. {
  273. return(s_i1secFlag); //返回1s标志位的值
  274. }
  275. /*********************************************************************************************************
  276. * 函数名称:Clr1SecFlag
  277. * 函数功能:清除1s标志位
  278. * 输入参数:void
  279. * 输出参数:void
  280. * 返 回 值:void
  281. * 创建日期:2021年07月01日
  282. * 注 意:
  283. *********************************************************************************************************/
  284. void Clr1SecFlag(void)
  285. {
  286. s_i1secFlag = 0; //将1s标志位的值设置为0
  287. }
  288. /*********************************************************************************************************
  289. * 函数名称:Get100msFlag
  290. * 函数功能:获取100ms标志位的值
  291. * 输入参数:void
  292. * 输出参数:void
  293. * 返 回 值:s_i1secFlag-1s标志位的值
  294. * 创建日期:2021年07月01日
  295. * 注 意:
  296. *********************************************************************************************************/
  297. unsigned char Get100msFlag(void)
  298. {
  299. return(s_i100mSFlag); //返回1s标志位的值
  300. }
  301. /*********************************************************************************************************
  302. * 函数名称:Clr100msFlag
  303. * 函数功能:清除100ms标志位
  304. * 输入参数:void
  305. * 输出参数:void
  306. * 返 回 值:void
  307. * 创建日期:2021年07月01日
  308. * 注 意:
  309. *********************************************************************************************************/
  310. void Clr100msFlag(void)
  311. {
  312. s_i100mSFlag = 0; //将1s标志位的值设置为0
  313. }
  314. void delay_ms(unsigned long int n_del_ms)
  315. {
  316. Delay_N_mS = n_del_ms;
  317. while(Delay_N_mS > 0);
  318. }