789 lines
21 KiB
C
789 lines
21 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"
|
|||
|
|
|||
|
BOOL bIapIspFlg; //0<><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ǰִ<C7B0><D6B4>IAP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ǰִ<C7B0><D6B4>ISP<53><50><EFBFBD><EFBFBD>
|
|||
|
BOOL bHandsheakOkFlg;
|
|||
|
BOOL bUartSndOverFlg;
|
|||
|
U16 uiUartRcvChkSum;
|
|||
|
U8 ucUartErrCode;
|
|||
|
U8 ucUartBufPT;
|
|||
|
U32 ulIapDataPtr;
|
|||
|
U32 ulIapChksum;
|
|||
|
U32 ulIapRecDataLen;
|
|||
|
U8 ucIapIndexBk;
|
|||
|
U8 ucIapRestCommand;
|
|||
|
U8 xdata ucUartBuf[150];
|
|||
|
U8 xdata ucIapBuf[MCU_CODE_SECTOR_SIZE];
|
|||
|
|
|||
|
extern void UARTInit(void);
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: UartSendAck
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>Slave<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
void UartSendAck(void)
|
|||
|
{
|
|||
|
U8 i, DataBak;
|
|||
|
U16 CheckSum = 0;
|
|||
|
|
|||
|
ucUartBuf[LENGTH] = 0x00;
|
|||
|
ucUartBuf[COMMAND] = 0x0B;
|
|||
|
|
|||
|
DataBak = ucUartBuf[SOURCE]; //<2F><><EFBFBD><EFBFBD>ԴID<49><44>Ŀ<EFBFBD><C4BF>ID
|
|||
|
ucUartBuf[SOURCE] = ucUartBuf[TARGET];
|
|||
|
ucUartBuf[TARGET] = DataBak;
|
|||
|
|
|||
|
for(i=2; i<(ucUartBuf[LENGTH]+7); i++)
|
|||
|
{
|
|||
|
CheckSum += ucUartBuf[i];
|
|||
|
}
|
|||
|
|
|||
|
ucUartBuf[7+ucUartBuf[LENGTH]] = (U8)CheckSum;
|
|||
|
ucUartBuf[8+ucUartBuf[LENGTH]] = (U8)(CheckSum>>8);
|
|||
|
|
|||
|
bUartSndOverFlg = 0;
|
|||
|
UartTxEn(ucUartBuf[ucUartBufPT]);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapHandShake
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD>飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IAP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
bIapIspFlg: 0--IAP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1--ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
void IapHandShake(void)
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = 0;
|
|||
|
if(ucUartBuf[DATA]=='I' && ucUartBuf[DATA+1]=='A' && ucUartBuf[DATA+2]=='P')
|
|||
|
{
|
|||
|
bIapIspFlg = IAP_MODE;
|
|||
|
bHandsheakOkFlg = 1;
|
|||
|
}
|
|||
|
else if(ucUartBuf[DATA]=='I' && ucUartBuf[DATA+1]=='S' && ucUartBuf[DATA+2]=='P')
|
|||
|
{
|
|||
|
bIapIspFlg = ISP_MODE;
|
|||
|
bHandsheakOkFlg = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_HANDSHAKE; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
bHandsheakOkFlg = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapBeginAck
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CODE<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30K
|
|||
|
*************************************************************************************************/
|
|||
|
void IapBeginAck(void)
|
|||
|
{
|
|||
|
U8 i, SectorNum, McuFlashType;
|
|||
|
U32 McuFlashAddr;
|
|||
|
|
|||
|
ulIapDataPtr = 0;
|
|||
|
ulIapChksum = 0;
|
|||
|
ulIapRecDataLen = 0;
|
|||
|
ulIapRecDataLen = ((U32)ucUartBuf[DATA+3]<<24) //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
| ((U32)ucUartBuf[DATA+2]<<16)
|
|||
|
| ((U32)ucUartBuf[DATA+1]<<8)
|
|||
|
| (U32)ucUartBuf[DATA];
|
|||
|
|
|||
|
if(!bHandsheakOkFlg)
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_HANDSHAKE; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
}
|
|||
|
|
|||
|
if((ulIapRecDataLen > IAP_BK_CODE_SIZE) && (bIapIspFlg == IAP_MODE))
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_SIZE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD>IAP<41><50>ISP<53><50><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>쳣
|
|||
|
}
|
|||
|
else if((ulIapRecDataLen > ISP_CODE_SIZE) && (bIapIspFlg == ISP_MODE))
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_SIZE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD>IAP<41><50>ISP<53><50><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>쳣
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = 0; //<2F><>Ԥ<EFBFBD><D4A4><EFBFBD>ظ<EFBFBD><D8B8>ɹ<EFBFBD>
|
|||
|
ucIapIndexBk = 0;
|
|||
|
|
|||
|
//1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<53><50><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>BOOT<4F><54><EFBFBD>ı<EFBFBD>־<EFBFBD><D6BE>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>BOOT_FLG_ISP_ADD<44><44>дISP_FLG<4C><47>־0xA5
|
|||
|
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
|
|||
|
McuFlashEraseSector(BOOT_FLG_START_ADDR, MCU_TYPE_CODE);
|
|||
|
if(McuFlashBlankCheck(BOOT_FLG_START_ADDR, MCU_TYPE_CODE)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if(bIapIspFlg == ISP_MODE)
|
|||
|
{
|
|||
|
McuFlashWrOneByte(BOOT_FLG_ISP_ADDR, ISP_FLG, MCU_TYPE_CODE);
|
|||
|
if(McuFlashRdOneByte(BOOT_FLG_ISP_ADDR, MCU_TYPE_CODE) != ISP_FLG)
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_WR; //Writeʧ<65><CAA7>
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_ERASE; //Eraseʧ<65><CAA7>
|
|||
|
}
|
|||
|
ucMcuFlashWrValid = 0;
|
|||
|
|
|||
|
//2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IAP<41><50><EFBFBD><EFBFBD>ISP<53><50><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sector<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>EEPROM<4F><4D>
|
|||
|
if(ucUartBuf[INDEXES] == 0) //<2F><><EFBFBD><EFBFBD>ucUartBuf[INDEXES]
|
|||
|
{
|
|||
|
SectorNum = ulIapRecDataLen/MCU_CODE_SECTOR_SIZE;
|
|||
|
for(i=0; i<SectorNum; i++) //<2F>Ȳ<EFBFBD><C8B2><EFBFBD>CODE<44><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sector
|
|||
|
{
|
|||
|
McuFlashType = MCU_TYPE_CODE; //<2F><>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>flash
|
|||
|
if(bIapIspFlg == ISP_MODE)
|
|||
|
{
|
|||
|
McuFlashAddr = ISP_CODE_START_ADDR; //ISP<53><50>ʼ<EFBFBD><CABC>ַ
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
McuFlashAddr = IAP_BK_CODE_START_ADDR; //IAP<41><50>ʼ<EFBFBD><CABC>ַ
|
|||
|
}
|
|||
|
McuFlashAddr += (U16)i*512; //ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>ʼ<EFBFBD><CABC>ַ
|
|||
|
|
|||
|
if(bIapIspFlg == ISP_MODE) //ISPģʽ<C4A3><CABD>ֱ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>EEPROM
|
|||
|
{
|
|||
|
if(i>=(SectorNum-APP_PARA_SIZE/MCU_CODE_SECTOR_SIZE)) //EEPROM<4F><4D>sector<6F><72><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
McuFlashType = MCU_TYPE_E2P;
|
|||
|
McuFlashAddr = (U16)(i+APP_PARA_SIZE/MCU_CODE_SECTOR_SIZE-SectorNum)*512;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
|
|||
|
McuFlashEraseSector(McuFlashAddr, McuFlashType);
|
|||
|
if(!McuFlashBlankCheck(McuFlashAddr, McuFlashType)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_ERASE; //Eraseʧ<65><CAA7>
|
|||
|
}
|
|||
|
ucMcuFlashWrValid = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_INDEX;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapWrSector
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: д<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>Sector<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
BOOL IapWrSector(void)
|
|||
|
{
|
|||
|
BOOL Result = 1;
|
|||
|
U16 i;
|
|||
|
U32 McuFlashAddr;
|
|||
|
U8 McuFlashType;
|
|||
|
|
|||
|
for(i=0; i<MCU_CODE_SECTOR_SIZE; i++) //<2F><><EFBFBD><EFBFBD>д1<D0B4><31>sector
|
|||
|
{
|
|||
|
McuFlashType = MCU_TYPE_CODE;
|
|||
|
if(bIapIspFlg == ISP_MODE) //ISP
|
|||
|
{
|
|||
|
McuFlashAddr = ISP_CODE_START_ADDR + ulIapDataPtr;
|
|||
|
if(McuFlashAddr >= (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE))
|
|||
|
{
|
|||
|
McuFlashAddr = McuFlashAddr - (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE);
|
|||
|
McuFlashType = MCU_TYPE_E2P; //ISP<53><50><EFBFBD><EFBFBD>EEPROM<4F><4D>
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
McuFlashAddr = IAP_BK_CODE_START_ADDR + ulIapDataPtr;
|
|||
|
}
|
|||
|
McuFlashWrOneByte(McuFlashAddr, ucIapBuf[i], McuFlashType);
|
|||
|
if(ucIapBuf[i] != McuFlashRdOneByte(McuFlashAddr, McuFlashType))
|
|||
|
{
|
|||
|
Result = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
ulIapDataPtr++;
|
|||
|
}
|
|||
|
|
|||
|
return Result;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapReceiveData
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MCU CODE<EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
void IapReceiveData(void)
|
|||
|
{
|
|||
|
U16 i;
|
|||
|
U8 j;
|
|||
|
U32 McuFlashAddr;
|
|||
|
U8 McuFlashType;
|
|||
|
|
|||
|
bHandsheakOkFlg = 0;
|
|||
|
|
|||
|
if( ((ucUartBuf[INDEXES]<ucIapIndexBk) || (ucUartBuf[INDEXES]>(ucIapIndexBk+4))) && (ucUartBuf[INDEXES] != 0) ) //yangweilei
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_INDEX; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<C7B7><F1B3ACB3><EFBFBD>Χ
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucIapIndexBk = ucUartBuf[INDEXES];
|
|||
|
ucUartBuf[INDEXES] = 0;
|
|||
|
if(ucUartBuf[LENGTH] == 0)
|
|||
|
{
|
|||
|
ulIapDataPtr += 512; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ǰ128<32><38><EFBFBD>ֽ<EFBFBD>Ϊ0<CEAA><30>ָ<EFBFBD><D6B8><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>д(<28><><EFBFBD><EFBFBD>150mS/1K)
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
j = ucIapIndexBk % 4; //Ŀǰ<C4BF>ݶ<EFBFBD>sector<6F><72><EFBFBD><EFBFBD>Ϊ512bytes<65><73>ÿ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>128bytes<65><73><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>Ϊ4
|
|||
|
for(i=0; i<ucUartBuf[LENGTH]; i++)
|
|||
|
{
|
|||
|
ucIapBuf[i+(U16)j*ucUartBuf[LENGTH]] = ucUartBuf[DATA+i];
|
|||
|
}
|
|||
|
if(j == 3) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>sector<6F><72><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
|
|||
|
if(!IapWrSector()) //<2F><>һ<EFBFBD><D2BB>дsector<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дһ<D0B4><D2BB>
|
|||
|
{
|
|||
|
if(ulIapDataPtr >= MCU_CODE_SECTOR_SIZE)
|
|||
|
{
|
|||
|
ulIapDataPtr -= MCU_CODE_SECTOR_SIZE; //ָ<>뷵<EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Sector<6F><72>ʼ
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ulIapDataPtr = 0;
|
|||
|
}
|
|||
|
|
|||
|
McuFlashType = MCU_TYPE_CODE; //Ĭ<><C4AC><EFBFBD><EFBFBD>CODE<44><45>
|
|||
|
if(bIapIspFlg == ISP_MODE) //ISP
|
|||
|
{
|
|||
|
McuFlashAddr = ISP_CODE_START_ADDR + ulIapDataPtr;
|
|||
|
if(McuFlashAddr >= (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE))
|
|||
|
{
|
|||
|
McuFlashAddr = McuFlashAddr - (ulIapRecDataLen+BOOT_CODE_SIZE-APP_PARA_SIZE);
|
|||
|
McuFlashType = MCU_TYPE_E2P; //ISP<53><50><EFBFBD><EFBFBD>EEPROM<4F><4D>
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
McuFlashAddr = IAP_BK_CODE_START_ADDR + ulIapDataPtr;
|
|||
|
}
|
|||
|
ucMcuFlashWrValid = 0x55;
|
|||
|
McuFlashEraseSector(McuFlashAddr, McuFlashType);
|
|||
|
if(McuFlashBlankCheck(McuFlashAddr, McuFlashType)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if(!IapWrSector()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<F2B7B5BB><D8B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>쳣
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_WR; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
goto UpdateChksum;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_ERASE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
else //512Bytesд<73><D0B4><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>checksumֵ
|
|||
|
{
|
|||
|
UpdateChksum:
|
|||
|
for(j=0; j<MCU_CODE_SECTOR_SIZE/4; j++) //<2F><><EFBFBD><EFBFBD>checksum<75><6D>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>32bit<69><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>STM32
|
|||
|
{
|
|||
|
ulIapChksum += (((U32)ucIapBuf[j*4+3]<<24)
|
|||
|
| ((U32)ucIapBuf[j*4+2]<<16)
|
|||
|
| ((U32)ucIapBuf[j*4+1]<<8)
|
|||
|
| ((U32)ucIapBuf[j*4+0]));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ucMcuFlashWrValid = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapRDataVerify
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>֤CheckSum<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>ȷ
|
|||
|
*************************************************************************************************/
|
|||
|
void IapRDataVerify(void)
|
|||
|
{
|
|||
|
U32 CheckSum = 0;
|
|||
|
|
|||
|
CheckSum = ((U32)ucUartBuf[DATA+3]<<24) //<2F><>ȡ<EFBFBD><C8A1>λ<EFBFBD><CEBB><EFBFBD>·<EFBFBD><C2B7><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
|
|||
|
| ((U32)ucUartBuf[DATA+2]<<16)
|
|||
|
| ((U32)ucUartBuf[DATA+1]<<8)
|
|||
|
| ((U32)ucUartBuf[DATA+0]);
|
|||
|
|
|||
|
if(ulIapChksum != CheckSum) //<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_CRC;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = 0; //<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ɹ<EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IapCmdReset
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Program<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>0x0000<EFBFBD><EFBFBD>ַ
|
|||
|
ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BOOT<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
IAP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BOOT<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>д0x5A<EFBFBD><EFBFBD>APP<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
void IapCmdReset(void)
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = 0;
|
|||
|
ucIapRestCommand = IAP_CMD_RESET;
|
|||
|
|
|||
|
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>MCU Code<64><65><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>д
|
|||
|
McuFlashEraseSector(BOOT_FLG_START_ADDR, MCU_TYPE_CODE);
|
|||
|
if(McuFlashBlankCheck(BOOT_FLG_START_ADDR, MCU_TYPE_CODE)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if(bIapIspFlg == IAP_MODE) //IAP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>BOOT<4F><54><EFBFBD>ı<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>д0x5A
|
|||
|
{
|
|||
|
McuFlashWrOneByte(BOOT_FLG_IAP_ADDR, IAP_FLG, MCU_TYPE_CODE);
|
|||
|
if(McuFlashRdOneByte(BOOT_FLG_IAP_ADDR, MCU_TYPE_CODE) != IAP_FLG)
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_WR; //Writeʧ<65><CAA7>
|
|||
|
ucIapRestCommand = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = IAPERROR_ERASE; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
ucIapRestCommand = 0;
|
|||
|
}
|
|||
|
ucMcuFlashWrValid = 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: UartCmdProcess
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
void UartCmdProcess(void)
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
if(uiUartRcvChkSum != ((ucUartBuf[ucUartBuf[LENGTH]+8]<<8) + ucUartBuf[ucUartBuf[LENGTH]+7]))
|
|||
|
{
|
|||
|
ucUartErrCode |= IAPERROR_CHECKSUM;
|
|||
|
}
|
|||
|
|
|||
|
if(ucUartErrCode != 0) //<2F><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6>
|
|||
|
{
|
|||
|
ucUartBuf[INDEXES] = ucUartErrCode;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(ucUartBuf[COMMAND] == IAP_CMD_HANDSHAKE) //IAP<41><50>ISP<53><50><EFBFBD><EFBFBD>Э<EFBFBD>飬<EFBFBD><E9A3AC>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
IapHandShake();
|
|||
|
}
|
|||
|
else if(ucUartBuf[COMMAND] == IAP_CMD_BEGIN) //<2F><>ʼIAP<41><50>ISP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CODE<44><45>/EEP<45><50>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
IapBeginAck();
|
|||
|
}
|
|||
|
else if(ucUartBuf[COMMAND] == IAP_CMD_TRANS) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>д<EFBFBD>롢У<EBA1A2><D0A3>
|
|||
|
{
|
|||
|
IapReceiveData();
|
|||
|
}
|
|||
|
else if(ucUartBuf[COMMAND] == IAP_CMD_VERIFY) //
|
|||
|
{
|
|||
|
IapRDataVerify();
|
|||
|
}
|
|||
|
else if(ucUartBuf[COMMAND] == IAP_CMD_RESET)
|
|||
|
{
|
|||
|
IapCmdReset();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
UartSendAck();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: BootIapIsp
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: IAP<EFBFBD><EFBFBD>ISP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*************************************************************************************************/
|
|||
|
void BootIapIsp(void)
|
|||
|
{
|
|||
|
ulIapDataPtr = 0;
|
|||
|
ulIapChksum = 0;
|
|||
|
ucIapRestCommand = 0;
|
|||
|
UARTInit();
|
|||
|
while(1)
|
|||
|
{
|
|||
|
#if ((UART_DEFINE >= 1)&&(UART_DEFINE<= 30))
|
|||
|
{
|
|||
|
if(RI)
|
|||
|
{
|
|||
|
//BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
|
|||
|
ucUartBuf[ucUartBufPT] = SBUF;
|
|||
|
ucUartBufPT++;
|
|||
|
if(ucUartBufPT >= 140) //<2F><>ָ<EFBFBD>벻<EFBFBD>ᳬ<EFBFBD><E1B3AC>140
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
if(ucUartBufPT == 1)
|
|||
|
{
|
|||
|
if(ucUartBuf[HEARD1] != 0x5A) //<2F><><EFBFBD><EFBFBD>֡ͷ<D6A1>Ƿ<EFBFBD>Wie0x5AA5
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else if(ucUartBufPT == 2)
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBuf[HEARD2] != 0xA5)
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
uiUartRcvChkSum = 0; //֡ͷ<D6A1>ж<EFBFBD><D0B6><EFBFBD>ȷ
|
|||
|
ucUartErrCode = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBufPT < (ucUartBuf[LENGTH]+9))
|
|||
|
{
|
|||
|
if(ucUartBufPT <= (ucUartBuf[LENGTH]+7))
|
|||
|
{
|
|||
|
uiUartRcvChkSum += ucUartBuf[ucUartBufPT-1];
|
|||
|
}
|
|||
|
|
|||
|
if(ucUartBufPT == (TARGET+1)) //<2F><><EFBFBD><EFBFBD>ID
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBuf[TARGET] != IAP_BMSID)
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else if(ucUartBufPT == (COMMAND+1)) //<2F><><EFBFBD><EFBFBD>COMMAND
|
|||
|
{
|
|||
|
if((ucUartBuf[COMMAND] != IAP_CMD_HANDSHAKE)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_BEGIN)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_TRANS)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_VERIFY)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_RESET))
|
|||
|
{
|
|||
|
ucUartErrCode |= IAPERROR_CMD;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
BootMcuWdtClear();
|
|||
|
UartCmdProcess();
|
|||
|
}
|
|||
|
}
|
|||
|
RI = 0;
|
|||
|
}
|
|||
|
|
|||
|
if(TI)
|
|||
|
{
|
|||
|
BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
|
|||
|
|
|||
|
if(ucUartBufPT >= (ucUartBuf[LENGTH]+8))
|
|||
|
{
|
|||
|
UartRxEn(); //Allow UART receive data
|
|||
|
ucUartBufPT = 0;
|
|||
|
ucUartBuf[0] = 0;
|
|||
|
ucUartBuf[1] = 0;
|
|||
|
ucUartBuf[2] = 0;
|
|||
|
bUartSndOverFlg = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBufPT++;
|
|||
|
UartTxEn(ucUartBuf[ucUartBufPT]);
|
|||
|
}
|
|||
|
|
|||
|
TI = 0;
|
|||
|
}
|
|||
|
|
|||
|
if(ucIapRestCommand == IAP_CMD_RESET)
|
|||
|
{
|
|||
|
BootMcuWdtClear();
|
|||
|
if(bUartSndOverFlg) //Reset֡<74>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
bUartSndOverFlg = 0;
|
|||
|
ucIapRestCommand = 0;
|
|||
|
((void(code*)(void))0x0000)();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#elif ((UART_DEFINE >= 31)&&(UART_DEFINE<= 60))
|
|||
|
{
|
|||
|
INSCON = 0x40;
|
|||
|
if(RI1)
|
|||
|
{
|
|||
|
//BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
|
|||
|
ucUartBuf[ucUartBufPT] = SBUF1;
|
|||
|
INSCON = 0x00;
|
|||
|
ucUartBufPT++;
|
|||
|
if(ucUartBufPT >= 140) //<2F><>ָ<EFBFBD>벻<EFBFBD>ᳬ<EFBFBD><E1B3AC>140
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
if(ucUartBufPT == 1)
|
|||
|
{
|
|||
|
if(ucUartBuf[HEARD1] != 0x5A) //<2F><><EFBFBD><EFBFBD>֡ͷ<D6A1>Ƿ<EFBFBD>Wie0x5AA5
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else if(ucUartBufPT == 2)
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBuf[HEARD2] != 0xA5)
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
uiUartRcvChkSum = 0; //֡ͷ<D6A1>ж<EFBFBD><D0B6><EFBFBD>ȷ
|
|||
|
ucUartErrCode = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBufPT < (ucUartBuf[LENGTH]+9))
|
|||
|
{
|
|||
|
if(ucUartBufPT <= (ucUartBuf[LENGTH]+7))
|
|||
|
{
|
|||
|
uiUartRcvChkSum += ucUartBuf[ucUartBufPT-1];
|
|||
|
}
|
|||
|
|
|||
|
if(ucUartBufPT == (TARGET+1)) //<2F><><EFBFBD><EFBFBD>ID
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBuf[TARGET] != IAP_BMSID)
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else if(ucUartBufPT == (COMMAND+1)) //<2F><><EFBFBD><EFBFBD>COMMAND
|
|||
|
{
|
|||
|
if((ucUartBuf[COMMAND] != IAP_CMD_HANDSHAKE)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_BEGIN)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_TRANS)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_VERIFY)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_RESET))
|
|||
|
{
|
|||
|
ucUartErrCode |= IAPERROR_CMD;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
BootMcuWdtClear();
|
|||
|
UartCmdProcess();
|
|||
|
}
|
|||
|
}
|
|||
|
INSCON = 0x40;
|
|||
|
RI1 = 0;
|
|||
|
INSCON = 0x00;
|
|||
|
}
|
|||
|
INSCON = 0x40;
|
|||
|
|
|||
|
if(TI1)
|
|||
|
{
|
|||
|
INSCON = 0x00;
|
|||
|
BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
|
|||
|
|
|||
|
if(ucUartBufPT >= (ucUartBuf[LENGTH]+8))
|
|||
|
{
|
|||
|
UartRxEn(); //Allow UART receive data
|
|||
|
ucUartBufPT = 0;
|
|||
|
ucUartBuf[0] = 0;
|
|||
|
ucUartBuf[1] = 0;
|
|||
|
ucUartBuf[2] = 0;
|
|||
|
bUartSndOverFlg = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBufPT++;
|
|||
|
UartTxEn(ucUartBuf[ucUartBufPT]);
|
|||
|
}
|
|||
|
INSCON = 0x40;
|
|||
|
|
|||
|
TI1 = 0;
|
|||
|
INSCON = 0x00;
|
|||
|
}
|
|||
|
|
|||
|
if(ucIapRestCommand == IAP_CMD_RESET)
|
|||
|
{
|
|||
|
BootMcuWdtClear();
|
|||
|
if(bUartSndOverFlg) //Reset֡<74>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
bUartSndOverFlg = 0;
|
|||
|
ucIapRestCommand = 0;
|
|||
|
((void(code*)(void))0x0000)();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#elif ( UART_DEFINE == 61)
|
|||
|
{
|
|||
|
INSCON = 0x40;
|
|||
|
if(RI2)
|
|||
|
{
|
|||
|
//BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
|
|||
|
ucUartBuf[ucUartBufPT] = SBUF2;
|
|||
|
INSCON = 0x00;
|
|||
|
ucUartBufPT++;
|
|||
|
if(ucUartBufPT >= 140) //<2F><>ָ<EFBFBD>벻<EFBFBD>ᳬ<EFBFBD><E1B3AC>140
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
if(ucUartBufPT == 1)
|
|||
|
{
|
|||
|
if(ucUartBuf[HEARD1] != 0x5A) //<2F><><EFBFBD><EFBFBD>֡ͷ<D6A1>Ƿ<EFBFBD>Wie0x5AA5
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else if(ucUartBufPT == 2)
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBuf[HEARD2] != 0xA5)
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
uiUartRcvChkSum = 0; //֡ͷ<D6A1>ж<EFBFBD><D0B6><EFBFBD>ȷ
|
|||
|
ucUartErrCode = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBufPT < (ucUartBuf[LENGTH]+9))
|
|||
|
{
|
|||
|
if(ucUartBufPT <= (ucUartBuf[LENGTH]+7))
|
|||
|
{
|
|||
|
uiUartRcvChkSum += ucUartBuf[ucUartBufPT-1];
|
|||
|
}
|
|||
|
|
|||
|
if(ucUartBufPT == (TARGET+1)) //<2F><><EFBFBD><EFBFBD>ID
|
|||
|
{
|
|||
|
|
|||
|
if(ucUartBuf[TARGET] != IAP_BMSID)
|
|||
|
{
|
|||
|
ucUartBufPT = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else if(ucUartBufPT == (COMMAND+1)) //<2F><><EFBFBD><EFBFBD>COMMAND
|
|||
|
{
|
|||
|
if((ucUartBuf[COMMAND] != IAP_CMD_HANDSHAKE)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_BEGIN)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_TRANS)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_VERIFY)
|
|||
|
&& (ucUartBuf[COMMAND] != IAP_CMD_RESET))
|
|||
|
{
|
|||
|
ucUartErrCode |= IAPERROR_CMD;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
BootMcuWdtClear();
|
|||
|
UartCmdProcess();
|
|||
|
}
|
|||
|
}
|
|||
|
INSCON = 0x40;
|
|||
|
RI2 = 0;
|
|||
|
INSCON = 0x00;
|
|||
|
}
|
|||
|
INSCON = 0x40;
|
|||
|
|
|||
|
if(TI2)
|
|||
|
{
|
|||
|
INSCON = 0x00;
|
|||
|
BootMcuWdtClear(); //<2F>ڸó<DAB8><C3B3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>UARTͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ͨѶ<CDA8>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
|
|||
|
|
|||
|
if(ucUartBufPT >= (ucUartBuf[LENGTH]+8))
|
|||
|
{
|
|||
|
UartRxEn(); //Allow UART receive data
|
|||
|
ucUartBufPT = 0;
|
|||
|
ucUartBuf[0] = 0;
|
|||
|
ucUartBuf[1] = 0;
|
|||
|
ucUartBuf[2] = 0;
|
|||
|
bUartSndOverFlg = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ucUartBufPT++;
|
|||
|
UartTxEn(ucUartBuf[ucUartBufPT]);
|
|||
|
}
|
|||
|
INSCON = 0x40;
|
|||
|
|
|||
|
TI2 = 0;
|
|||
|
INSCON = 0x00;
|
|||
|
}
|
|||
|
|
|||
|
if(ucIapRestCommand == IAP_CMD_RESET)
|
|||
|
{
|
|||
|
BootMcuWdtClear();
|
|||
|
if(bUartSndOverFlg) //Reset֡<74>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
bUartSndOverFlg = 0;
|
|||
|
ucIapRestCommand = 0;
|
|||
|
((void(code*)(void))0x0000)();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|