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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4899|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

關(guān)于STC8A8K64S單片機(jī)遠(yuǎn)程升級討論

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:301968 發(fā)表于 2022-1-17 09:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)話題,相信很多朋友都有討論和使用。今天我就說說我自已成功使用的方法。首先單片機(jī)需要有這個(gè)IAP功能。STC單片機(jī)在選型時(shí)要注意,不是哪一款都可以,要有IAP功能才行。單片機(jī)通過串口或其它通訊方式,接收升級BIN文件,寫入到內(nèi)部FLASH中,校驗(yàn)通過,執(zhí)行自動(dòng)升級過程。我的升級思想及過程如下。
1:出廠程序:(含有IAP功能)程序起址地址為單片機(jī)內(nèi)存的后半部份,例如0X8000,KEIL中需要設(shè)置一下

2:為什么要設(shè)置成后半部份,這是因?yàn)槲野亚鞍氩糠莸目臻g留給后續(xù)需要升級時(shí)的程序。
3:因?yàn)橹袛嘞蛄坎糠菰谧钋懊娴膬?nèi)存空間,無法改變,因此我的升級方法比較簡單暴力。當(dāng)接收完校驗(yàn)通過后,直接改變中斷向量部份空間。
4:貼出代碼:
  1. int main()
  2. {                 
  3.         LEDs_up_ten_flag=0; //流水燈開始
  4.         GPIOInit();          //GPIO+時(shí)鐘初始化
  5.         Iap_Isp();          //升級包檢測
  6.         Uart1_Init();                //115200bps@24MHz
  7.         Uart2_Init();                //9600bps@24MHz
  8.         Timer0Init();       //1毫秒@24.000MHz   
  9.         printf("\r\n青橙新能源4G控制充電板V00啟動(dòng)成功!\r\n");
  10.          LETCAT1_Init(); //模組初始化及登陸服務(wù)器
  11.        LB0910_Init(); //0910初始化
  12.          BUZZFlag=1;
  13.         WDT_CONTR = 0x27;//使能看門狗,溢出時(shí)間約為5s        
  14.         BeatTimescnt=BeatTimesSet-10;  //快速上線心跳
  15. //          Read_PortTimes(); //讀出端口時(shí)間數(shù)據(jù) 云端已實(shí)現(xiàn)
  16.           RestTimes=0;
  17.                 LEDs_up_ten_flag=1;//流水燈禁止
  18.                 while(1)
  19.                         {                 
  20.                                         LED_show();
  21.                                         Uart1_drive();                           //串口功能函數(shù),主循環(huán)中調(diào)用        
  22.                                         Uart2_drive();                           //串口功能函數(shù),主循環(huán)中調(diào)用                                  HeartbeatServer();
  23.                                         WDT_CONTR |= 0x10;    //清看門狗,否則系統(tǒng)復(fù)位
  24.                                   if(RestTimes>=120)
  25.                                         {
  26.                                                 RestTimes=0;
  27.                                                 IAP_CONTR |= 0x60;
  28.                                         }
  29.                         }                                
  30. }        


  31. #include "EEPROM.H"

  32. u16 code IAP_Code1[60]={                                                                                                                                                                                       
  33.                                                                                                                 0x0200,0x0400,0x0600,0x0800,0x0A00,0x0C00,0x0E00,  //升級版地址30K
  34.                                                                                                          0x1000,0x1200,0x1400,0x1600,0x1800,0x1A00,0x1C00,0x1E00,
  35.                                                                                                          0x2000,0x2200,0x2400,0x2600,0x2800,0x2A00,0x2C00,0x2E00,
  36.                                                                                                          0x3000,0x3200,0x3400,0x3600,0x3800,0x3A00,0x3C00,0x3E00,
  37.                                                                                                          0x4000,0x4200,0x4400,0x4600,0x4800,0x4A00,0x4C00,0x4E00,
  38.                                                                                                          0x5000,0x5200,0x5400,0x5600,0x5800,0x5A00,0x5C00,0x5E00,
  39.                                                                                                          0x6000,0x6200,0x6400,0x6600,0x6800,0x6A00,0x6C00,0x6E00,
  40.                                                                                                          0x7000,0x7200,0x7400,0x7600,0x7800                                                                                                                                                                                       
  41.                                                                                                 };
  42.          
  43. /*u16 code IAP_Code2[50]={ 0x8000,0x8200,0x8400,0x8600,0x8800,0x8A00,0x8C00,0x8E00,
  44.                                                                                                                 0x9000,0x9200,0x9400,0x9600,0x9800,0x9A00,0x9C00,0x9E00,            //基礎(chǔ)版軟件放置地址        25K                                                                                                                                                                        
  45.                                                                                                                 0xA000,0xA200,0xA400,0xA600,0xA800,0xAA00,0xAC00,0xAE00,
  46.                                                                                                                 0xB000,0xB200,0xB400,0xB600,0xB800,0xBA00,0xBC00,0xBE00,
  47.                                                                                                                 0xC000,0xC200,0xC400,0xC600,0xC800,0xCA00,0xCC00,0xCE00,
  48.                                                                                                                 0xD000,0xD200,0xD400,0xD600,0xD800,0xDA00,0xDC00,0xDE00,
  49.                                                                                                                 0xE000,0xE200,                                                                                         
  50.                                                                                                 };
  51.                                                                                                 */


  52. void IapIdle()                   //關(guān)閉 IAP功能 并保護(hù)數(shù)據(jù)
  53. {
  54.         IAP_CONTR = 0;          // 關(guān)閉 IAP 功能
  55.         IAP_CMD = 0;                         // 清除命令寄存器
  56.         IAP_TRIG = 0;                 // 清除觸發(fā)寄存器
  57.         IAP_ADDRH = 0x80; // 將地址設(shè)置到非 IAP 區(qū)域
  58.         IAP_ADDRL = 0;
  59. }

  60. u8 IapRead(u16 addr)                                // 讀數(shù)據(jù)的操作
  61. {
  62.         char dat;
  63.         IAP_CONTR = WT_24M;                                                 // 使能 IAP
  64.         IAP_CMD = 1;                                                                         // 設(shè)置 IAP 讀命令
  65.         IAP_ADDRL = addr;                                                 // 設(shè)置 IAP 低地址
  66.         IAP_ADDRH = addr >> 8;                                 // 設(shè)置 IAP 高地址
  67.         IAP_TRIG = 0x5a;                                                         // 寫觸發(fā)命令 (0x5a)
  68.         IAP_TRIG = 0xa5;                                                         // 寫觸發(fā)命令 (0xa5)
  69.         _nop_();
  70.         dat = IAP_DATA;                                                         // 讀 IAP 數(shù)據(jù)
  71.         IapIdle();                                                                          // 關(guān)閉 IAP 功能
  72.         return dat;
  73. }

  74. void IapProgram(u16 addr, u8 dat)                 //寫數(shù)據(jù)操作。
  75. {
  76.         IAP_CONTR = WT_24M;                                   // 使能 IAP
  77.         IAP_CMD = 2;                                                                   // 設(shè)置 IAP 寫命令
  78.         IAP_ADDRL = addr;                                          // 設(shè)置 IAP 低地址
  79.         IAP_ADDRH = addr >> 8;                         // 設(shè)置 IAP 高地址
  80.         IAP_DATA = dat;                                                         // 寫 IAP 數(shù)據(jù)
  81.         IAP_TRIG = 0x5a;                                                         // 寫觸發(fā)命令 (0x5a)
  82.         IAP_TRIG = 0xa5;                                                         // 寫觸發(fā)命令 (0xa5)
  83.         _nop_();
  84.         IapIdle();                                                                          // 關(guān)閉 IAP 功能
  85. }

  86. void IapErase(u16 addr)
  87. {
  88.         IAP_CONTR =WT_24M;                  // 使能 IAP
  89.         IAP_CMD = 3;                                                 // 設(shè)置 IAP 擦除命令
  90.         IAP_ADDRL = addr;                         // 設(shè)置 IAP 低地址
  91.         IAP_ADDRH = addr >> 8;         // 設(shè)置 IAP 高地址
  92.         IAP_TRIG = 0x5a;                                 // 寫觸發(fā)命令 (0x5a)
  93.         IAP_TRIG = 0xa5;                                 // 寫觸發(fā)命令 (0xa5)
  94.         _nop_();                                                                                          //
  95.         IapIdle();                                                                          // 關(guān)閉 IAP 功能
  96. }


  97. void Iap_Isp()
  98. {

  99.         ///系統(tǒng)切換,當(dāng)讀到IAPADD地址存有IAP程序中斷向量文件時(shí),寫到0X0000地址中,并重啟到新的
  100.         u8 IapBootCode=0;
  101.         u16 i;

  102.         for(i=0;i<0x0200;i++)
  103.         {         
  104.                 IapBootCode=IapRead[i];                //讀出ISP中斷向量文件塊
  105.                 IapProgram(ISPadd+i, IapBootCode);     //保存在專用區(qū),IAP返回ISP時(shí)使用。備用  ISPadd=0xF400
  106.         }
  107.         IapBootCode=IapRead(IAPadd);                                                  //讀出升級文件IAP保存區(qū)起始跳轉(zhuǎn)數(shù)據(jù),如果有,表示有升級程序,需要寫入起始區(qū),0x0000;寫入后就可以使用升級程序了
  108.         if(IapBootCode==0x02)               
  109.         {                                
  110.                 IapErase(0x0000);                                                          //擦除中斷向量文件塊,準(zhǔn)備寫入新的IAP中斷向量
  111.                 for(i=0;i<0x0200;i++)
  112.                 {
  113.                         IapBootCode=IapRead(IAPadd+i);             //讀出IAP中斷向量文件塊,
  114.                         IapProgram(i, IapBootCode);                      //將IAP的中斷向量區(qū)寫入起始位置
  115.                 }        
  116.                 IapErase(IAPadd);                                        //擦除IAP中斷向量文件塊,防止死循環(huán)。
  117.                 IAP_CONTR=0x60;                                          //重啟,將進(jìn)入IAP程序
  118.         }
  119.         
  120. }


  121.    if(CmpMemory(pbuf,&cmd7[0], sizeof(cmd7)-1))      //升級程序包接收轉(zhuǎn)存功能程序
  122.          {
  123.                 u16 m=0,n=0,temchar=0;
  124.                   static xdata Buftem[0x0200]={0};  //IAP臨時(shí)保存
  125.                  static u8 Hchar=0;    static u8 Lchar=0;          //臨時(shí)字高位 //臨時(shí)字低位
  126.                 static bit Saveflag=0;                                        // 存儲標(biāo)志
  127.                   ET0=0;
  128.                   BeatTimescnt=0;                                                          //收到指令,將心跳時(shí)間復(fù)位        
  129.                         RestTimes=0;                        
  130.                         StorageArray(&IAP_num[0],&Uart1_Rxd_buff[0],15);   //轉(zhuǎn)化提取升級包序號
  131.                         IAPnum=(u8)atoi(IAP_num);
  132.                          pbuf=&Uart1_Rxd_buff[0];                          //接收指令轉(zhuǎn)賦值        
  133.                         
  134.                         for(n=0;n<Uart1_bufcnt;n++)
  135.                         {
  136.                                  temchar=*(pbuf+n);
  137.                                 if(temchar=='\"')                      //判斷“號的數(shù)量,
  138.                                         m++;
  139.                                 if(m==19&&temchar!='\"')   //提取數(shù)據(jù)包數(shù)據(jù),存入EEPARM中
  140.                                 {
  141.                                         if(Saveflag==0)
  142.                                         {
  143.                                                 if(temchar>='0'&&temchar<='9') //如果接收到的是數(shù)字, 轉(zhuǎn)化16進(jìn)制高位
  144.                                                         { Hchar=temchar-0x30;}      
  145.                                                 else
  146.                                                         { Hchar=temchar-87;}          //如果接收到的是字母, 轉(zhuǎn)化16進(jìn)制高位
  147.                                                 Saveflag=!Saveflag;                         //數(shù)據(jù)保存標(biāo)志取反                                                                                       
  148.                                         }
  149.                                         else
  150.                                         {
  151.                                                 if(temchar>='0'&&temchar<='9') //如果接收到的是數(shù)字, 轉(zhuǎn)化16進(jìn)制高位
  152.                                                         { Lchar=temchar-0x30;}      
  153.                                                 else
  154.                                                         { Lchar=temchar-87;}                          //如果接收到的是字母, 轉(zhuǎn)化16進(jìn)制高位
  155.                                                         
  156.                                                         Saveflag=!Saveflag;                                         //數(shù)據(jù)保存標(biāo)志取反                                                                        
  157.                                                         temchar=(Hchar<<4|Lchar);                //高低四位合并                                                        
  158.                                                         if(IAP_cnt<0x0200)
  159.                                                                 {
  160.                                                                         Buftem[IAP_cnt]=temchar;//中斷向量表臨時(shí)保存        
  161.                                                                         //SBUF=Buftem[IAP_cnt];Delay1ms();                                                                                
  162.                                                                 }
  163.                                                         else
  164.                                                                 {
  165.                                                                         IapProgram(IAP_Code1[0]+IAP_cnt-0x0200, temchar);     //寫入實(shí)際數(shù)據(jù)內(nèi)存地址        
  166.                                                                         //SBUF=IapRead(IAP_Code1[0]+IAP_cnt-0x0200);Delay1ms();        //讀出        驗(yàn)證                                                                                       
  167.                                                                 }        
  168.                                                                 IAP_cnt++;
  169.                                                                 IAP_ChecksumAcc+=(u32)temchar;
  170.                                                         
  171.                                                                 if(IAP_cnt==IAPLen&&IAP_ChecksumAcc==IAPChecksum)  //寫入長度和校驗(yàn)和都相同
  172.                                                                 {        
  173.                                                                
  174.                                                                                 for(m=0;m<0x0200;m++)
  175.                                                                                 {
  176.                                                                                         IapProgram(IAPadd+m, Buftem[m]);     //最后寫入中斷向量文件,防止斷電時(shí)無法回到基礎(chǔ)版        
  177.                                                                                         //SBUF=IapRead(IAPadd+m);        //讀出        驗(yàn)證               
  178.                                                                                         Delay1ms();                                                                                       
  179.                                                                                 }        
  180.                                                                                 // Delay1ms_cont(5000);//
  181.                                                                                 printf("\r\n_num_%bd_len=%u--",IAPnum,IAP_cnt);         Delay1ms_cont(10);
  182.                                                                                 printf("\r\n_num_%bd_ChecksumAcc=%lu--",IAPnum,IAP_ChecksumAcc);         Delay1ms_cont(10);        
  183.                                                                                 printf("\r\n***********The driver upgrade is successful!*************\r\n");        Delay1ms_cont(10);                                                                                                                                                                                                                                                                 //保存相關(guān)數(shù)據(jù)再重啟                                                        
  184.                                                                  //   Save_PortTimes(); //保存端口時(shí)間數(shù)據(jù)                                                                                                                                                        
  185.                                                                                 IAP_CONTR |= 0x60;                                       
  186.                                                                 }
  187.                                         }                                       
  188.                                 }                        
  189.                         }
  190.                         ET0=1;        
  191.                                 printf("\r\n_num_%bd_len=%u--\r\n",IAPnum,IAP_cnt);         Delay1ms_cont(10);
  192.                           printf("_num_%bd_ChecksumAcc=%lu--\r\n",IAPnum,IAP_ChecksumAcc);         Delay1ms_cont(10);
  193.                           Delay1ms_cont(1500);               
  194.         printf("{\"pc\":\"update\",\"mid\":\"%s\",\"res\":\"1\",\"softid\":\"%s\",\"num\":\"%bd\"}",AT_SIMID,&IAP_softid[0],IAPnum+1);                                                                                                                           
  195.                                 return;        
  196.         }
復(fù)制代碼


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:99525 發(fā)表于 2022-6-15 20:56 | 只看該作者
這個(gè)話題值得探討!現(xiàn)在物聯(lián)網(wǎng)時(shí)代了,沒有遠(yuǎn)程升級功能的產(chǎn)品就低人一等了!
回復(fù)

使用道具 舉報(bào)

板凳
ID:25310 發(fā)表于 2022-6-17 08:38 | 只看該作者
這個(gè)話題好,樓主帖子不錯(cuò),觀摩一下。
回復(fù)

使用道具 舉報(bào)

地板
ID:290796 發(fā)表于 2022-7-1 09:38 | 只看該作者
這個(gè)辦法好。已經(jīng)實(shí)現(xiàn)了嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:485350 發(fā)表于 2023-4-4 16:59 | 只看該作者
不需要什么IAP功能一樣可以實(shí)現(xiàn),任意FLASH芯片都可以
回復(fù)

使用道具 舉報(bào)

6#
ID:954815 發(fā)表于 2023-7-7 14:25 | 只看該作者
18680365301 發(fā)表于 2023-4-4 16:59
不需要什么IAP功能一樣可以實(shí)現(xiàn),任意FLASH芯片都可以

大佬有參考案例嗎,嘗試了好久,升級程序也寫到eeprom里面了,自己寫isp程序就是無法跳轉(zhuǎn)到用戶區(qū)程序
回復(fù)

使用道具 舉報(bào)

7#
ID:514317 發(fā)表于 2023-7-10 14:13 | 只看該作者
wangjunhuisky 發(fā)表于 2023-7-7 14:25
大佬有參考案例嗎,嘗試了好久,升級程序也寫到eeprom里面了,自己寫isp程序就是無法跳轉(zhuǎn)到用戶區(qū)程序

去看下STC的官網(wǎng)上面有介紹   可以使用官方示例進(jìn)入ISP引導(dǎo)程序    使用2種方式    1種是P3.2低電位進(jìn)入ISP   一種是內(nèi)存最后特定區(qū)域?qū)懱厥庾址M(jìn)入ISP    程序升級完后跳轉(zhuǎn)到用戶代碼區(qū)域
回復(fù)

使用道具 舉報(bào)

8#
ID:301968 發(fā)表于 2024-4-24 15:53 | 只看該作者
wangjunhuisky 發(fā)表于 2023-7-7 14:25
大佬有參考案例嗎,嘗試了好久,升級程序也寫到eeprom里面了,自己寫isp程序就是無法跳轉(zhuǎn)到用戶區(qū)程序

我的升級方法和STC官方不一樣
首先最開始本地?zé)M(jìn)去的程序是全功能的,當(dāng)需要升級時(shí),會制行串口接收BIN文件,寫入FLASH中,校驗(yàn)通過后,直接改寫0X200前面那段程序。
我用這個(gè)方法做了好多個(gè)案例,都是成功可行的,沒有問題 。
回復(fù)

使用道具 舉報(bào)

9#
ID:344848 發(fā)表于 2024-4-26 09:49 | 只看該作者
鄧文雄ABC 發(fā)表于 2024-4-24 15:53
我的升級方法和STC官方不一樣
首先最開始本地?zé)M(jìn)去的程序是全功能的,當(dāng)需要升級時(shí),會制行串口接收BIN ...

不具備普性,這對于程序較小比較實(shí)用,程序大了就不能用了。網(wǎng)絡(luò)如此發(fā)達(dá),這種方法是否考慮被攻擊的情況。
回復(fù)

使用道具 舉報(bào)

10#
ID:961114 發(fā)表于 2024-4-26 09:55 | 只看該作者
人工智能時(shí)代:
控制下載數(shù)量,利用ID號控制下載的芯片,如何自動(dòng)獲得ID號
===最好的辦法是,遠(yuǎn)程升級 = 【程序加密后傳輸 + 發(fā)布項(xiàng)目程序】
5.18.5  如何簡單的控制下載次數(shù),
             通過ID號必須對,來限制實(shí)際可以下載的MCU,控制數(shù)量
             ———【下載日志 + 發(fā)布項(xiàng)目程序】 高級應(yīng)用      


如果你的客人,說他自己提前買了芯片,讓你給他程序自己下載,
你要控制下載的芯片數(shù)量,你就先發(fā)布個(gè)只有部分功能的程序給他,
然后對方說程序好像不完整,你就請他將下載日志發(fā)你分析:
這樣你就獲得了他實(shí)際買了多少M(fèi)CU和對應(yīng)MCU的ID號

你再根據(jù)獲得的芯片ID號文件,發(fā)布項(xiàng)目程序給他遠(yuǎn)程現(xiàn)場升級,
但I(xiàn)D號不對則不升級,達(dá)到了控制升級次數(shù)的目的
回復(fù)

使用道具 舉報(bào)

11#
ID:433219 發(fā)表于 2024-4-26 17:10 | 只看該作者
是小容量,局部升級吧??   stc官方的是全擦除全部升級
回復(fù)

使用道具 舉報(bào)

12#
ID:514317 發(fā)表于 2024-4-26 17:42 | 只看該作者
MCU升級還是有很多問題的    小程序還好   大程序超過內(nèi)存一半的時(shí)候怎么處理??   還要中斷向量偏移等   如果內(nèi)置了升級功能還好   沒有升級功能編寫難度大點(diǎn)
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91在线影院 | 国产精品一区2区 | 国产欧美在线观看 | 国产欧美一区二区三区免费 | 午夜三级在线观看 | 91大片| 日本aⅴ中文字幕 | 亚洲另类春色偷拍在线观看 | 午夜影院免费体验区 | 伦理午夜电影免费观看 | 午夜性色a√在线视频观看9 | 日本不卡一区二区三区在线观看 | 久久久精品一区二区三区四季av | 欧美日韩一区二区三区在线观看 | 在线观看中文字幕一区二区 | 九九热在线视频免费观看 | 久久国产免费 | 国产精品成人一区二区三区 | 日本超碰 | 成人在线视频免费观看 | 日韩有码一区 | 国产精品久久久久久久久久久久久 | 亚洲精品久久久久久一区二区 | av网站在线看 | 美国av毛片 | 伊人一二三 | 久久久免费少妇高潮毛片 | 欧美亚洲国产日韩 | 国产日韩欧美一区二区 | av入口 | 国产视频不卡一区 | 久久伊人亚洲 | 午夜一区二区三区在线观看 | 欧美国产日韩在线 | 国产成人精品久久二区二区 | 涩涩视频在线播放 | 精品视频在线一区 | 亚洲人人舔人人 | 成人欧美一区二区三区黑人孕妇 | 日韩二区 | 麻豆91av |