/** * @copyright None * @file GPIO.c * @author Comment Vivre * @date 2025-11-03 * @brief None */ #include /** @function GPIO_Init @brief IO初始化 @date 2025-11-01 */ void GPIO_Init(void) { // LED上拉 低电平点亮 SetBit(P0_OE, P03); SetBit(P0_PU, P03); GP03 = 1; // 主电源继电器驱动 高使能 SetBit(P5_OE, P51); SetBit(P5_PU, P51); GP51 = 0; // 预驱复位控制 低复位 SetBit(P0_OE, P04); SetBit(P0_PU, P04); GP04 = 0; } /** @function PreDriver_Falut_Init @brief 预驱故障中断 @date 2025-10-31 */ void PreDriver_Falut_Init(void) { // 关闭输出 配置上拉 ClrBit(P0_OE, PIN2); SetBit(P0_PU, PIN2); // 中断源配置为P02 SetReg(LVSR, EXT0CFG0 | EXT0CFG1 | EXT0CFG2, EXT0CFG1); // 清除中断标志位 IF0 = 0; // 配置为下降沿触发 IT01 = 0; IT00 = 1; // 中断触发时自动关闭MOE SetBit(EVT_FILT, INT0_MOE_EN); // 不滤波 ClrBit(EVT_FILT, EFDIV0 | EFDIV1); // 配置中断优先级为最高 SetBit(IP0, PX00 | PX01); // 外部中断0使能 EX0 = 1; } LED_Control_t ledControl = { LED_STATE_OFF, 0, 0 }; /** @function LED_State_Display @brief 指示运行与故障代码 @param[in] Xn0: [输入/出] 故障代码 @date 2025-05-30 */ void LED_State_Display(uint8_t Xn0) { switch (ledControl.LedState) { // 关闭状态 case LED_STATE_OFF: // 存在故障 切入故障状态 清零计数 if (Xn0) { ledControl.LedState = LED_STATE_BLINK_FAULT; ledControl.PauseDelayCnt = 0; ledControl.BlinkCnt = 0; } // 开启状态且无故障 切入开启状态并打开LED else if (isCtrlPowOn) { ledControl.LedState = LED_STATE_ON; LED_ON; } break; // 开启状态 case LED_STATE_ON: // 故障或停止时 关闭LED并切回关闭状态 if (!isCtrlPowOn || Xn0) { ledControl.LedState = LED_STATE_OFF; LED_OFF; } break; // 故障指示状态 case LED_STATE_BLINK_FAULT: ledControl.PauseDelayCnt ++; // 延时等待 if (ledControl.PauseDelayCnt >= 500) { ledControl.PauseDelayCnt = 0; LED_TOGGLE; // 灭灯时计数 if (LED_OFF_STATE) { ledControl.BlinkCnt ++; // 完成一个周期的闪烁 切换到延时等待模式 if (ledControl.BlinkCnt >= Xn0) { ledControl.LedState = LED_STATE_POST_FAULT_DELAY; } } } // 故障清除后 立刻回到熄灭状态 if (!Xn0) { LED_OFF; ledControl.LedState = LED_STATE_OFF; } break; // 延迟等待 case LED_STATE_POST_FAULT_DELAY: ledControl.PauseDelayCnt ++; // 延时满足或故障清除回到关闭状态 if ((ledControl.PauseDelayCnt >= 1000) || (!Xn0)) { ledControl.LedState = LED_STATE_OFF; } break; } } volatile Power_Control_t powerControl = {DELAY_POWER_ON, 0}; /** @function Power_In_Control @brief 上电控制与预驱复位控制 @date 2025-11-01 */ void Power_In_Control(void) { switch (powerControl.PowerSate) { case DELAY_POWER_ON: { powerControl.PowerInCnt ++; if (powerControl.PowerInCnt > 1000) { // 继电器上电 MAIN_RELAY = 1; powerControl.PowerInCnt = 0; powerControl.PowerSate = DELAY_FREE_RST; } break; } case DELAY_FREE_RST: { powerControl.PowerInCnt ++; if (powerControl.PowerInCnt > 500) { powerControl.PowerInCnt = 0; powerControl.PowerSate = POWER_RUN; } break; } case POWER_RUN: { #if 0 // 暂不释放复位 if (mcFaultSource == FaultNoSource) { PRE_DRIVER_RST = 1; } #endif } } } /*Value--定时时间,单位ms,最小定时时间8ms,最大定时1800ms*/ void WatchDogConfig(uint32 value, uint8 Status) { SetReg(CCFG1, WDT_EN, (Status ? WDT_EN : 0x00)); WDT_ARR = ((uint16)(65532 - value * 32768 / 1000) >> 8); ClrBit(WDT_CR, WDTF); SetBit(WDT_CR, WDTRF); }