/********************************************************************************************************* * 模块名称:Timer.c * 摘 要:Timer模块 * 当前版本:1.0.0 * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.) * 完成日期:2021年07月01日 * 内 容: * 注 意: ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include "Timer.h" #include "gd32e230x_conf.h" #include "Main.h" #include "ReadEeprom.h" #include "Sn74lvc573.h" /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ /********************************************************************************************************* * 枚举结构体 *********************************************************************************************************/ /********************************************************************************************************* * 内部变量定义 *********************************************************************************************************/ static unsigned char s_i100msFlag = 0; //将100ms标志位的值设置为0 static unsigned char s_i2msFlag = 0; //将2ms标志位的值设置为0 static unsigned char s_i1secFlag = 0; //将1s标志位的值设置为0 volatile unsigned long int g_del_ms =0; unsigned long int Delay_Ms_2=0; unsigned int All_On_Flag; unsigned int All_Off_Flag; extern uint32_t write_2_minute_flag; /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ //static void ConfigTimer2(unsigned short arr, unsigned short psc); //配置TIMER2 static void ConfigTimer14(unsigned short arr, unsigned short psc); //配置TIMER14 static void ConfigTimer15(unsigned short arr, unsigned short psc); //配置TIMER15 static void ConfigTimer16(unsigned short arr, unsigned short psc); //配置TIMER16 /********************************************************************************************************* * 内部函数实现 *********************************************************************************************************/ ///********************************************************************************************************* //* 函数名称:ConfigTimer2 //* 函数功能:配置TIMER2 //* 输入参数:arr-自动重装值,psc-预分频器值 //* 输出参数:void //* 返 回 值:void //* 创建日期:2021年07月01日 //* 注 意:APB1时钟为72MHz,TIMER2时钟选择为APB2的1分频,因此,TIMER2时钟为72MHz //*********************************************************************************************************/ //static void ConfigTimer2(unsigned short arr, unsigned short psc) //{ // timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数 // //使能RCU相关时钟 // rcu_periph_clock_enable(RCU_TIMER2); //使能TIMER2的时钟 // timer_deinit(TIMER2); //设置TIMER2参数恢复默认值 // 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(TIMER2, &timer_initpara); //根据参数初始化定时器 // timer_interrupt_enable(TIMER2, TIMER_INT_UP); //使能定时器的更新中断 // nvic_irq_enable(TIMER2_IRQn, 3); //配置NVIC设置优先级 // timer_enable(TIMER2); //使能定时器 //} /********************************************************************************************************* * 函数名称:ConfigTimer14 * 函数功能:配置TIMER14 * 输入参数:arr-自动重装值,psc-预分频器值 * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:APB2时钟为72MHz,TIMER14和TIMER15和TIMER16时钟选择为APB2的1分频,因此,TIMER14和TIMER15和TIMER16时钟为72MHz *********************************************************************************************************/ static void ConfigTimer14(unsigned short arr, unsigned short 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(unsigned short arr, unsigned short 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(unsigned short arr,unsigned short 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); //使能定时器 } ///********************************************************************************************************* //* 函数名称:TIMER2_IRQHandler //* 函数功能:TIMER14中断服务函数 //* 输入参数:void //* 输出参数:void //* 返 回 值:void //* 创建日期:2021年07月01日 //* 注 意:每毫秒进入一次中断服务函数 //*********************************************************************************************************/ //void TIMER2_IRQHandler(void) //{ // if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生 // { // timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP); //清除定时器更新中断标志 // g_del_ms--; // } //} ///********************************************************************************************************* //* 函数名称:Delay_Ms_2 //* 函数功能: 定义毫秒级别的延时函数 //* 输入参数:n_del_ms延时毫秒数 //* 输出参数:void //* 返 回 值:void //* 创建日期:2021年07月01日 //* 注 意: //*********************************************************************************************************/ //void delay_ms(unsigned long int n_del_ms) //{ // g_del_ms = n_del_ms; // while(g_del_ms); //} /********************************************************************************************************* * 函数名称:TIMER14_IRQHandler * 函数功能:TIMER14中断服务函数 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:每毫秒进入一次中断服务函数 *********************************************************************************************************/ void TIMER14_IRQHandler(void) { static unsigned short s_iCnt2 = 0; //定义一个静态变量s_iCnt2作为2ms计数器 if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生 { timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志 } s_iCnt2++; //2ms计数器的计数值加1 if(s_iCnt2 >= 1) //2ms计数器的计数值大于或等于 { s_iCnt2 = 0; //重置2ms计数器的计数值为0 Delay_Ms_2 = Delay_Ms_2 +1; if(All_Off_Flag) // { if(RelaySlaveChaNum==8) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } #ifndef ACSingPhSmaDouble 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay6State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay7State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay8State(); LOCK; } #endif } else if(RelaySlaveChaNum==7) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay6State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay7State(); LOCK; } } else if(RelaySlaveChaNum==6) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay6State(); LOCK; } } else if(RelaySlaveChaNum==5) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } } else if(RelaySlaveChaNum==4) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } } else if(RelaySlaveChaNum==3) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } } else if(RelaySlaveChaNum==2) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } } else if(RelaySlaveChaNum==1) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } } #ifndef ACSingPhSmaDouble if((Sort_Offbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Offbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环 { timer_disable(TIMER14); //关闭定时器 Delay_Ms_2 = 0; All_Off_Flag = 0; } #else if((Sort_Offbuf[Relay_4_CHANEL-1]==Delay_Ms_2)||(Sort_Offbuf[Relay_4_CHANEL-1]==0xffff)||(Sort_Offbuf[Relay_4_CHANEL-1]==0)) //当达到最大延时时间后退出当前循环 { timer_disable(TIMER14); //关闭定时器 Delay_Ms_2 = 0; All_Off_Flag = 0; } #endif } else if(All_On_Flag) { if(RelaySlaveChaNum==8) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } #ifndef ACSingPhSmaDouble 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay6State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay7State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay8State(); LOCK; } #endif } else if(RelaySlaveChaNum==7) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay6State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay7State(); LOCK; } } else if(RelaySlaveChaNum==6) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay6State(); LOCK; } } else if(RelaySlaveChaNum==5) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay5State(); LOCK; } } else if(RelaySlaveChaNum==4) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay4State(); LOCK; } } else if(RelaySlaveChaNum==3) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay3State(); LOCK; } } else if(RelaySlaveChaNum==2) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay2State(); LOCK; } } else if(RelaySlaveChaNum==1) { 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))//确保这里的和读取电能参数的顺序是一致的 { BUFF; Relay1State(); LOCK; } } #ifndef ACSingPhSmaDouble if((Sort_Onbuf[RelaySlaveChaNum-1]==Delay_Ms_2)||(Sort_Onbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Offbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环 { timer_disable(TIMER14); //关闭定时器 Delay_Ms_2 = 0; All_On_Flag = 0; } #else if((Sort_Onbuf[Relay_4_CHANEL-1]==Delay_Ms_2)||(Sort_Onbuf[Relay_4_CHANEL-1]==0xffff)||(Sort_Offbuf[Relay_4_CHANEL-1]==0)) //当达到最大延时时间后退出当前循环 { timer_disable(TIMER14); //关闭定时器 Delay_Ms_2 = 0; All_On_Flag = 0; } #endif } s_i2msFlag = 1; //将2ms标志位的值设置为1 } } /********************************************************************************************************* * 函数名称:TIMER15_IRQHandler * 函数功能:TIMER15中断服务函数 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:每毫秒进入一次中断服务函数 *********************************************************************************************************/ void TIMER15_IRQHandler(void) { static unsigned short 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); //清除定时器更新中断标志 } s_iCnt100++; //100ms计数器的计数值加1 if(s_iCnt100 >= 100) //100ms计数器的计数值大于或等于 { s_iCnt100 = 0; //重置100ms计数器的计数值为0 s_i100msFlag = 1; //将100ms标志位的值设置为1 } } /********************************************************************************************************* * 函数名称:TIMER16_IRQHandler * 函数功能:TIMER16中断服务函数 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:每毫秒进入一次中断服务函数 *********************************************************************************************************/ extern uint8_t read_kWh_flag; void TIMER16_IRQHandler(void) { static short s_iCnt1000 = 0; //定义一个静态变量s_iCnt1000作为1s计数器 static uint32_t cnt = 0; // static uint32_t cntReadkWh = 0; if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生 { timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP); //清除定时器更新中断标志 } s_iCnt1000++; //1000ms计数器的计数值加1 cnt++; // cntReadkWh++; if(s_iCnt1000 >= 1000) //1000ms计数器的计数值大于或等于1000 { s_iCnt1000 = 0; //重置1000ms计数器的计数值为0 s_i1secFlag = 1; //将1s标志位的值设置为1 } if(cnt == 60000) { write_2_minute_flag = 1; cnt = 0; } // if(cntReadkWh == 5000) // { // read_kWh_flag = 1; // cntReadkWh = 0; // } } /********************************************************************************************************* * API函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:InitTimer * 函数功能:初始化Timer模块 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:使用的TIMER15-16由APB2(72MHz)预分频后输出。如果预分频为1,则由APB1*1输出,否则由APB1*2(72MHz)输出 *********************************************************************************************************/ void InitTimer(void) { // ConfigTimer2(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms ConfigTimer14(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms ConfigTimer15(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms ConfigTimer16(999, 71); //72MHz/(71+1)=1MHz,由0计数到999为1ms } /********************************************************************************************************* * 函数名称:Get20msFlag * 函数功能:获取2ms标志位的值 * 输入参数:void * 输出参数:void * 返 回 值:s_i2msFlag-2ms标志位的值 * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ unsigned char Get2msFlag(void) { return(s_i2msFlag); //返回2ms标志位的值 } /********************************************************************************************************* * 函数名称:Clr20msFlag * 函数功能:清除2ms标志位 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void Clr2msFlag(void) { s_i2msFlag = 0; //将2ms标志位的值设置为0 } /********************************************************************************************************* * 函数名称:Get100msFlag * 函数功能:获取100ms标志位的值 * 输入参数:void * 输出参数:void * 返 回 值:s_i2msFlag-100ms标志位的值 * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ unsigned char Get100msFlag(void) { return(s_i100msFlag); //返回100ms标志位的值 } /********************************************************************************************************* * 函数名称:Clr100msFlags * 函数功能:清除100ms标志位 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void Clr100msFlag(void) { s_i100msFlag = 0; //将100ms标志位的值设置为0 } /********************************************************************************************************* * 函数名称:Get1SecFlag * 函数功能:获取1s标志位的值 * 输入参数:void * 输出参数:void * 返 回 值:s_i1secFlag-1s标志位的值 * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ unsigned char Get1SecFlag(void) { return(s_i1secFlag); //返回1s标志位的值 } /********************************************************************************************************* * 函数名称:Clr1SecFlag * 函数功能:清除1s标志位 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void Clr1SecFlag(void) { s_i1secFlag = 0; //将1s标志位的值设置为0 }