/******************************************************************************** Copyright (C), Sinowealth Electronic. Ltd. Author: Sino Version: V0.0 Date: 2020/04/26 History: V2.0 2020/04/26 Preliminary ********************************************************************************/ #include "Main.h" /************************************************************************************************* * 函数名: InitVar * 参 数: 无 * 返回值: 无 * 描 述: 初始化变量,主要是非0变量。在ClrRam()函数中,已将所有Xdata/Idata/Data区全部清零 *************************************************************************************************/ void InitVar(void) { ucBalanceStep = BALANCE_ENABLE; MemorySet((U8 xdata *)slCadcCurBuf, 0, sizeof(slCadcCurBuf)); MemorySet((U8 xdata *)Info.uiVCell, 0, sizeof(Info.uiVCell)); Info.uiTS[0] = 2731; Info.uiTS[1] = 2731; bSlowDischarge = 0; bMidDischarge = 0; ucDsgingSpeed = 2; bFastDischarge = 1; bPorSelfTestFlg = 1; ucTempeMiddle = 80; } /************************************************************************************************* * 函数名: SysParaInit * 参 数: 无 * 返回值: 无 * 描 述: 从MCU Flash参数区读取数据,并针对部分变量进行初始化 *************************************************************************************************/ void SysParaInit(void) { if(McuFlashCheckFlg(MCUFLASH_BK1_FLG_ADDR)) { McuFlashRead(MCUFLASH_BK1_ADDR, XRAM_MAP_ADDR, 512); if(!McuFlashCheckFlg(MCUFLASH_BK2_FLG_ADDR)) { McuFlashWrite(MCUFLASH_BK2_ADDR, XRAM_MAP_ADDR); //更新备份区2 } } else if(McuFlashCheckFlg(MCUFLASH_BK2_FLG_ADDR)) { McuFlashRead(MCUFLASH_BK2_ADDR, XRAM_MAP_ADDR, 512); McuFlashWrite(MCUFLASH_BK1_ADDR, XRAM_MAP_ADDR); //更新备份区1 } else { bMcuFlashErr = 1; return; } uiPackConfig = E2uiPackConfigMap; Info.uiPackConfig = uiPackConfig; Info.ulFCC = E2ulFCC; Info.uiCycleCount = E2uiCycleCount; ucCellNum = (uiPackConfig&0x0007)+3; //根据配置初始化电芯串数和Offset if(ucCellNum==5 || ucCellNum==10) { ucCellNumOffset = 0; } else if(ucCellNum==4 || ucCellNum==9) { ucCellNumOffset = 1; } else { ucCellNumOffset = 2; } } /************************************************************************************************* * 函数名: InitIRQ * 参 数: 无 * 返回值: 无 * 描 述: 初始化中断 *************************************************************************************************/ void InitIRQ(void) { IrqDis(); //关闭总中断源 #if (UART0_DEFINE != 0) IrqUart0En(); //初始化UART0中断使能,根据具体使用UART模块来进行选择 //检查UART0是否正常,如果不正常,则复位指针向量 #endif #if (UART1_DEFINE != 0) IrqUart1En(); //初始化UART1中断使能,根据具体使用UART模块来进行选择 #endif #if (UART2_DEFINE != 0) IrqUart2En(); //初始化UART2中断使能,根据具体使用UART模块来进行选择 #endif IrqTimer3FlgClr(); //使能Timer3中断 IrqTimer3En(); IrqINT4xChEn(INT4_EXS45 | INT4_EXS46); IrqINT4Trig(INT4_TRIG_FALLING); //下降沿触发 IrqINT4FlgClr(); //清外部中断标志 IrqINT4En(); //使能外部中断4 IrqEn(); } /************************************************************************************************* * 函数名: InitGPIO * 参 数: 无 * 返回值: 无 * 描 述: 初始化I/O端口,未使用的I/O,默认配置为输出低电平,降低MCU功耗 P0.7[TXD], P0.6[RXD], P0.5[SCL], P0.4[SDA], P0.3[BLPW], P0.2[], P0.1[], P0.0[], P0.7ST[1], P0.6ST[1], P0.5ST[1], P0.4ST[1], P0.3ST[1], P0.2ST[0], P0.1ST[0], P0.0ST[0], P0 = 0xF8; P0.7CR[1], P0.6CR[0], P0.5CR[0], P0.4CR[0], P0.3CR[1], P0.2CR[1], P0.1CR[1], P0.0CR[1], P0CR = 0x8F; P0.7PC[1], P0.6PC[1], P0.5PC[0], P0.4PC[0], P0.3PC[1], P0.2PC[0], P0.1PC[0], P0.0PC[0], P0PCR = 0xC8; P1.7[RESET],P1.6[], P1.5[], P1.4[], P1.3[], P1.2[], P1.1[], P1.0[], P1.7ST[1], P1.6ST[0], P1.5ST[0], P1.4ST[0], P1.3ST[0], P1.2ST[0], P1.1ST[0], P1.0ST[0], P1 = 0x80; P1.7CR[0], P1.6CR[1], P1.5CR[1], P1.4CR[1], P1.3CR[1], P1.2CR[1], P1.1CR[1], P1.0CR[1], P1CR = 0x7F; P1.7PC[1], P1.6PC[0], P1.5PC[0], P1.4PC[0], P1.3PC[0], P1.2PC[0], P1.1PC[0], P1.0PC[0], P1PCR = 0x80; P2.7[KEY_M],P2.6[ALARM],P2.5[CTLD], P2.4[LED5], P2.3[LED4], P2.2[LED3], P2.1[LED2], P2.0[LED1], P2.7ST[1], P2.6ST[1], P2.5ST[1], P2.4ST[0], P2.3ST[0], P2.2ST[0], P2.1ST[0], P2.0ST[0], P2 = 0xE0; P2.7CR[0], P2.6CR[0], P2.5CR[1], P2.4CR[1], P2.3CR[1], P2.2CR[1], P2.1CR[1], P2.0CR[1], P2CR = 0x3F; P2.7PC[1], P2.6PC[1], P2.5PC[0], P2.4PC[0], P2.3PC[0], P2.2PC[0], P2.1PC[0], P2.0PC[0], P2PCR = 0xC0; P3.7[], P3.6[], P3.5[LED6], P3.4[XTAL1],P3.3[XTAL2],P3.2[], P3.1[], P3.0[KLED], P3.7ST[0], P3.6ST[0], P3.5ST[0], P3.4ST[1], P3.3ST[1], P3.2ST[0], P3.1ST[0], P3.0ST[1], P3 = 0x19; P3.7CR[1], P3.6CR[1], P3.5CR[1], P3.4CR[0], P3.3CR[0], P3.2CR[1], P3.1CR[1], P3.0CR[0], P3CR = 0xE6; P3.7PC[0], P3.6PC[0], P3.5PC[0], P3.4PC[1], P3.3PC[1], P3.2PC[0], P3.1PC[0], P3.0PC[1], P3PCR = 0x19; *************************************************************************************************/ /************************************************************************************************* * 函数名: InitGPIO_SL * 参 数: 无 * 返回值: 无 * 描 述: 初始化I/O端口,未使用的I/O,默认配置为输出低电平,降低MCU功耗 P0.7[TX], P0.6[RX], P0.5[SCL], P0.4[SDA], P0.3[], P0.2[], P0.1[], P0.0[], IO状态:P0.[7,6,5,4,3]有效 P0.7ST[1], P0.6ST[1], P0.5ST[1], P0.4ST[1], P0.3ST[0], P0.2ST[0], P0.1ST[0], P0.0ST[0], P0 = 0xF0; IO状态:P0.[7,6,5,4,3]有效 P0.7CR[1], P0.6CR[0], P0.5CR[0], P0.4CR[0], P0.3CR[1], P0.2CR[1], P0.1CR[1], P0.0CR[1], P0CR = 0x8F; IO方向:P0.[7,6,5,4,3]有效,1输出,0输入 P0.7PC[1], P0.6PC[1], P0.5PC[0], P0.4PC[0], P0.3PC[0], P0.2PC[0], P0.1PC[0], P0.0PC[0], P0PCR = 0xC0; 内部上拉:1开启,0关闭 P1.7[RESET],P1.6[], P1.5[], P1.4[], P1.3[], P1.2[], P1.1[], P1.0[], IO状态:P1.[7,6,5,4,3,2]有效 P1.7ST[1], P1.6ST[0], P1.5ST[0], P1.4ST[0], P1.3ST[0], P1.2ST[0], P1.1ST[0], P1.0ST[0], P1 = 0x80; IO状态:P1.[7,6,5,4,3,2]有效 P1.7CR[0], P1.6CR[1], P1.5CR[1], P1.4CR[1], P1.3CR[1], P1.2CR[1], P1.1CR[1], P1.0CR[1], P1CR = 0x7F; IO方向:P1.[7,6,5,4,3,2]有效,1输出,0输入 P1.7PC[1], P1.6PC[0], P1.5PC[0], P1.4PC[0], P1.3PC[0], P1.2PC[0], P1.1PC[0], P1.0PC[0], P1PCR = 0x80; 内部上拉:1开启,0关闭 P2.7[], P2.6[ALARM],P2.5[], P2.4[LED], P2.3[], P2.2[], P2.1[], P2.0[485_DE], IO状态:P2.[7,6,5,4,3,2,1,0]有效 P2.7ST[0], P2.6ST[1], P2.5ST[0], P2.4ST[0], P2.3ST[0], P2.2ST[1], P2.1ST[1], P2.0ST[0], P2 = 0x46; IO状态:P2.[7,6,5,4,3,2,1,0]有效 P2.7CR[1], P2.6CR[0], P2.5CR[1], P2.4CR[1], P2.3CR[1], P2.2CR[0], P2.1CR[1], P2.0CR[1], P2CR = 0xBB; IO方向:P2.[7,6,5,4,3,2,1,0]有效,1输出,0输入 P2.7PC[0], P2.6PC[1], P2.5PC[0], P2.4PC[0], P2.3PC[0], P2.2PC[1], P2.1PC[1], P2.0PC[1], P2PCR = 0x46; 内部上拉:1开启,0关闭 P3.7[], P3.6[], P3.5[BAT_V_C], P3.4[XTAL1],P3.3[XTAL2],P3.2[], P3.1[], P3.0[BAT_V], IO状态:P3.[5,4,3,...,0]有效 P3.7ST[0], P3.6ST[0], P3.5ST[0], P3.4ST[1], P3.3ST[1], P3.2ST[0], P3.1ST[0], P3.0ST[0], P3 = 0x18; IO状态:P3.[5,4,3,...,0]有效 P3.7CR[1], P3.6CR[1], P3.5CR[1], P3.4CR[0], P3.3CR[0], P3.2CR[1], P3.1CR[1], P3.0CR[0], P3CR = 0xE6; IO方向:P3.[5,4,3,...,0]有效,1输出,0输入 P3.7PC[0], P3.6PC[0], P3.5PC[0], P3.4PC[1], P3.3PC[1], P3.2PC[0], P3.1PC[0], P3.0PC[0], P3PCR = 0x18; 内部上拉:1开启,0关闭 *************************************************************************************************/ void InitGPIO(void) { P0 = 0xF0; P0CR = 0x8F; P0PCR = 0xC0; P1 = 0x80; P1CR = 0x7F; P1PCR = 0x80; P2 = 0x46; P2CR = 0xBB; P2PCR = 0x46; P3 = 0x18; P3CR = 0xE6; P3PCR = 0x18; //UART0相关IO配置 串口功能映射时注意配置相应IO口的寄存器值,保证功能可正常实现 #if (UART0_DEFINE == 1) P0 |= 0xC0; P0PCR |= 0x80; #endif #if (UART0_DEFINE == 2) P0 |= 0x40; P2 |= 0x10; P2PCR |= 0x10; #endif #if (UART0_DEFINE == 3) P0 |= 0x40; P2 |= 0x20; P2PCR |= 0x20; #endif #if (UART0_DEFINE == 4) P0 |= 0x41; P0PCR |= 0x01; #endif #if (UART0_DEFINE == 5) P0 |= 0x42; P0PCR |= 0x02; #endif #if (UART0_DEFINE == 6) P0 |= 0xC0; P0PCR |= 0x40; #endif #if (UART0_DEFINE == 7) P0 |= 0x80; P2 |= 0x10; P2PCR |= 0x10; #endif #if (UART0_DEFINE == 8) P0 |= 0x80; P2 |= 0x20; P2PCR |= 0x20; #endif #if (UART0_DEFINE == 9) P0 |= 0x81; P0PCR |= 0x01; #endif #if (UART0_DEFINE == 10) P0 |= 0x82; P0PCR |= 0x02; #endif #if (UART0_DEFINE == 11) P0 |= 0x40; P2 |= 0x10; P0PCR |= 0x40; #endif #if (UART0_DEFINE == 12) P0 |= 0x80; P2 |= 0x10; P0PCR |= 0x80; #endif #if (UART0_DEFINE == 13) P2 |= 0x30; P2PCR |= 0x20; #endif #if (UART0_DEFINE == 14) P0 |= 0x01; P2 |= 0x10; P0PCR |= 0x01; #endif #if (UART0_DEFINE == 15) P0 |= 0x02; P2 |= 0x10; P0PCR |= 0x02; #endif #if (UART0_DEFINE == 16) P0 |= 0x40; P2 |= 0x20; P0PCR |= 0x40; #endif #if (UART0_DEFINE == 17) P0 |= 0x80; P2 |= 0x20; P0PCR |= 0x80; #endif #if (UART0_DEFINE == 18) P2 |= 0x30; P2PCR |= 0x10; #endif #if (UART0_DEFINE == 19) P0 |= 0x01; P2 |= 0x20; P0PCR |= 0x01; #endif #if (UART0_DEFINE == 20) P0 |= 0x02; P2 |= 0x20; P0PCR |= 0x02; #endif #if (UART0_DEFINE == 21) P0 |= 0x81; P0PCR |= 0x80; #endif #if (UART0_DEFINE == 22) P0 |= 0x01; P2 |= 0x10; P2PCR |= 0x10; #endif #if (UART0_DEFINE == 23) P0 |= 0x01; P2 |= 0x20; P2PCR |= 0x20; #endif #if (UART0_DEFINE == 24) P0 |= 0x41; P0PCR |= 0x40; #endif #if (UART0_DEFINE == 25) P0 |= 0x03; P0PCR |= 0x02; #endif #if (UART0_DEFINE == 26) P0 |= 0x82; P0PCR |= 0x80; #endif #if (UART0_DEFINE == 27) P0 |= 0x02; P2 |= 0x10; P2PCR |= 0x10; #endif #if (UART0_DEFINE == 28) P0 |= 0x02; P2 |= 0x20; P2PCR |= 0x20; #endif #if (UART0_DEFINE == 29) P0 |= 0x42; P0PCR |= 0x40; #endif #if (UART0_DEFINE == 30) P0 |= 0x03; P0PCR |= 0x01; #endif //UART1相关IO配置 #if (UART1_DEFINE == 1) P1 |= 0x03; P1PCR |= 0x02; #endif #if (UART1_DEFINE == 2) P1 |= 0x01; P3 |= 0x08; P3PCR |= 0x08; #endif #if (UART1_DEFINE == 3) P1 |= 0x01; P3 |= 0x10; P3PCR |= 0x10; #endif #if (UART1_DEFINE == 4) P1 |= 0x01; P2 |= 0x40; P2PCR |= 0x40; #endif #if (UART1_DEFINE == 5) P1 |= 0x01; P2 |= 0x80; P2PCR |= 0x80; #endif #if (UART1_DEFINE == 6) P1 |= 0x03; P1PCR |= 0x01; #endif #if (UART1_DEFINE == 7) P1 |= 0x02; P3 |= 0x08; P3PCR |= 0x08; #endif #if (UART1_DEFINE == 8) P1 |= 0x02; P3 |= 0x10; P3PCR |= 0x10; #endif #if (UART1_DEFINE == 9) P1 |= 0x02; P2 |= 0x40; P2PCR |= 0x40; #endif #if (UART1_DEFINE == 10) P1 |= 0x02; P2 |= 0x80; P2PCR |= 0x80; #endif #if (UART1_DEFINE == 11) P1 |= 0x01; P3 |= 0x08; P1PCR |= 0x01; #endif #if (UART1_DEFINE == 12) P1 |= 0x02; P3 |= 0x08; P1PCR |= 0x01; #endif #if (UART1_DEFINE == 13) P3 |= 0x18; P3PCR |= 0x10; #endif #if (UART1_DEFINE == 14) P3 |= 0x08; P2 |= 0x40; P2PCR |= 0x40; #endif #if (UART1_DEFINE == 15) P3 |= 0x08; P2 |= 0x80; P2PCR |= 0x80; #endif #if (UART1_DEFINE == 16) P1 |= 0x01; P3 |= 0x10; P1PCR |= 0x01; #endif #if (UART1_DEFINE == 17) P1 |= 0x02; P3 |= 0x10; P1PCR |= 0x02; #endif #if (UART1_DEFINE == 18) P3 |= 0x18; P3PCR |= 0x08; #endif #if (UART1_DEFINE == 19) P3 |= 0x10; P2 |= 0x40; P2PCR |= 0x40; #endif #if (UART1_DEFINE == 20) P3 |= 0x10; P2 |= 0x80; P2PCR |= 0x80; #endif #if (UART1_DEFINE == 21) P1 |= 0x01; P2 |= 0x40; P1PCR |= 0x01; #endif #if (UART1_DEFINE == 22) P1 |= 0x02; P2 |= 0x40; P1PCR |= 0x02; #endif #if (UART1_DEFINE == 23) P2 |= 0x40; P3 |= 0x08; P3PCR |= 0x08; #endif #if (UART1_DEFINE == 24) P3 |= 0x10; P2 |= 0x40; P3PCR |= 0x10; #endif #if (UART1_DEFINE == 25) P2 |= 0xC0; P2PCR |= 0x80; #endif #if (UART1_DEFINE == 26) P1 |= 0x01; P2 |= 0x80; P1PCR |= 0x01; #endif #if (UART1_DEFINE == 27) P1 |= 0x02; P2 |= 0x80; P1PCR |= 0x02; #endif #if (UART1_DEFINE == 28) P2 |= 0x80; P3 |= 0x08; P3PCR |= 0x08; #endif #if (UART1_DEFINE == 29) P3 |= 0x10; P2 |= 0x80; P3PCR |= 0x10; #endif #if (UART1_DEFINE == 30) P2 |= 0xC0; P2PCR |= 0x40; #endif //UART2相关IO配置,当前demo板此串口做LED灯显示功能,不支持串口通讯,故demo板配置为不使能uart2串口功能 #if (UART2_DEFINE == 1) P2 |= 0x06; P2PCR |= 0x04; #endif } /************************************************************************************************* * 函数名: Initial * 参 数: 无 * 返回值: 无 * 描 述: 初始化 *************************************************************************************************/ void Initial(void) { McuClockSet(MCU_CLK_24MHz); //设置系统工作在24MHz InitGPIO(); //初始化GPIO // ClrRam(); //清空MCU RAM(XDATA、IDATA、DATA) SysParaInit(); //初始化系统参数 InitVar(); //初始化变量 McuTimer3Set(TIM_CLK_128KHz, 5); //初始化Timer,采用128KHz外置晶振,周期为5mS #if (UART0_DEFINE != 0) UART0Init(); //初始化UART0模块,9600Bps #endif #if (UART1_DEFINE != 0) UART1Init(); //初始化UART0模块,9600Bps #endif #if (UART2_DEFINE != 0) UART2Init(); //初始化UART0模块,9600Bps #endif TwiInit(); //初始化TWI模块,通讯频率为100Khz McuPWM2Set(4000, 100); //初始化PWM2,占空比100% AFEInitReg(); //初始化AFE寄存器 if(!AFEInit()) //初始化AFE,MCU是由AFE的V33供电的,当MCU工作时,AFE已经准备好通讯了 { bAfeErr = 1; } AFEClrFlg(); //清零AFE状态寄存器 if(bEnEEPRomBK) { if(!E2PRomInit()) { bE2PRErr = 1; //外挂EEPROM模块出错 } if(!RTCInitTime(&RTC)) { bRTCErr = 1; //外置RTC模块出错 } } InitIRQ(); //初始化中断 }