找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3131|回復(fù): 0
收起左側(cè)

HC89S003F4單片機(jī)OTA升級(jí)代碼和說(shuō)明

[復(fù)制鏈接]
ID:961004 發(fā)表于 2021-8-19 08:44 | 顯示全部樓層 |閱讀模式
原理
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)志位
        }                                                                        
}



1.png 2.png
代碼工程可以從51hei下載附件: HC89S003F4 OTA.rar (36.04 KB, 下載次數(shù): 14)
文檔: OTA升級(jí).pdf (918.64 KB, 下載次數(shù): 23)

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表