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