轉眼間天亮了...... 然后就想起了一個朋友QQ的個性簽名:年輕人總是要為一些自己認為有意義的事情而廢寢忘食,通宵達旦,直至白發方休........ 對了這篇文章一定會介紹的很詳細,請細嚼慢咽.......嗯,我是這樣認為的,,,,,,
上面是昨天寫的,應該說是今天寫的,,今天發現發現博客又不能復制粘貼圖片了!!!!然后就睡了一覺,,麻煩。。。。是不是因為我寫的博客有太多的圖片而把我屏蔽了。能讓人一目了然的就是圖片。。。。
說一下自己是如何做的,,,
先說一下實現的功能 IAP程序的功能 再看自己的用戶程序--用戶程序自己也做了些設置
對了關于我為什么拷貝到Flash里面------自己用的單片機的RAM不夠用,存不了用戶程序,所以自己就定義了一個小點的數組(環形隊列),串口一邊接收,一邊往Flash里面寫,環形隊列可是幫了大忙了,,,
單片機源程序如下:
- #include "include.h"
- #include "main.h"
- int main(void)
- {
- u32 i=0;
- u8 UpdaFlage = 0;//是否有更新程序
- __IO u32 UpdaCnt=0;//程序的大小
- u16 ReadDat16=0;//讀數據間接變量
- __IO u32 addr1 = FLASH_APP1_ADDR;//APP程序地址
- __IO u32 addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
- __IO u32 UserDataAddr = FLASH_DATA_ADDR;//用戶數據地址
-
- 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);//程序數據個數高位
- UpdaCnt = (u32)ReadDat16<<16;
- UserDataAddr +=2;
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序數據個數低位
- UpdaCnt = UpdaCnt + ReadDat16;
- printf("有更新程序,數據大小=%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);//創建接收環形隊列
- DelayInit();
- printf("開始進入主函數\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("程序已經拷貝....\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("準備執行新的APP代碼!!\r\n");
- iap_load_app(FLASH_APP1_ADDR);//執行FLASH APP代碼
- }
- else
- {
- UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數據地址
- 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應用程序,無法執行!RstMCU\r\n");
- Reset_MCU();//復位重啟CPU
- }
- UpdaFlage = 0;
- }
- else
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
- {
- printf("準備執行自帶的APP代碼!!\r\n");
- iap_load_app(FLASH_APP1_ADDR);//執行FLASH APP代碼
- }
- else
- {
- if(SysTickCnt2>=1000)
- {
- SysTickCnt2 = 0;
- printf("等待接收用戶程序!!!!\r\n");
- PCout(13) = ~PCout(13);
- }
- }
- }
- /***************************************/
- /***************************************/
- /***************************************/
-
-
- if(rbCanRead(&pRb)>1)
- {
- rbRead(&pRb, &ReadDat, 2);//讀取兩個數據
- ReadDat16 = (u16)ReadDat[1]<<8;
- ReadDat16 = ReadDat16|ReadDat[0];
- STMFLASH_Write(addr2,&ReadDat16,1);
- addr2+=2;
- }
-
- if(Usart1Flage == 1)//數據接收完成
- {
- addr2 = FLASH_APP2_ADDR;//存儲數據的地址
- Usart1Flage =0;//清零
- if(Overflow==1)//如果中途溢出了
- {
- printf("程序中途溢出,準備復位重啟!!");
-
- UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數據地址
- 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("準備執行APP代碼!!\r\n");
-
- UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數據地址
- ReadDat16 = 0x55;//寫入標志告訴IAP程序有可更新的用戶程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- printf("寫入0x55標志!!\r\n");
-
- ReadDat16 = (u16)((Usart1RecCntCopy>>16)&0xffff);//存儲接收到多少數據高位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- ReadDat16 = (u16)(Usart1RecCntCopy&0xffff);//存儲接收到多少數據低位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- Usart1RecCntCopy = 0;
-
- printf("開始復位重啟!!\r\n");
-
- Reset_MCU();
- }
- else
- {
- printf("非FLASH應用程序,無法執行!\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, 下載次數: 77)
2018-2-5 12:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
電壓電流采集.zip
(4.8 MB, 下載次數: 39)
2018-2-5 12:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|