亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3492|回復: 0
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
原理
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)
文檔: OTA升級.pdf (918.64 KB, 下載次數: 23)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表