| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- /*********************************************************************************************************
- * 模块名称:Timer.c
- * 摘 要:Timer模块
- * 当前版本:1.0.0
- * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
- * 完成日期:2021年07月01日
- * 内 容:
- * 注 意:
- **********************************************************************************************************
- * 取代版本:
- * 作 者:
- * 完成日期:
- * 修改内容:
- * 修改文件:
- *********************************************************************************************************/
- /*********************************************************************************************************
- * 包含头文件
- *********************************************************************************************************/
- #include "gd32e230x_conf.h"
- #include <stdbool.h>
- #include "Timer.h"
- #include "Main.h"
- #include "ReadEeprom.h"
- #include "Sn74hc573.h"
- #include "stdint.h"
- /*********************************************************************************************************
- * 宏定义
- *********************************************************************************************************/
- /*********************************************************************************************************
- * 枚举结构体
- *********************************************************************************************************/
- /*********************************************************************************************************
- * 内部变量定义
- *********************************************************************************************************/
- static uint8_t s_i100mSFlag = 0; //将100ms标志位的值设置为0
- static uint8_t s_i1secFlag = 0; //将1s标志位的值设置为0
- uint8_t Wr_eeprom_wait_cnt = 0;
- uint8_t Read_data_cnt = 0;
- uint8_t ch_cnt = 0;
- uint32_t Delay_N_mS = 0;
- uint32_t RL_delay_cnt[Output_ChN_default] = {0};
- uint32_t RL_delay_Limit[Output_ChN_default] = {0};
- uint32_t RL_N_delay_cnt = 0;
- uint32_t RL_N_delay_Limit = 0;
- extern uint8_t RL_begin_delay_flag[Output_ChN_default];
- extern uint8_t RL_end_delay_flag[Output_ChN_default];
- extern uint8_t RL_N_begin_delay_flag; //add by liyi
- extern uint8_t RL_N_end_delay_flag; // add by liyi
- extern uint8_t write_kwh2Eeprom_flag; // add by liyi
- /*********************************************************************************************************
- * 内部函数声明
- *********************************************************************************************************/
- static void ConfigTimer14(uint32_t arr, uint32_t psc); //配置TIMER14
- static void ConfigTimer15(uint32_t arr, uint32_t psc); //配置TIMER15
- static void ConfigTimer16(uint32_t arr, uint32_t psc); //配置TIMER16
- /*********************************************************************************************************
- * 内部函数实现
- *********************************************************************************************************/
- /*********************************************************************************************************
- * 函数名称:ConfigTimer14
- * 函数功能:配置TIMER14
- * 输入参数:arr-自动重装值,psc-预分频器值
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
- *********************************************************************************************************/
- static void ConfigTimer14(uint32_t arr, uint32_t psc)
- {
- timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
- //使能RCU相关时钟
- rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
- timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
- timer_struct_para_init(&timer_initpara); //初始化timer_initpara
- //配置TIMER14
- timer_initpara.prescaler = psc; //设置预分频器值
- timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
- timer_initpara.period = arr; //设置自动重装载值
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
- timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
- timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
- nvic_irq_enable(TIMER14_IRQn, 2); //配置NVIC设置优先级
- timer_enable(TIMER14); //使能定时器
- }
- /*********************************************************************************************************
- * 函数名称:ConfigTimer15
- * 函数功能:配置TIMER15
- * 输入参数:arr-自动重装值,psc-预分频器值
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz
- *********************************************************************************************************/
- static void ConfigTimer15(uint32_t arr, uint32_t psc)
- {
- timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
- //使能RCU相关时钟
- rcu_periph_clock_enable(RCU_TIMER15); //使能TIMER15的时钟
- timer_deinit(TIMER15); //设置TIMER15参数恢复默认值
- timer_struct_para_init(&timer_initpara); //初始化timer_initpara
- //配置TIMER15
- timer_initpara.prescaler = psc; //设置预分频器值
- timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
- timer_initpara.period = arr; //设置自动重装载值
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
- timer_init(TIMER15, &timer_initpara); //根据参数初始化定时器
- timer_interrupt_enable(TIMER15, TIMER_INT_UP); //使能定时器的更新中断
- nvic_irq_enable(TIMER15_IRQn, 3); //配置NVIC设置优先级
- timer_enable(TIMER15); //使能定时器
- }
- /*********************************************************************************************************
- * 函数名称:ConfigTimer16
- * 函数功能:配置TIMER16
- * 输入参数:arr-自动重装值,psc-预分频器值
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:APB2时钟为72MHz,TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER15和TIMER16时钟为72MHz
- *********************************************************************************************************/
- static void ConfigTimer16(uint32_t arr,uint32_t psc)
- {
- timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
- //使能RCU相关时钟
- rcu_periph_clock_enable(RCU_TIMER16); //使能TIMER16的时钟
- timer_deinit(TIMER16); //设置TIMER16参数恢复默认值
- timer_struct_para_init(&timer_initpara); //初始化timer_initpara
-
- //配置TIMER16
- timer_initpara.prescaler = psc; //设置预分频器值
- timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
- timer_initpara.period = arr; //设置自动重装载值
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
- timer_init(TIMER16, &timer_initpara); //根据参数初始化定时器
- timer_interrupt_enable(TIMER16, TIMER_INT_UP); //使能定时器的更新中断
- nvic_irq_enable(TIMER16_IRQn, 3); //配置NVIC设置优先级
- timer_enable(TIMER16); //使能定时器
- }
- /*********************************************************************************************************
- * 函数名称:TIMER14_IRQHandler
- * 函数功能:TIMER14中断服务函数
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:每毫秒进入一次中断服务函数
- *********************************************************************************************************/
- void TIMER14_IRQHandler(void)
- {
- uint8_t i = 0;
- if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
- {
- timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
- }
-
- for(i = 0;i < Output_ChN_default;i++)
- {
- if(RL_begin_delay_flag[i] > 0)
- {
- if(RL_delay_cnt[i] < RL_delay_Limit[i])
- {
- RL_delay_cnt[i]++;
- }
- else
- {
- RL_delay_cnt[i] = 0;
- RL_end_delay_flag[i] = 1;
- RL_begin_delay_flag[i] = 0;
- }
- }
- }
- // Ch N add by liyi
-
- if(RL_N_begin_delay_flag > 0)
- {
- if(RL_N_delay_cnt < RL_N_delay_Limit)
- {
- RL_N_delay_cnt++;
- }else
- {
- RL_N_delay_cnt = 0;
- RL_N_end_delay_flag = 1;
- RL_N_begin_delay_flag = 0;
- }
- }
-
- if(Delay_N_mS > 0)
- {
- Delay_N_mS--;
- }
- }
- /*********************************************************************************************************
- * 函数名称:TIMER15_IRQHandler
- * 函数功能:TIMER15中断服务函数
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:每毫秒进入一次中断服务函数
- *********************************************************************************************************/
- void TIMER15_IRQHandler(void)
- {
- static uint32_t s_iCnt100 = 0; //定义一个静态变量s_iCnt100作为100ms计数器
- if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
- {
- timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
- }
- }
- /*********************************************************************************************************
- * 函数名称:TIMER16_IRQHandler
- * 函数功能:TIMER16中断服务函数
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:每1秒进入一次中断服务函数
- *********************************************************************************************************/
- void TIMER16_IRQHandler(void)
- {
- static uint32_t s_iCnt1000 = 0;//定义一个静态变量s_iCnt1000作为1s计数器
- if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
- {
- timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
- }
- if(Read_data_cnt < 3)
- {
- Read_data_cnt++;
- }
- else
- {
- Read_data_cnt = 0;
- Start_Read_Flag = true;
- }
- if(s_iCnt1000 == 240)
- {
- s_iCnt1000 = 0;
- write_kwh2Eeprom_flag = 1;
- }
- s_iCnt1000 ++;
- s_i1secFlag = 1; //将1s标志位的值设置为1
- }
- /*********************************************************************************************************
- * API函数实现
- *********************************************************************************************************/
- /*********************************************************************************************************
- * 函数名称:InitTimer
- * 函数功能:初始化Timer模块
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出
- *********************************************************************************************************/
- void InitTimer(void)
- {
- Delay_N_mS = 0;
- ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
- ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms
- ConfigTimer16(9999, 7199); //72MHz/(7199+1)=0.01MHz,由0计数到9999为1s
- }
- /*********************************************************************************************************
- * 函数名称:Get1SecFlag
- * 函数功能:获取1s标志位的值
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:s_i1secFlag-1s标志位的值
- * 创建日期:2021年07月01日
- * 注 意:
- *********************************************************************************************************/
- uint8_t Get1SecFlag(void)
- {
- return(s_i1secFlag); //返回1s标志位的值
- }
- /*********************************************************************************************************
- * 函数名称:Clr1SecFlag
- * 函数功能:清除1s标志位
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:
- *********************************************************************************************************/
- void Clr1SecFlag(void)
- {
- s_i1secFlag = 0; //将1s标志位的值设置为0
- }
- /*********************************************************************************************************
- * 函数名称:Get100msFlag
- * 函数功能:获取100ms标志位的值
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:s_i1secFlag-1s标志位的值
- * 创建日期:2021年07月01日
- * 注 意:
- *********************************************************************************************************/
- unsigned char Get100msFlag(void)
- {
- return(s_i100mSFlag); //返回1s标志位的值
- }
- /*********************************************************************************************************
- * 函数名称:Clr100msFlag
- * 函数功能:清除100ms标志位
- * 输入参数:void
- * 输出参数:void
- * 返 回 值:void
- * 创建日期:2021年07月01日
- * 注 意:
- *********************************************************************************************************/
- void Clr100msFlag(void)
- {
- s_i100mSFlag = 0; //将1s标志位的值设置为0
- }
- void delay_ms(uint32_t n_del_ms)
- {
- Delay_N_mS = n_del_ms;
- while(Delay_N_mS > 0);
- }
|