|
|
win7下面的IAP下載器上位機程序:
STM32單片機iap源程序如下:
- #include "iap.h"
- #define FLASH_APP1_ADDR 0x08002000 //第一個應(yīng)用程序起始地址(存放在FLASH)
- //保留的空間為IAP使用
- u16 iapbuf[1024] = {0}; //用于緩存數(shù)據(jù)的數(shù)組
- u16 receiveDataCur = 0; //當(dāng)前iapbuffer中已經(jīng)填充的數(shù)據(jù)長度,一次填充滿了之后寫入flash并清零
- u32 addrCur = FLASH_APP1_ADDR; //當(dāng)前系統(tǒng)寫入地址,每次寫入之后地址增加2048
- //開始下載
- void iap_down_s(void)
- {
- u16 i = 0;
- u16 temp = 0;
- u16 receiveCount;
- printf("begin,wait data download\r\n");
- receiveMode = 1;//串口進入下載接收數(shù)據(jù)模式
- while(1)
- {
- //循環(huán)接收數(shù)據(jù),每次必須要發(fā)128個數(shù)據(jù)下來,如果沒有128,說明這是最后一包數(shù)據(jù)
- //接收到一包數(shù)據(jù)之后,返回一個小數(shù)點,發(fā)送完成,系統(tǒng)編程完成之后返回一個iap_over
- if(serial_Buffer_Length & 0x8000)
- {
- receiveCount = (u8)(serial_Buffer_Length&0x00ff);
- if(receiveCount == 128)//滿足一包,填充并查看是否有了1024字節(jié),有了寫入閃存
- {
- for(i = 0; i < receiveCount; i+=2)
- {
- //數(shù)據(jù)八位融合為16位
- temp = (((u16)serial_Buffer[i+1])<<8) + ((u16)serial_Buffer[i]);
- iapbuf[receiveDataCur] = temp;
- receiveDataCur++;//完成之后receiveDataCur++;
- }
- receiveExpectCount = 0;//清除期望接收模式
- serial_Buffer_Length = 0;//清除串口滿標(biāo)志
- printf(".");//每次接受一次數(shù)據(jù)打一個點
- //此時需要檢測receiveDataCur的值,要是放滿了,就需要寫入
- if(receiveDataCur == 1024)
- {
- //寫入flash中
- STMFLASH_Write(addrCur,iapbuf,1024);
- //printf("\r\nwrite addr %x,length 1024\r\n",addrCur);
- addrCur += 2048;//地址+2048
- //寫完之后receiveDataCur要清零等待下一次傳輸
- receiveDataCur = 0;
- }
- else //有可能最后一包有128個數(shù)據(jù)但是最終沒有2048個數(shù)據(jù),此時擴展一個指令用于完成最后一個的寫入
- {
-
- }
- //還沒放滿,等待下一次數(shù)據(jù)過來
- }
- else //不滿足一包,說明數(shù)據(jù)傳送這是最后一包,寫入閃存
- {
- //沒有一包也要傳送到緩存中
- for(i = 0; i < receiveCount; i+=2)
- {
- //數(shù)據(jù)八位融合為16位
- temp = (((u16)serial_Buffer[i+1])<<8) + ((u16)serial_Buffer[i]);
- iapbuf[receiveDataCur] = temp;
- receiveDataCur++;//完成之后receiveDataCur++;
- }
- receiveExpectCount = 0;//清除期望接收模式
- serial_Buffer_Length = 0;//清除串口滿標(biāo)志
- printf(".");//每次接受一次數(shù)據(jù)打一個點
- //之后就要將這數(shù)據(jù)寫入到閃存中
- STMFLASH_Write(addrCur,iapbuf,receiveDataCur);//將最后的一些內(nèi)容字節(jié)寫進去.
- //printf("\r\nwrite addr %x,length %d\r\n",addrCur,receiveDataCur);
- //寫完之后要把地址恢復(fù)到原來的位置
- addrCur = FLASH_APP1_ADDR;
- receiveDataCur = 0;
- //寫完之后要退出下載循環(huán)并告訴上位機,已經(jīng)下載完了
- printf("download over\r\n");
- //同時,也要退出下載循環(huán)模式
- receiveMode = 0;
- return;
- }
- }
- }
- }
- //最后一包有128個數(shù)據(jù)但是最終沒有2048個數(shù)據(jù)
- //收到這個指令檢測receiveDataCur和addrCur的值,
- //完成最后的寫入
- void iap_over_s(void)
- {
- //這個時候,依然在串口下載模式
- if(receiveDataCur != 0)
- {
- STMFLASH_Write(addrCur,iapbuf,receiveDataCur);//將最后的一些內(nèi)容字節(jié)寫進去.
- //printf("write addr %x,length %d",addrCur,receiveDataCur);
- addrCur = FLASH_APP1_ADDR;
- receiveDataCur = 0;
- //同時,也要退出下載模式
- receiveMode = 0;
- }
- printf("ok\r\n");
- }
- typedef void (*iapfun)(void); //定義一個函數(shù)類型的參數(shù).
- iapfun jump2app;
- //設(shè)置棧頂?shù)刂?br />
- //addr:棧頂?shù)刂?br />
- __asm void MSR_MSP(u32 addr)
- {
- MSR MSP, r0 //set Main Stack value
- BX r14
- }
- //跳轉(zhuǎn)到應(yīng)用程序段
- //appxaddr:用戶代碼起始地址.
- void iap_load_app(u32 appxaddr)
- {
- if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //檢查棧頂?shù)刂肥欠窈戏?0x20000000是sram的起始地址,也是程序的棧頂?shù)刂?br />
- {
- printf("ok\r\n");
- Delay_Ms(10);
- jump2app=(iapfun)*(vu32*)(appxaddr+4); //用戶代碼區(qū)第二個字為程序開始地址(復(fù)位地址)
- MSR_MSP(*(vu32*)appxaddr); //初始化APP堆棧指針(用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?
- jump2app(); //跳轉(zhuǎn)到APP.
- }
- else
- {
- printf("program in flash is error\r\n");
- }
- }
- //跳轉(zhuǎn)到app區(qū)域運行
- void iap_jump_app_s(void)
- {
- iap_load_app(FLASH_APP1_ADDR);//跳轉(zhuǎn)到app的復(fù)位向量地址
- }
- //設(shè)置app固化配置
- void iap_set_flag_s(void)
- {
- Test_Write(APP_CONFIG_ADDR,APP_CONFIG_SET_VALUE);
- printf("ok\r\n");
- }
- //清除app固化配置
- void iap_clear_flag(void)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
STM32在線升級IAP功能-全部軟件.rar
(1016.3 KB, 下載次數(shù): 759)
2017-6-21 17:41 上傳
點擊文件名下載附件
IAP for STM32
|
評分
-
查看全部評分
|