/******************************************************************************** Copyright (C), Sinowealth Electronic. Ltd. Author: Sino Version: V0.0 Date: 2020/04/26 History: V2.0 2020/04/26 Preliminary ********************************************************************************/ #include "Main.h" #include "stdio.h" // 发送字符串 char putchar(char c) { REN = 0; // 开启发送 IO_485_DE = 1; // 开启485发送 SBUF = c; // 发 while(!TI); IO_485_DE = 0; // 关闭485发送 TI = 0; return c; } /************************************************************************************************* * 函数名: main * 参 数: 无 * 返回值: 无 * 描 述: 主函数,当初始化结束后,程序会在While(1)中死循环 1.可通过定时器来触发各个功能模块的执行 2.可通过其他中断源来触发对应模块的执行 *************************************************************************************************/ void main(void) { Initial(); //初始化系统 printf("SystemClock: 8MHz"); while(1) { //KeyProcess(); //按键处理 if(bTimer50msFlg) //50mS处理和AFE相关的数据采集、计算、保护等 { McuWDTClear(); //定时清狗 bTimer50msFlg = 0; AFEInfoProcess(); //获取AFE信息,计算电压、温度、电流 BalanceProcess(); //平衡及断线处理 ProtectProcess(); //电压、电流、温度保护 PorSelfTest(); //第一次上电保护检测(延时较短,暂定50mS一次检测) LoadCheck(); //检测负载是否释放 ChgerCheck(); //检测充电器是否释放 MosCtrl(); //MOS状态检测及控制 ProtectOCRecover(); //过流保护自恢复 //LedDisplay(); //LED显示 #if (UART0_DEFINE != 0) Uart0Check(); //检查UART0是否正常,如果不正常,则复位指针向量 #endif #if (UART1_DEFINE != 0) Uart1Check(); //检查UART1是否正常,如果不正常,则复位指针向量 #endif #if (UART2_DEFINE != 0) Uart2Check(); //检查UART2是否正常,如果不正常,则复位指针向量 #endif } if(bTimer1sFlg) //1s定时周期 { IO_LED = ~IO_LED; //LED // printf("\r\n"); // printf("BAT0:%.2f mV\r\n", AFE.uiCell[0]*1.0*CALIVOL/E2uiVPackGain); // printf("BAT1:%.2f mV\r\n", AFE.uiCell[1]*1.0*CALIVOL/E2uiVPackGain); // printf("BAT2:%.2f mV\r\n", AFE.uiCell[2]*1.0*CALIVOL/E2uiVPackGain); // printf("BAT3:%.2f mV\r\n", AFE.uiCell[3]*1.0*CALIVOL/E2uiVPackGain); // printf("BAT4:%.2f mV\r\n", AFE.uiCell[4]*1.0*CALIVOL/E2uiVPackGain); // printf("TOTAL:%.2f mV\r\n",(AFE.uiCell[1]+AFE.uiCell[2]+AFE.uiCell[3]+AFE.uiCell[4])*1.0*CALIVOL/E2uiVPackGain); // // printf("\r\n"); // printf("TEMP I0:%.2f C\r\n", AFE.uiICTempe[0]*17.0/100.0-270); // printf("TEMP I1:%.2f C\r\n", AFE.uiICTempe[1]*17.0/100.0-270); // printf("TEMP E0:%.2f C\r\n", AFE.uiTS[0]*1.0); // printf("TEMP E1:%.2f C\r\n", AFE.uiTS[1]*1.0); // // printf("\r\n"); // printf("CURR I1:%.2f mA\r\n", AFE.siCurr*1000.0*1000.0/16384/5); // printf("\r\nBSTATUS:%x\r\n", REG.AFEBSTATUS); bTimer1sFlg = 0; GasGaugeManage(); //Calculate the battery charge and discharge capacity AFERamCheck(); //检测AFE寄存器是否误写 AFETwiCheck(); //检测AFE有无连续5S通讯错误 E2PRomTwiCheck(); //检测EEPROM有无连续5S通讯错误 RTCTwiCheck(); //检测RTC有无连续5S通讯错误 if(!RamCheckProcess()) //检测参数变量区是否误写 { SysParaInit(); } McuFlashWrWaitCheck(); //检测是否需要更新参数到MCU Flash E2PRomBKCheck(); //备份EEPROM //LowPowerCheck(); //低功耗检测 } SystemResetProcess(); //系统复位 ISPProcess(); //在线升级代码 CaliProcess(); //校准 McuFlashProcess(); //备份参数到MCU Flash区 E2PRomBKProcess(); //外挂EEPROM备份 //LowPowerProcess(); //低功耗处理 Info.uiPackStatus = uiPackStatus; //更新PACK和Battery的信息,可通过UART反馈给主机 Info.uiBatStatus = uiBatStatus; } }