648 lines
12 KiB
C
648 lines
12 KiB
C
/********************************************************************************
|
||
Copyright (C), Sinowealth Electronic. Ltd.
|
||
Author: Sino
|
||
Version: V0.0
|
||
Date: 2020/04/26
|
||
History:
|
||
V2.0 2020/04/26 Preliminary
|
||
********************************************************************************/
|
||
#include "MCURegister.h"
|
||
#include "C51_TYPE.H"
|
||
#include "Flash.h"
|
||
#include "IapIsp.h"
|
||
#include "INTRINS.H"
|
||
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: InitGPIO
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 只需要初始化和供电系统相关的IO端口
|
||
*************************************************************************************************/
|
||
void InitGPIO(void)
|
||
{
|
||
P0 = 0xF8;
|
||
P0CR = 0x8F;
|
||
P0PCR = 0xC8;
|
||
|
||
P1 = 0x80;
|
||
P1CR = 0x7F;
|
||
P1PCR = 0x80;
|
||
|
||
P2 = 0xE0;
|
||
P2CR = 0x3F;
|
||
P2PCR = 0xC0;
|
||
|
||
P3 = 0x19;
|
||
P3CR = 0xE6;
|
||
P3PCR = 0x19;
|
||
|
||
#if (UART_DEFINE == 1)
|
||
P0 |= 0xC0;
|
||
P0PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 2)
|
||
P0 |= 0x40;
|
||
P2 |= 0x10;
|
||
P2PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 3)
|
||
P0 |= 0x40;
|
||
P2 |= 0x20;
|
||
P2PCR |= 0x20;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 4)
|
||
P0 |= 0x41;
|
||
P0PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 5)
|
||
P0 |= 0x42;
|
||
P0PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 6)
|
||
P0 |= 0xC0;
|
||
P0PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 7)
|
||
P0 |= 0x80;
|
||
P2 |= 0x10;
|
||
P2PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 8)
|
||
P0 |= 0x80;
|
||
P2 |= 0x20;
|
||
P2PCR |= 0x20;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 9)
|
||
P0 |= 0x81;
|
||
P0PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 10)
|
||
P0 |= 0x82;
|
||
P0PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 11)
|
||
P0 |= 0x40;
|
||
P2 |= 0x10;
|
||
P0PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 12)
|
||
P0 |= 0x80;
|
||
P2 |= 0x10;
|
||
P0PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 13)
|
||
P2 |= 0x30;
|
||
P2PCR |= 0x20;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 14)
|
||
P0 |= 0x01;
|
||
P2 |= 0x10;
|
||
P0PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 15)
|
||
P0 |= 0x02;
|
||
P2 |= 0x10;
|
||
P0PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 16)
|
||
P0 |= 0x40;
|
||
P2 |= 0x20;
|
||
P0PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 17)
|
||
P0 |= 0x80;
|
||
P2 |= 0x20;
|
||
P0PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 18)
|
||
P2 |= 0x30;
|
||
P2PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 19)
|
||
P0 |= 0x01;
|
||
P2 |= 0x20;
|
||
P0PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 20)
|
||
P0 |= 0x02;
|
||
P2 |= 0x20;
|
||
P0PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 21)
|
||
P0 |= 0x81;
|
||
P0PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 22)
|
||
P0 |= 0x01;
|
||
P2 |= 0x10;
|
||
P2PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 23)
|
||
P0 |= 0x01;
|
||
P2 |= 0x20;
|
||
P2PCR |= 0x20;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 24)
|
||
P0 |= 0x41;
|
||
P0PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 25)
|
||
P0 |= 0x03;
|
||
P0PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 26)
|
||
P0 |= 0x82;
|
||
P0PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 27)
|
||
P0 |= 0x02;
|
||
P2 |= 0x10;
|
||
P2PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 28)
|
||
P0 |= 0x02;
|
||
P2 |= 0x20;
|
||
P2PCR |= 0x20;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 29)
|
||
P0 |= 0x42;
|
||
P0PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 30)
|
||
P0 |= 0x03;
|
||
P0PCR |= 0x01;
|
||
#endif
|
||
|
||
//UART1相关IO配置
|
||
#if (UART_DEFINE == 31)
|
||
P1 |= 0x03;
|
||
P1PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 32)
|
||
P1 |= 0x01;
|
||
P3 |= 0x08;
|
||
P3PCR |= 0x08;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 33)
|
||
P1 |= 0x01;
|
||
P3 |= 0x10;
|
||
P3PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 34)
|
||
P1 |= 0x01;
|
||
P2 |= 0x40;
|
||
P2PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 35)
|
||
P1 |= 0x01;
|
||
P2 |= 0x80;
|
||
P2PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 36)
|
||
P1 |= 0x03;
|
||
P1PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 37)
|
||
P1 |= 0x02;
|
||
P3 |= 0x08;
|
||
P3PCR |= 0x08;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 38)
|
||
P1 |= 0x02;
|
||
P3 |= 0x10;
|
||
P3PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 39)
|
||
P1 |= 0x02;
|
||
P2 |= 0x40;
|
||
P2PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 40)
|
||
P1 |= 0x02;
|
||
P2 |= 0x80;
|
||
P2PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 41)
|
||
P1 |= 0x01;
|
||
P3 |= 0x08;
|
||
P1PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 42)
|
||
P1 |= 0x02;
|
||
P3 |= 0x08;
|
||
P1PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 43)
|
||
P3 |= 0x18;
|
||
P3PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 44)
|
||
P3 |= 0x08;
|
||
P2 |= 0x40;
|
||
P2PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 45)
|
||
P3 |= 0x08;
|
||
P2 |= 0x80;
|
||
P2PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 46)
|
||
P1 |= 0x01;
|
||
P3 |= 0x10;
|
||
P1PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 47)
|
||
P1 |= 0x02;
|
||
P3 |= 0x10;
|
||
P1PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 48)
|
||
P3 |= 0x18;
|
||
P3PCR |= 0x08;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 49)
|
||
P3 |= 0x10;
|
||
P2 |= 0x40;
|
||
P2PCR |= 0x40;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 50)
|
||
P3 |= 0x10;
|
||
P2 |= 0x80;
|
||
P2PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 51)
|
||
P1 |= 0x01;
|
||
P2 |= 0x40;
|
||
P1PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 52)
|
||
P1 |= 0x02;
|
||
P2 |= 0x40;
|
||
P1PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 53)
|
||
P2 |= 0x40;
|
||
P3 |= 0x08;
|
||
P3PCR |= 0x08;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 54)
|
||
P3 |= 0x10;
|
||
P2 |= 0x40;
|
||
P3PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 55)
|
||
P2 |= 0xC0;
|
||
P2PCR |= 0x80;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 56)
|
||
P1 |= 0x01;
|
||
P2 |= 0x80;
|
||
P1PCR |= 0x01;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 57)
|
||
P1 |= 0x02;
|
||
P2 |= 0x80;
|
||
P1PCR |= 0x02;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 58)
|
||
P2 |= 0x80;
|
||
P3 |= 0x08;
|
||
P3PCR |= 0x08;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 59)
|
||
P3 |= 0x10;
|
||
P2 |= 0x80;
|
||
P3PCR |= 0x10;
|
||
#endif
|
||
|
||
#if (UART_DEFINE == 60)
|
||
P2 |= 0xC0;
|
||
P2PCR |= 0x40;
|
||
#endif
|
||
|
||
//UART2相关IO配置,当前demo板此串口做LED灯显示功能,不支持串口通讯,故demo板配置为不使能uart2串口功能
|
||
#if (UART_DEFINE == 61)
|
||
P2 |= 0x06;
|
||
P2PCR |= 0x02;
|
||
#endif
|
||
}
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: InitIRQ
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 关闭所有中断即可
|
||
*************************************************************************************************/
|
||
void InitIRQ(void)
|
||
{
|
||
IEN0 = 0x00;
|
||
IEN1 = 0x00;
|
||
IEN2 = 0x00;
|
||
}
|
||
#if ((UART_DEFINE >= 1)&&(UART_DEFINE<= 30))
|
||
/*************************************************************************************************
|
||
* 函数名: UARTInit
|
||
* 参 数: Bps: UART通讯波特率
|
||
* 返回值: 无
|
||
* 描 述: 初始化UART模块
|
||
*************************************************************************************************/
|
||
void UARTInit(void)
|
||
{
|
||
#if UART_DEFINE == 1
|
||
UART0CR = 0x32;
|
||
#elif UART_DEFINE == 2
|
||
UART0CR = 0x42;
|
||
#elif UART_DEFINE == 3
|
||
UART0CR = 0x52;
|
||
#elif UART_DEFINE == 4
|
||
UART0CR = 0x02;
|
||
#elif UART_DEFINE == 5
|
||
UART0CR = 0x12;
|
||
#elif UART_DEFINE == 6
|
||
UART0CR = 0x23;
|
||
#elif UART_DEFINE == 7
|
||
UART0CR = 0x43;
|
||
#elif UART_DEFINE == 8
|
||
UART0CR = 0x53;
|
||
#elif UART_DEFINE == 9
|
||
UART0CR = 0x03;
|
||
#elif UART_DEFINE == 10
|
||
UART0CR = 0x13;
|
||
#elif UART_DEFINE == 11
|
||
UART0CR = 0x24;
|
||
#elif UART_DEFINE == 12
|
||
UART0CR = 0x34;
|
||
#elif UART_DEFINE == 13
|
||
UART0CR = 0x54;
|
||
#elif UART_DEFINE == 14
|
||
UART0CR = 0x04;
|
||
#elif UART_DEFINE == 15
|
||
UART0CR = 0x14;
|
||
#elif UART_DEFINE == 16
|
||
UART0CR = 0x25;
|
||
#elif UART_DEFINE == 17
|
||
UART0CR = 0x35;
|
||
#elif UART_DEFINE == 18
|
||
UART0CR = 0x45;
|
||
#elif UART_DEFINE == 19
|
||
UART0CR = 0x05;
|
||
#elif UART_DEFINE == 20
|
||
UART0CR = 0x15;
|
||
#elif UART_DEFINE == 21
|
||
UART0CR = 0x30;
|
||
#elif UART_DEFINE == 22
|
||
UART0CR = 0x40;
|
||
#elif UART_DEFINE == 23
|
||
UART0CR = 0x50;
|
||
#elif UART_DEFINE == 24
|
||
UART0CR = 0x20;
|
||
#elif UART_DEFINE == 25
|
||
UART0CR = 0x10;
|
||
#elif UART_DEFINE == 26
|
||
UART0CR = 0x31;
|
||
#elif UART_DEFINE == 27
|
||
UART0CR = 0x41;
|
||
#elif UART_DEFINE == 28
|
||
UART0CR = 0x51;
|
||
#elif UART_DEFINE == 29
|
||
UART0CR = 0x21;
|
||
#elif UART_DEFINE == 30
|
||
UART0CR = 0x01;
|
||
#endif
|
||
|
||
PCON = 0x00;
|
||
SCON = 0x50;
|
||
SBRTH = UART_BPS_H;
|
||
SBRTL = UART_BPS_L;
|
||
SFINE = UART_BPS_F;
|
||
SBRTH |= 0x80;
|
||
SADDR = 0x0A;
|
||
SADEN = 0xFF;
|
||
}
|
||
|
||
#elif ((UART_DEFINE >= 31)&&(UART_DEFINE<= 60))
|
||
void UARTInit(void)
|
||
{
|
||
INSCON = 0x00;
|
||
#if UART_DEFINE == 31
|
||
UART1CR = 0x10;
|
||
#elif UART_DEFINE == 32
|
||
UART1CR = 0x40;
|
||
#elif UART_DEFINE == 33
|
||
UART1CR = 0x50;
|
||
#elif UART_DEFINE == 34
|
||
UART1CR = 0x20;
|
||
#elif UART_DEFINE == 35
|
||
UART1CR = 0x30;
|
||
#elif UART_DEFINE == 36
|
||
UART1CR = 0x01;
|
||
#elif UART_DEFINE == 37
|
||
UART1CR = 0x41;
|
||
#elif UART_DEFINE == 38
|
||
UART1CR = 0x51;
|
||
#elif UART_DEFINE == 39
|
||
UART1CR = 0x21;
|
||
#elif UART_DEFINE == 40
|
||
UART1CR = 0x31;
|
||
#elif UART_DEFINE == 41
|
||
UART1CR = 0x04;
|
||
#elif UART_DEFINE == 42
|
||
UART1CR = 0x14;
|
||
#elif UART_DEFINE == 43
|
||
UART1CR = 0x54;
|
||
#elif UART_DEFINE == 44
|
||
UART1CR = 0x24;
|
||
#elif UART_DEFINE == 45
|
||
UART1CR = 0x34;
|
||
#elif UART_DEFINE == 46
|
||
UART1CR = 0x05;
|
||
#elif UART_DEFINE == 47
|
||
UART1CR = 0x15;
|
||
#elif UART_DEFINE == 48
|
||
UART1CR = 0x45;
|
||
#elif UART_DEFINE == 49
|
||
UART1CR = 0x25;
|
||
#elif UART_DEFINE == 50
|
||
UART1CR = 0x35;
|
||
#elif UART_DEFINE == 51
|
||
UART1CR = 0x02;
|
||
#elif UART_DEFINE == 52
|
||
UART1CR = 0x12;
|
||
#elif UART_DEFINE == 53
|
||
UART1CR = 0x42;
|
||
#elif UART_DEFINE == 54
|
||
UART1CR = 0x52;
|
||
#elif UART_DEFINE == 55
|
||
UART1CR = 0x32;
|
||
#elif UART_DEFINE == 56
|
||
UART1CR = 0x03;
|
||
#elif UART_DEFINE == 57
|
||
UART1CR = 0x13;
|
||
#elif UART_DEFINE == 58
|
||
UART1CR = 0x43;
|
||
#elif UART_DEFINE == 59
|
||
UART1CR = 0x53;
|
||
#elif UART_DEFINE == 60
|
||
UART1CR = 0x23;
|
||
#endif
|
||
INSCON = 0x40;
|
||
|
||
PCON1 = 0x00;
|
||
SCON1 = 0x50; //配置Uart工作在模式1
|
||
SBRTH1 = UART_BPS_H;
|
||
SBRTL1 = UART_BPS_L;
|
||
SFINE1 = UART_BPS_F;
|
||
SBRTH1 |= 0x80; //使能波特率发生器
|
||
SADDR1 = 0x0A; //UART地址初始化,默认为0x0A
|
||
SADEN1 = 0xFF;
|
||
INSCON = 0x00;
|
||
}
|
||
#elif (UART_DEFINE == 61)
|
||
void UARTInit(void)
|
||
{
|
||
INSCON = 0x40;
|
||
PCON2 = 0x00;
|
||
SCON2 = 0x50; //配置Uart工作在模式1
|
||
SBRTH2 = UART_BPS_H; //115200bps
|
||
SBRTL2 = UART_BPS_L;
|
||
SFINE2 = UART_BPS_F;
|
||
SBRTH2 |= 0x80; //使能波特率发生器
|
||
SADDR2 = 0x0A; //UART地址初始化,默认为0x0A
|
||
SADEN2 = 0xFF;
|
||
INSCON = 0x00;
|
||
}
|
||
#else
|
||
#Error: "UART_DEFINE ERROR"
|
||
#endif
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: Initial
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 初始化系统
|
||
*************************************************************************************************/
|
||
void Initial(void)
|
||
{
|
||
InitIRQ();
|
||
InitGPIO();
|
||
bHandsheakOkFlg = 0;
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: main
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: Boot区主函数
|
||
*************************************************************************************************/
|
||
void main(void)
|
||
{
|
||
BootMcuWdtClear();
|
||
Initial(); //硬件资源初始化
|
||
|
||
//1.获取远程升级标志位状态,存在IAP程序升级标志,需要进行程序升级处理
|
||
if(McuFlashRdOneByte(BOOT_FLG_IAP_ADDR, MCU_TYPE_CODE) == IAP_FLG)
|
||
{
|
||
bIapIspFlg = IAP_MODE;
|
||
ucMcuFlashWrValid = 0x55; //设置MCU Code区可操作标志,防止误写
|
||
if(BootUpgradeCode()) //升级程序
|
||
{
|
||
ucMcuFlashWrValid = 0;
|
||
((void(code*)(void))IAP_CODE_START_ADDR)(); //升级成功则跳转到应用程序首地址
|
||
}
|
||
else if(BootUpgradeCode()) //升级程序
|
||
{
|
||
ucMcuFlashWrValid = 0;
|
||
((void(code*)(void))IAP_CODE_START_ADDR)(); //升级成功则跳转到应用程序首地址
|
||
}
|
||
else
|
||
{
|
||
while(1)
|
||
{
|
||
ucMcuFlashWrValid = 0;
|
||
SUSLO = 0x55;
|
||
PCON |= 0x02;
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
}
|
||
}
|
||
}
|
||
//2.判断是否ISP成功,如果该标志存在表示之前的ISP失败,需要在BOOT区重新ISP
|
||
else if(McuFlashRdOneByte(BOOT_FLG_ISP_ADDR, MCU_TYPE_CODE) == ISP_FLG)
|
||
{
|
||
bIapIspFlg = ISP_MODE;
|
||
BootIapIsp();
|
||
}
|
||
//3.无升级需求,直接跳转到应用程序区
|
||
else
|
||
{
|
||
((void(code*)(void))IAP_CODE_START_ADDR)();
|
||
}
|
||
}
|
||
|
||
|
||
|