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