標(biāo)題: STM32串口IAP程序源碼 [打印本頁(yè)]
作者: 周禮貴1 時(shí)間: 2018-2-5 12:47
標(biāo)題: STM32串口IAP程序源碼
轉(zhuǎn)眼間天亮了......
然后就想起了一個(gè)朋友QQ的個(gè)性簽名:年輕人總是要為一些自己認(rèn)為有意義的事情而廢寢忘食,通宵達(dá)旦,直至白發(fā)方休........
對(duì)了這篇文章一定會(huì)介紹的很詳細(xì),請(qǐng)細(xì)嚼慢咽.......嗯,我是這樣認(rèn)為的,,,,,,
上面是昨天寫的,應(yīng)該說(shuō)是今天寫的,,今天發(fā)現(xiàn)發(fā)現(xiàn)博客又不能復(fù)制粘貼圖片了。。。∪缓缶退艘挥X(jué),,麻煩。。。。是不是因?yàn)槲覍懙牟┛陀刑嗟膱D片而把我屏蔽了。能讓人一目了然的就是圖片。。。。
說(shuō)一下自己是如何做的,,,
先說(shuō)一下實(shí)現(xiàn)的功能
IAP程序的功能
再看自己的用戶程序--用戶程序自己也做了些設(shè)置
對(duì)了關(guān)于我為什么拷貝到Flash里面------自己用的單片機(jī)的RAM不夠用,存不了用戶程序,所以自己就定義了一個(gè)小點(diǎn)的數(shù)組(環(huán)形隊(duì)列),串口一邊接收,一邊往Flash里面寫,環(huán)形隊(duì)列可是幫了大忙了,,,
單片機(jī)源程序如下:
- #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;//存儲(chǔ)用戶程序地址
- __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ù)個(gè)數(shù)高位
- UpdaCnt = (u32)ReadDat16<<16;
- UserDataAddr +=2;
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序數(shù)據(jù)個(gè)數(shù)低位
- UpdaCnt = UpdaCnt + ReadDat16;
- printf("有更新程序,數(shù)據(jù)大小=%d\r\n",UpdaCnt);
- }
- else
- {
- printf("擦除存儲(chǔ)用戶程序地址Flash\r\n");
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁(yè)
- addr2 +=1024;
- }
- }
- addr2 = FLASH_APP2_ADDR;//存儲(chǔ)用戶程序地址
- rbCreate(&pRb,ReceBuff,USART_REC_LEN);//創(chuàng)建接收環(huán)形隊(duì)列
- DelayInit();
- printf("開(kāi)始進(jìn)入主函數(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頁(yè)
- addr1 +=1024;
- }
- printf("擦除了FLASH_APP1_ADDR....\r\n");
-
- addr1 = FLASH_APP1_ADDR;//APP程序地址
- addr2 = FLASH_APP2_ADDR;//存儲(chǔ)用戶程序地址
- 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("擦除存儲(chǔ)用戶程序地址Flash\r\n");
- addr2 = FLASH_APP2_ADDR;//存儲(chǔ)用戶程序地址
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁(yè)
- addr2 +=1024;
- }
-
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
- {
- printf("準(zhǔn)備執(zhí)行新的APP代碼!!\r\n");
- iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
- }
- else
- {
- UserDataAddr = FLASH_DATA_ADDR;//存儲(chǔ)其余的數(shù)據(jù)地址
- ReadDat16 = 0x00;//寫入標(biāo)志告訴IAP程序有可更新的用戶程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- printf("拷貝的程序非FLASH應(yīng)用程序,無(wú)法執(zhí)行!RstMCU\r\n");
- Reset_MCU();//復(fù)位重啟CPU
- }
- UpdaFlage = 0;
- }
- else
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
- {
- printf("準(zhǔn)備執(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);//讀取兩個(gè)數(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;//存儲(chǔ)數(shù)據(jù)的地址
- Usart1Flage =0;//清零
- if(Overflow==1)//如果中途溢出了
- {
- printf("程序中途溢出,準(zhǔn)備復(fù)位重啟!!");
-
- UserDataAddr = FLASH_DATA_ADDR;//存儲(chǔ)其余的數(shù)據(jù)地址
- ReadDat16 = 0x00;//寫入標(biāo)志告訴IAP程序有可更新的用戶程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- Reset_MCU();//復(fù)位重啟CPU
- }
- if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
- {
- printf("準(zhǔn)備執(zhí)行APP代碼!!\r\n");
-
- UserDataAddr = FLASH_DATA_ADDR;//存儲(chǔ)其余的數(shù)據(jù)地址
- ReadDat16 = 0x55;//寫入標(biāo)志告訴IAP程序有可更新的用戶程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- printf("寫入0x55標(biāo)志!!\r\n");
-
- ReadDat16 = (u16)((Usart1RecCntCopy>>16)&0xffff);//存儲(chǔ)接收到多少數(shù)據(jù)高位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- ReadDat16 = (u16)(Usart1RecCntCopy&0xffff);//存儲(chǔ)接收到多少數(shù)據(jù)低位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- Usart1RecCntCopy = 0;
-
- printf("開(kāi)始復(fù)位重啟!!\r\n");
-
- Reset_MCU();
- }
- else
- {
- printf("非FLASH應(yīng)用程序,無(wú)法執(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頁(yè)
- // addr1 +=2048;
- // }
- // addr1 = FLASH_APP1_ADDR;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
IAP升級(jí)2.zip
(4.76 MB, 下載次數(shù): 77)
2018-2-5 12:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
電壓電流采集.zip
(4.8 MB, 下載次數(shù): 39)
2018-2-5 12:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: phang 時(shí)間: 2018-12-7 09:18
感謝分享,下來(lái)學(xué)習(xí)下
作者: quanzaibobo 時(shí)間: 2019-3-12 10:49
不錯(cuò) 研究看看
作者: _tux 時(shí)間: 2019-10-24 17:09
感謝分享!。!
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |