|
原理
MCU在運(yùn)行APP 程序時(shí),等待上位發(fā)送的升級(jí)指令,接收指令后通過(guò)復(fù)位重讀代碼選項(xiàng)指令轉(zhuǎn)
至Bootloader程序區(qū),隨后 Bootloader程序接收更新程序數(shù)據(jù),通過(guò)IAP 的操作方式對(duì) APP 程序區(qū)更
新。
單片機(jī)源程序如下:
#define ALLOCATE_EXTERN
#include "Include.h"
unsigned char xdata guc_UartReceiveBuf_a[135] = {0x00};//數(shù)據(jù)接收BUF
unsigned char guc_Uartcnt = 0; //接收數(shù)據(jù)計(jì)數(shù)
unsigned char guc_UartMode = 0; //當(dāng)前模式
unsigned char guc_UartFlag = 0; //串口接收完成標(biāo)志位
unsigned int gui_CRCValue = 0x00; //CRC校驗(yàn)值
unsigned char code guc_Error_One_a[] = "Sorry,FH Error\0"; //數(shù)據(jù)幀頭錯(cuò)誤
unsigned char code guc_Error_Two_a[] = "Sorry,CRC Error\0"; //CRC校驗(yàn)錯(cuò)誤
unsigned char code guc_Error_Three_a[] = "Sorry,Directive Error\0"; //指令錯(cuò)誤
unsigned char code guc_OK_One_a[] = "Entering ISP Mode...\0"; //正在進(jìn)入ISP模式
void main()
{
SystemInit();
while(1)
{
if(guc_UartMode == 0)
{
P1_0 = 0;
}
if(guc_UartFlag)
{
P1_0 = 1;
switch(guc_UartMode)
{
case 1 : //數(shù)據(jù)錯(cuò)誤模式
UART_Send_Str(guc_Error_One_a); //發(fā)送錯(cuò)誤提示
guc_UartMode = 0; //返回等待模式
guc_Uartcnt = 0; //計(jì)數(shù)值清0
memset(guc_UartReceiveBuf_a,0,135);//清除數(shù)據(jù)
guc_UartFlag = 0; //標(biāo)志位清零
break;
case 2 : //CRC校驗(yàn)
CRCC = 0x07; //CRC復(fù)位,LSB first,復(fù)位初值為0xFFFF
gui_CRCValue = CRC_CalcCRC(guc_UartReceiveBuf_a,guc_UartReceiveBuf_a[1]-2);
if(((gui_CRCValue/256)==guc_UartReceiveBuf_a[guc_UartReceiveBuf_a[1]-2])&&
((gui_CRCValue%256)==guc_UartReceiveBuf_a[guc_UartReceiveBuf_a[1]-1]))
{
guc_UartMode = 3; //CRC校驗(yàn)成功
}
else{guc_UartMode = 4;} //CRC校驗(yàn)錯(cuò)誤
break;
case 3 : //握手模式
if(guc_UartReceiveBuf_a[2] == 0x01)
{
UART_Send_Str(guc_OK_One_a);
ResetReadOption();
}
else{guc_UartMode = 5;} //指令錯(cuò)誤
break;
case 4 : //CRC校驗(yàn)錯(cuò)誤模式
UART_Send_Str(guc_Error_Two_a); //發(fā)送錯(cuò)誤提示
guc_UartMode = 0; //返回等待模式
guc_Uartcnt = 0; //計(jì)數(shù)值清0
memset(guc_UartReceiveBuf_a,0,135);//清除數(shù)據(jù)
guc_UartFlag = 0; //標(biāo)志位清零
break;
case 5 : //指令錯(cuò)誤模式
UART_Send_Str(guc_Error_Three_a);//發(fā)送錯(cuò)誤提示
guc_UartMode = 0; //返回等待模式
guc_Uartcnt = 0; //計(jì)數(shù)值清0
memset(guc_UartReceiveBuf_a,0,135);//清除數(shù)據(jù)
guc_UartFlag = 0; //標(biāo)志位清零
break;
default :
guc_UartMode = 0; //返回等到模式
guc_Uartcnt = 0; //計(jì)數(shù)值清0
memset(guc_UartReceiveBuf_a,0,135);//清除數(shù)據(jù)
guc_UartFlag = 0; //標(biāo)志位清零
break;
}
}
}
}
/***************************************************************************************
* @說(shuō)明 UART1中斷服務(wù)函數(shù)
* @參數(shù) 無(wú)
* @返回值 無(wú)
* @注 無(wú)
***************************************************************************************/
void UART1_Rpt(void) interrupt UART1_VECTOR
{
if(SCON & 0x01) //判斷接收中斷標(biāo)志位
{
guc_UartReceiveBuf_a[guc_Uartcnt++] = SBUF;//轉(zhuǎn)存8位串口接收數(shù)據(jù)
if((guc_UartReceiveBuf_a[0] == 0xAA)&&(guc_Uartcnt >= 2))
{
if(guc_Uartcnt >= guc_UartReceiveBuf_a[1])
{
SCON &=~ 0x10;
guc_UartMode = 2;
guc_UartFlag = 1;
}
}
else if(guc_UartReceiveBuf_a[0] != 0xAA)
{
SCON &=~ 0x10;
guc_UartFlag = 1;
guc_UartMode = 1;
}
SCON &=~ 0x01; //清除接收中斷標(biāo)志位
}
}
代碼工程可以從51hei下載附件:
HC89S003F4 OTA.rar
(36.04 KB, 下載次數(shù): 14)
2021-8-19 08:39 上傳
點(diǎn)擊文件名下載附件
代碼
文檔:
OTA升級(jí).pdf
(918.64 KB, 下載次數(shù): 23)
2021-8-19 08:39 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|