標(biāo)題: STM32在線升級IAP功能-全部軟件(帶IAP下載器) [打印本頁]

作者: sadfasd234234    時間: 2017-6-21 16:19
標(biāo)題: STM32在線升級IAP功能-全部軟件(帶IAP下載器)
win7下面的IAP下載器上位機(jī)程序:



STM32單片機(jī)iap源程序如下:
  1. #include "iap.h"

  2. #define FLASH_APP1_ADDR                0x08002000          //第一個應(yīng)用程序起始地址(存放在FLASH)
  3.                                                                                         //保留的空間為IAP使用

  4. u16 iapbuf[1024] = {0}; //用于緩存數(shù)據(jù)的數(shù)組
  5. u16 receiveDataCur = 0;        //當(dāng)前iapbuffer中已經(jīng)填充的數(shù)據(jù)長度,一次填充滿了之后寫入flash并清零
  6. u32 addrCur = FLASH_APP1_ADDR;                        //當(dāng)前系統(tǒng)寫入地址,每次寫入之后地址增加2048

  7. //開始下載
  8. void iap_down_s(void)
  9. {
  10.         u16 i = 0;
  11.         u16 temp = 0;
  12.         u16 receiveCount;
  13.         printf("begin,wait data download\r\n");
  14.         receiveMode = 1;//串口進(jìn)入下載接收數(shù)據(jù)模式
  15.         while(1)
  16.         {
  17.                 //循環(huán)接收數(shù)據(jù),每次必須要發(fā)128個數(shù)據(jù)下來,如果沒有128,說明這是最后一包數(shù)據(jù)
  18.                 //接收到一包數(shù)據(jù)之后,返回一個小數(shù)點(diǎn),發(fā)送完成,系統(tǒng)編程完成之后返回一個iap_over
  19.                 if(serial_Buffer_Length & 0x8000)
  20.                 {
  21.                         receiveCount = (u8)(serial_Buffer_Length&0x00ff);
  22.                         if(receiveCount == 128)//滿足一包,填充并查看是否有了1024字節(jié),有了寫入閃存
  23.                         {
  24.                                 for(i = 0; i < receiveCount; i+=2)
  25.                                 {
  26.                                         //數(shù)據(jù)八位融合為16位
  27.                                         temp = (((u16)serial_Buffer[i+1])<<8) + ((u16)serial_Buffer[i]);
  28.                                         iapbuf[receiveDataCur] = temp;
  29.                                         receiveDataCur++;//完成之后receiveDataCur++;
  30.                                 }
  31.                                 receiveExpectCount = 0;//清除期望接收模式
  32.                                 serial_Buffer_Length = 0;//清除串口滿標(biāo)志
  33.                                 printf(".");//每次接受一次數(shù)據(jù)打一個點(diǎn)
  34.                                 //此時需要檢測receiveDataCur的值,要是放滿了,就需要寫入
  35.                                 if(receiveDataCur == 1024)
  36.                                 {
  37.                                         //寫入flash中
  38.                                         STMFLASH_Write(addrCur,iapbuf,1024);
  39.                                         //printf("\r\nwrite addr %x,length 1024\r\n",addrCur);
  40.                                         addrCur += 2048;//地址+2048
  41.                                         //寫完之后receiveDataCur要清零等待下一次傳輸
  42.                                         receiveDataCur = 0;
  43.                                 }
  44.                                 else //有可能最后一包有128個數(shù)據(jù)但是最終沒有2048個數(shù)據(jù),此時擴(kuò)展一個指令用于完成最后一個的寫入
  45.                                 {
  46.                                        
  47.                                 }
  48.                                 //還沒放滿,等待下一次數(shù)據(jù)過來
  49.                         }
  50.                         else        //不滿足一包,說明數(shù)據(jù)傳送這是最后一包,寫入閃存
  51.                         {
  52.                                 //沒有一包也要傳送到緩存中
  53.                                 for(i = 0; i < receiveCount; i+=2)
  54.                                 {
  55.                                         //數(shù)據(jù)八位融合為16位
  56.                                         temp = (((u16)serial_Buffer[i+1])<<8) + ((u16)serial_Buffer[i]);
  57.                                         iapbuf[receiveDataCur] = temp;
  58.                                         receiveDataCur++;//完成之后receiveDataCur++;
  59.                                 }
  60.                                 receiveExpectCount = 0;//清除期望接收模式
  61.                                 serial_Buffer_Length = 0;//清除串口滿標(biāo)志
  62.                                 printf(".");//每次接受一次數(shù)據(jù)打一個點(diǎn)
  63.                                 //之后就要將這數(shù)據(jù)寫入到閃存中
  64.                                 STMFLASH_Write(addrCur,iapbuf,receiveDataCur);//將最后的一些內(nèi)容字節(jié)寫進(jìn)去.
  65.                                 //printf("\r\nwrite addr %x,length %d\r\n",addrCur,receiveDataCur);
  66.                                 //寫完之后要把地址恢復(fù)到原來的位置
  67.                                 addrCur = FLASH_APP1_ADDR;
  68.                                 receiveDataCur = 0;
  69.                                 //寫完之后要退出下載循環(huán)并告訴上位機(jī),已經(jīng)下載完了
  70.                                 printf("download over\r\n");
  71.                                 //同時,也要退出下載循環(huán)模式
  72.                                 receiveMode = 0;
  73.                                 return;
  74.                         }
  75.                 }
  76.         }
  77. }
  78. //最后一包有128個數(shù)據(jù)但是最終沒有2048個數(shù)據(jù)
  79. //收到這個指令檢測receiveDataCur和addrCur的值,
  80. //完成最后的寫入
  81. void iap_over_s(void)
  82. {
  83.         //這個時候,依然在串口下載模式
  84.         if(receiveDataCur != 0)
  85.         {
  86.                 STMFLASH_Write(addrCur,iapbuf,receiveDataCur);//將最后的一些內(nèi)容字節(jié)寫進(jìn)去.
  87.                 //printf("write addr %x,length %d",addrCur,receiveDataCur);
  88.                 addrCur = FLASH_APP1_ADDR;
  89.                 receiveDataCur = 0;
  90.                 //同時,也要退出下載模式
  91.                 receiveMode = 0;
  92.         }
  93.         printf("ok\r\n");
  94. }


  95. typedef  void (*iapfun)(void);                                //定義一個函數(shù)類型的參數(shù).
  96. iapfun jump2app;

  97. //設(shè)置棧頂?shù)刂?br />
  98. //addr:棧頂?shù)刂?br />
  99. __asm void MSR_MSP(u32 addr)
  100. {
  101.     MSR MSP, r0                         //set Main Stack value
  102.     BX r14
  103. }

  104. //跳轉(zhuǎn)到應(yīng)用程序段
  105. //appxaddr:用戶代碼起始地址.
  106. void iap_load_app(u32 appxaddr)
  107. {
  108.         if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //檢查棧頂?shù)刂肥欠窈戏?0x20000000是sram的起始地址,也是程序的棧頂?shù)刂?br />
  109.         {
  110.                 printf("ok\r\n");
  111.                 Delay_Ms(10);
  112.                 jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用戶代碼區(qū)第二個字為程序開始地址(復(fù)位地址)               
  113.                 MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆棧指針(用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?
  114.                 jump2app();                                                                        //跳轉(zhuǎn)到APP.
  115.         }
  116.         else
  117.         {
  118.                 printf("program in flash is error\r\n");
  119.         }
  120. }

  121. //跳轉(zhuǎn)到app區(qū)域運(yùn)行
  122. void iap_jump_app_s(void)
  123. {
  124.         iap_load_app(FLASH_APP1_ADDR);//跳轉(zhuǎn)到app的復(fù)位向量地址
  125. }



  126. //設(shè)置app固化配置
  127. void iap_set_flag_s(void)
  128. {
  129.         Test_Write(APP_CONFIG_ADDR,APP_CONFIG_SET_VALUE);
  130.         printf("ok\r\n");
  131. }

  132. //清除app固化配置
  133. void iap_clear_flag(void)
  134. {
  135. ……………………

  136. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
STM32在線升級IAP功能-全部軟件.rar (1016.3 KB, 下載次數(shù): 759)



作者: song823    時間: 2017-8-16 08:45
下來看看 多謝樓主
作者: z_z_j    時間: 2017-8-16 13:11
感謝分享啊,正是我想要的
作者: tj00498    時間: 2017-9-11 15:08
黑幣不夠,能否私發(fā)一份
作者: billy226    時間: 2017-10-17 16:50
頂樓主,正在找這方面的資料
作者: mhqyz    時間: 2017-12-13 10:39
下載看看先啊@@@@
作者: ditozy    時間: 2017-12-14 10:00
上位機(jī)器是用什么語言寫的呀
作者: flyingwen    時間: 2017-12-23 14:59
謝謝分享

作者: jimmy.pan    時間: 2017-12-24 12:23
正在找這
作者: carlyvin    時間: 2017-12-24 18:10
能直接用么?
作者: heirun    時間: 2017-12-29 18:13
flyingwen 發(fā)表于 2017-12-23 14:59
謝謝分享

你好,能發(fā)一份給我嗎?郵箱:785805660@qq.com, 感謝!
作者: heirun    時間: 2017-12-29 18:13
song823 發(fā)表于 2017-8-16 08:45
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

你好,能發(fā)一份給我嗎?郵箱:785805660@qq.com, 感謝!
作者: heirun    時間: 2017-12-29 18:14
z_z_j 發(fā)表于 2017-8-16 13:11
感謝分享啊,正是我想要的

你好,能發(fā)一份給我嗎?郵箱:785805660@qq.com, 感謝!
作者: yjsjsy    時間: 2018-1-4 10:27
正需要這樣的東西。。!
作者: yangjf    時間: 2018-1-4 14:56
下來看看 多謝樓主
作者: ajaxchan    時間: 2018-1-24 10:20
感謝分享!
作者: albert98    時間: 2018-3-12 20:08

感謝分享!
作者: roothan    時間: 2018-3-28 14:03
app 軟件點(diǎn)擊哪個下載?
作者: roothan    時間: 2018-3-28 23:38
iap跳app程序的時候,直接跳這里了,不知道什么原因。坑袥]有人遇到這個問題。

void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

作者: lgr0718    時間: 2018-3-29 10:00
好東西,感謝分享
作者: yxjstar    時間: 2018-4-19 11:06
       學(xué)習(xí)學(xué)習(xí),多謝分享!
作者: 隨風(fēng)飄遠(yuǎn)    時間: 2018-5-4 16:07
IAP 控制組,寫入APP固化配置怎么用?  
作者: wuzetian286    時間: 2018-5-4 22:19
謝謝樓主的無私分享
作者: 隨風(fēng)飄遠(yuǎn)    時間: 2018-5-9 17:03
存儲器128K  的好像不兼容??
作者: numenjian    時間: 2018-5-10 15:39
想用在其他單片機(jī)上,先下來參考一下
作者: numenjian    時間: 2018-5-11 09:02
下不了。。。
作者: 小帖    時間: 2018-8-30 16:26
這個上位機(jī)有BUG,不能修改波特率,只能使用115200,改成別的波特率沒用。
找過這個上位機(jī)的資料,想自己修改來著,沒找到。。。
作者: ggliuy    時間: 2018-9-9 19:24
,正在網(wǎng)上找這個資料哦,下來先試試看!
作者: yangbo_1000    時間: 2018-10-15 11:39
這個厲害了,學(xué)習(xí)一下
作者: 煙花綻放    時間: 2018-10-26 09:13
很棒的東西,謝謝樓主分享

作者: w0can    時間: 2018-11-5 09:32
好東西
作者: hellowC8051    時間: 2018-11-5 13:02
謝謝分享,學(xué)習(xí)中
作者: aslkdfjhg    時間: 2018-11-6 22:34
感謝分享。。
作者: 天風(fēng)情    時間: 2018-11-23 16:28
論壇好多資料都很好,但是黑幣總是不夠用啊
作者: phang    時間: 2018-12-7 09:15
灰常感謝。。。
作者: 周超然    時間: 2019-1-29 14:21
可以用的,只是上位機(jī)的源碼,能提供下么
作者: zhiyong_05    時間: 2019-1-31 11:31
正需要,謝謝
作者: jach09    時間: 2019-3-14 15:48
好東西啊,找了好久終于找到了!
作者: stephen_xzhou    時間: 2019-3-25 10:21
多謝樓主,很有用
作者: tianli37    時間: 2019-4-21 14:20
感謝分享啊,正想要
作者: huangchao366    時間: 2019-4-21 15:48
這種升級方式確實(shí)很好
作者: HHY51    時間: 2019-4-27 16:25
感謝分享,謝謝樓主,繼續(xù)加油
作者: honey_teck    時間: 2019-5-13 16:45
我正在學(xué)習(xí)在線下載的功能,學(xué)習(xí)一下
作者: ontheroad    時間: 2019-6-11 10:10
正在學(xué)習(xí)STM32 IAP 在線升級!借鑒一下!
作者: 夢園心田    時間: 2019-6-16 21:40
這個跟hex區(qū)別
作者: chinaxu10    時間: 2019-6-22 15:23
感謝,正在找上位機(jī)軟件
作者: tao2008    時間: 2019-7-5 15:02
樓主不厚道。
作者: 376262974    時間: 2019-9-5 09:45
希望是個好東西呢
作者: flyingwen    時間: 2019-12-4 22:42
總結(jié)的不錯,感謝
作者: lkjdf    時間: 2020-1-3 15:51
感謝大佬分享
作者: qingtian2090    時間: 2020-2-27 11:36
感謝樓主分享
作者: Mancow    時間: 2020-6-9 11:07
灰常感謝分享!
作者: Mancow    時間: 2020-6-9 11:08
很好,感謝分享
作者: 88290398    時間: 2020-6-26 13:27
正是想要的
作者: 知不足而后學(xué)    時間: 2020-9-24 11:30
請問寫入APP固化配置是什么意思?
作者: irisice008    時間: 2020-9-30 11:40
非常好,下來看看 多謝樓主
作者: irisice008    時間: 2021-1-14 14:58
這個怎么使用呀,樓主要詳細(xì)解說一下才好,謝謝!
作者: 西點(diǎn)鐘靈毓秀    時間: 2022-7-6 16:14
感謝分享啊,正是我想要的,最近在研究這個
作者: yanrz    時間: 2022-8-10 16:08
看著很不錯,如果上位機(jī)都開放就太好了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1