/********************************************************************************************************* * 模块名称:Timer.c * 摘 要:Timer模块 * 当前版本:1.0.0 * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.) * 完成日期:2021年07月01日 * 内 容: * 注 意: ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include #include "Timer.h" #include "stdint.h" #include "gd32e23x_timer.h" #include "main.h" #include "board_cfg.h" static uint8_t s_i100mSFlag = 0; //将100ms标志位的值设置为0 static uint8_t s_i1secFlag = 0; //将1s标志位的值设置为0 uint8_t Read_data_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}; #if SUPPORT_ZERO_LINE uint32_t RL_N_delay_cnt = 0; uint32_t RL_N_delay_Limit = 0; #endif #if SUPPORT_DOUBLE_FIRE extern uint8_t key_detection_2; uint16_t detection_count_2 = 0; #endif 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 extern uint8_t kwh_200ms_read_flag; // add by liyi uint32_t detection_count = 0; // add by liyi extern uint8_t key_detection; // add by liyi uint16_t read_ele_count = 0; extern uint8_t read_ele_flag; /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ static void ConfigTimer14(uint32_t arr, uint32_t psc); //配置TIMER14 static void ConfigTimer16(uint32_t arr, uint32_t psc); 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, 3); //配置NVIC设置优先级 timer_enable(TIMER14); //使能定时器 } 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); //使能定时器 } extern uint8_t flash_flag; 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 SUPPORT_ZERO_LINE 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; } } #endif detection_count ++; if(detection_count > 1000) { key_detection = 0; detection_count = 0; } #if SUPPORT_DOUBLE_FIRE detection_count_2 ++; if(detection_count_2 >1000) { detection_count_2 = 0; key_detection_2 = 0; } #endif read_ele_count ++; if(read_ele_count >=600) { read_ele_count = 0; read_ele_flag = 1; } if(Delay_N_mS > 0) { Delay_N_mS--; } } void TIMER16_IRQHandler(void) { // static int count = 0; 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; flash_flag = 1; Start_Read_Flag = true; } // if(count == 120) // { // write_kwh2Eeprom_flag = 1; // count = 0; // } // count ++; s_i1secFlag = 1; } /********************************************************************************************************* * API函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:InitTimer * 函数功能:初始化Timer模块 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出 *********************************************************************************************************/ void InitTimer(void) { ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms ConfigTimer16(1999, 7199); // data ???? } uint8_t Get1SecFlag(void) { return(s_i1secFlag); //返回1s标志位的值 } void Clr1SecFlag(void) { s_i1secFlag = 0; //将1s标志位的值设置为0 } unsigned char Get100msFlag(void) { return(s_i100mSFlag); //返回1s标志位的值 } void Clr100msFlag(void) { s_i100mSFlag = 0; //将1s标志位的值设置为0 }