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