久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3106|回復: 0
收起左側

HC89S003F4單片機OTA升級代碼和說明

[復制鏈接]
ID:961004 發表于 2021-8-19 08:44 | 顯示全部樓層 |閱讀模式
原理
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;                                        //清除接收中斷標志位
        }                                                                        
}



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

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人欧美 | 成人在线精品 | 日韩久久成人 | 国产激情三区 | 99re视频在线观看 | 午夜激情在线视频 | 91资源在线 | 精品欧美视频 | 日日干干 | 国产一区二区影院 | 91久久国产综合久久91精品网站 | 免费黄色成人 | 亚洲国产精品久久久久秋霞不卡 | 国产精品视频免费观看 | 日韩高清中文字幕 | 日韩免费av网站 | 久久久久久国模大尺度人体 | 91麻豆精品国产91久久久资源速度 | 最新毛片网站 | 天天色图| 亚洲a在线观看 | 欧美黄色片 | 亚洲激情视频在线 | 九九免费在线视频 | 国产玖玖 | 国产一区| 欧美综合在线观看 | 午夜www | 美女视频网站久久 | 国产国语精品 | 日韩精品视频在线观看一区二区三区 | 特一级毛片 | 福利视频大全 | 在线午夜 | 国产这里只有精品 | 国产精品久久国产精品 | 亚洲精品99 | 欧美综合一区二区三区 | 91干b| 亚洲视频一区 | 狠狠婷婷综合久久久久久妖精 |