標題: STM32串口IAP程序源碼 [打印本頁]
作者: 周禮貴1 時間: 2018-2-5 12:47
標題: STM32串口IAP程序源碼
轉眼間天亮了......
然后就想起了一個朋友QQ的個性簽名:年輕人總是要為一些自己認為有意義的事情而廢寢忘食,通宵達旦,直至白發(fā)方休........
對了這篇文章一定會介紹的很詳細,請細嚼慢咽.......嗯,我是這樣認為的,,,,,,
上面是昨天寫的,應該說是今天寫的,,今天發(fā)現(xiàn)發(fā)現(xiàn)博客又不能復制粘貼圖片了。。!然后就睡了一覺,,麻煩。。。。是不是因為我寫的博客有太多的圖片而把我屏蔽了。能讓人一目了然的就是圖片。。。。
說一下自己是如何做的,,,
先說一下實現(xiàn)的功能
IAP程序的功能
再看自己的用戶程序--用戶程序自己也做了些設置
對了關于我為什么拷貝到Flash里面------自己用的單片機的RAM不夠用,存不了用戶程序,所以自己就定義了一個小點的數(shù)組(環(huán)形隊列),串口一邊接收,一邊往Flash里面寫,環(huán)形隊列可是幫了大忙了,,,
單片機源程序如下:
- #include "include.h"
- #include "main.h"
- int main(void)
- {
- u32 i=0;
- u8 UpdaFlage = 0;//是否有更新程序
- __IO u32 UpdaCnt=0;//程序的大小
- u16 ReadDat16=0;//讀數(shù)據(jù)間接變量
- __IO u32 addr1 = FLASH_APP1_ADDR;//APP程序地址
- __IO u32 addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
- __IO u32 UserDataAddr = FLASH_DATA_ADDR;//用戶數(shù)據(jù)地址
-
- NVIC_Configuration();
- Led_Gpio_Init();
- Timer2_Config();
- uart_init(57600); //串口初始化為115200
-
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//判斷是否有更新程序
- if(ReadDat16 == 0x55)
- {
- UpdaFlage = 1;//有更新程序
- UserDataAddr +=2;
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序數(shù)據(jù)個數(shù)高位
- UpdaCnt = (u32)ReadDat16<<16;
- UserDataAddr +=2;
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序數(shù)據(jù)個數(shù)低位
- UpdaCnt = UpdaCnt + ReadDat16;
- printf("有更新程序,數(shù)據(jù)大小=%d\r\n",UpdaCnt);
- }
- else
- {
- printf("擦除存儲用戶程序地址Flash\r\n");
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁
- addr2 +=1024;
- }
- }
- addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
- rbCreate(&pRb,ReceBuff,USART_REC_LEN);//創(chuàng)建接收環(huán)形隊列
- DelayInit();
- printf("開始進入主函數(shù)\r\n");
- while(1)
- {
- if(UpdaFlage == 1)//有更新程序
- {
- addr1 = FLASH_APP1_ADDR;//APP程序地址
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr1,512);//擦除FLASH_APP1_ADDR地址以及以上40頁
- addr1 +=1024;
- }
- printf("擦除了FLASH_APP1_ADDR....\r\n");
-
- addr1 = FLASH_APP1_ADDR;//APP程序地址
- addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
- printf("正在拷貝程序....\r\n");
- for(i=0;i<UpdaCnt/2;i++)
- {
- STMFLASH_Read(addr2,&ReadDat16,1);
- STMFLASH_Write(addr1,&ReadDat16,1);
- addr1+=2;
- addr2+=2;
- }
- printf("程序已經(jīng)拷貝....\r\n");
-
- printf("擦除存儲用戶程序地址Flash\r\n");
- addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁
- addr2 +=1024;
- }
-
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
- {
- printf("準備執(zhí)行新的APP代碼!!\r\n");
- iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
- }
- else
- {
- UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數(shù)據(jù)地址
- ReadDat16 = 0x00;//寫入標志告訴IAP程序有可更新的用戶程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- printf("拷貝的程序非FLASH應用程序,無法執(zhí)行!RstMCU\r\n");
- Reset_MCU();//復位重啟CPU
- }
- UpdaFlage = 0;
- }
- else
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
- {
- printf("準備執(zhí)行自帶的APP代碼!!\r\n");
- iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
- }
- else
- {
- if(SysTickCnt2>=1000)
- {
- SysTickCnt2 = 0;
- printf("等待接收用戶程序!!!!\r\n");
- PCout(13) = ~PCout(13);
- }
- }
- }
- /***************************************/
- /***************************************/
- /***************************************/
-
-
- if(rbCanRead(&pRb)>1)
- {
- rbRead(&pRb, &ReadDat, 2);//讀取兩個數(shù)據(jù)
- ReadDat16 = (u16)ReadDat[1]<<8;
- ReadDat16 = ReadDat16|ReadDat[0];
- STMFLASH_Write(addr2,&ReadDat16,1);
- addr2+=2;
- }
-
- if(Usart1Flage == 1)//數(shù)據(jù)接收完成
- {
- addr2 = FLASH_APP2_ADDR;//存儲數(shù)據(jù)的地址
- Usart1Flage =0;//清零
- if(Overflow==1)//如果中途溢出了
- {
- printf("程序中途溢出,準備復位重啟!!");
-
- UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數(shù)據(jù)地址
- ReadDat16 = 0x00;//寫入標志告訴IAP程序有可更新的用戶程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- Reset_MCU();//復位重啟CPU
- }
- if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
- {
- printf("準備執(zhí)行APP代碼!!\r\n");
-
- UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數(shù)據(jù)地址
- ReadDat16 = 0x55;//寫入標志告訴IAP程序有可更新的用戶程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- printf("寫入0x55標志!!\r\n");
-
- ReadDat16 = (u16)((Usart1RecCntCopy>>16)&0xffff);//存儲接收到多少數(shù)據(jù)高位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- ReadDat16 = (u16)(Usart1RecCntCopy&0xffff);//存儲接收到多少數(shù)據(jù)低位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- Usart1RecCntCopy = 0;
-
- printf("開始復位重啟!!\r\n");
-
- Reset_MCU();
- }
- else
- {
- printf("非FLASH應用程序,無法執(zhí)行!\r\n");
- Reset_MCU();
- }
-
- // printf("Cnt=%d\r\n",Usart1RecCntCopy);
- // for(i=0;i<Usart1RecCntCopy/2;i++)
- // {
- // STMFLASH_Read(addr1,&ReadDat16,1);
- // addr1+=2;//偏移2048 16=2*8.所以要乘以2.
- // if((ReadDat16&0x00ff)<=15)
- // {
- // printf("0%x ",ReadDat16&0x00ff);
- // }
- // else
- // {
- // printf("%x ",ReadDat16&0x00ff);
- // }
- //
- // if((ReadDat16>>8)<=15)
- // {
- // printf("0%x ",ReadDat16>>8);
- // }
- // else
- // {
- // printf("%x ",ReadDat16>>8);
- // }
- // }
- // addr1 = FLASH_APP1_ADDR;
- // for(i=0;i<40;i++)
- // {
- // STMFLASH_Erase(addr1,1024);//擦除FLASH_APP1_ADDR地址以及以上40頁
- // addr1 +=2048;
- // }
- // addr1 = FLASH_APP1_ADDR;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
IAP升級2.zip
(4.76 MB, 下載次數(shù): 77)
2018-2-5 12:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
電壓電流采集.zip
(4.8 MB, 下載次數(shù): 39)
2018-2-5 12:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: phang 時間: 2018-12-7 09:18
感謝分享,下來學習下
作者: quanzaibobo 時間: 2019-3-12 10:49
不錯 研究看看
作者: _tux 時間: 2019-10-24 17:09
感謝分享。。!
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |