ZDBMS/code_app/Initial.c

590 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
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 RAMXDATA、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()) //初始化AFEMCU是由AFE的V33供电的当MCU工作时AFE已经准备好通讯了
{
bAfeErr = 1;
}
AFEClrFlg(); //清零AFE状态寄存器
if(bEnEEPRomBK)
{
if(!E2PRomInit())
{
bE2PRErr = 1; //外挂EEPROM模块出错
}
if(!RTCInitTime(&RTC))
{
bRTCErr = 1; //外置RTC模块出错
}
}
InitIRQ(); //初始化中断
}