標(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ī)源程序如下:
  1. #include "include.h"
  2. #include "main.h"


  3. int main(void)
  4. {
  5.         u32 i=0;
  6.         u8 UpdaFlage = 0;//是否有更新程序
  7.         __IO u32 UpdaCnt=0;//程序的大小
  8.         u16 ReadDat16=0;//讀數(shù)據(jù)間接變量
  9.         __IO u32 addr1 = FLASH_APP1_ADDR;//APP程序地址
  10.         __IO u32 addr2 = FLASH_APP2_ADDR;//存儲(chǔ)用戶程序地址
  11.         __IO u32 UserDataAddr = FLASH_DATA_ADDR;//用戶數(shù)據(jù)地址
  12.        
  13.   NVIC_Configuration();
  14.         Led_Gpio_Init();
  15.         Timer2_Config();
  16.         uart_init(57600);         //串口初始化為115200
  17.        
  18.         STMFLASH_Read(UserDataAddr,&ReadDat16,1);//判斷是否有更新程序
  19.   if(ReadDat16 == 0x55)
  20.         {
  21.     UpdaFlage = 1;//有更新程序
  22.                 UserDataAddr +=2;
  23.                 STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序數(shù)據(jù)個(gè)數(shù)高位
  24.                 UpdaCnt = (u32)ReadDat16<<16;
  25.           UserDataAddr +=2;
  26.                 STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序數(shù)據(jù)個(gè)數(shù)低位
  27.                 UpdaCnt = UpdaCnt + ReadDat16;
  28.                 printf("有更新程序,數(shù)據(jù)大小=%d\r\n",UpdaCnt);
  29.   }
  30.   else
  31.   {
  32.                 printf("擦除存儲(chǔ)用戶程序地址Flash\r\n");
  33.     for(i=0;i<40;i++)
  34.                 {
  35.                         STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁(yè)
  36.                         addr2 +=1024;
  37.                 }
  38.   }               
  39.         addr2 = FLASH_APP2_ADDR;//存儲(chǔ)用戶程序地址
  40.         rbCreate(&pRb,ReceBuff,USART_REC_LEN);//創(chuàng)建接收環(huán)形隊(duì)列
  41.         DelayInit();
  42.         printf("開(kāi)始進(jìn)入主函數(shù)\r\n");
  43.         while(1)
  44.         {
  45.                 if(UpdaFlage == 1)//有更新程序
  46.                 {
  47.                         addr1 = FLASH_APP1_ADDR;//APP程序地址
  48.                         for(i=0;i<40;i++)
  49.                         {
  50.         STMFLASH_Erase(addr1,512);//擦除FLASH_APP1_ADDR地址以及以上40頁(yè)
  51.                                 addr1 +=1024;
  52.       }
  53.                         printf("擦除了FLASH_APP1_ADDR....\r\n");
  54.                        
  55.                         addr1 = FLASH_APP1_ADDR;//APP程序地址
  56.             addr2 = FLASH_APP2_ADDR;//存儲(chǔ)用戶程序地址
  57.                         printf("正在拷貝程序....\r\n");
  58.       for(i=0;i<UpdaCnt/2;i++)
  59.                         {
  60.          STMFLASH_Read(addr2,&ReadDat16,1);
  61.                                  STMFLASH_Write(addr1,&ReadDat16,1);
  62.          addr1+=2;
  63.          addr2+=2;                       
  64.       }
  65.                         printf("程序已經(jīng)拷貝....\r\n");
  66.                        
  67.                         printf("擦除存儲(chǔ)用戶程序地址Flash\r\n");
  68.                         addr2 = FLASH_APP2_ADDR;//存儲(chǔ)用戶程序地址
  69.                         for(i=0;i<40;i++)
  70.                         {
  71.                                 STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁(yè)
  72.                                 addr2 +=1024;
  73.                         }
  74.                        
  75.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  76.                   {         
  77.                           printf("準(zhǔn)備執(zhí)行新的APP代碼!!\r\n");
  78.                           iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
  79.                   }
  80.                   else
  81.                   {
  82.                                 UserDataAddr = FLASH_DATA_ADDR;//存儲(chǔ)其余的數(shù)據(jù)地址
  83.                                 ReadDat16 = 0x00;//寫入標(biāo)志告訴IAP程序有可更新的用戶程序
  84.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  85.                                 UserDataAddr+=2;
  86.                                
  87.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  88.                                 UserDataAddr+=2;

  89.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  90.                                 UserDataAddr+=2;
  91.                           printf("拷貝的程序非FLASH應(yīng)用程序,無(wú)法執(zhí)行!RstMCU\r\n");
  92.                                 Reset_MCU();//復(fù)位重啟CPU
  93.                   }
  94.       UpdaFlage = 0;                       
  95.     }
  96.                 else
  97.                 {
  98.       if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  99.                   {         
  100.                           printf("準(zhǔn)備執(zhí)行自帶的APP代碼!!\r\n");
  101.                           iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
  102.                   }
  103.                   else
  104.                   {
  105.                                 if(SysTickCnt2>=1000)
  106.                                 {
  107.           SysTickCnt2 = 0;
  108.                                         printf("等待接收用戶程序!!!!\r\n");
  109.                                         PCout(13) = ~PCout(13);
  110.         }
  111.                   }
  112.     }
  113.           /***************************************/
  114.                 /***************************************/
  115.                 /***************************************/
  116.                
  117.                
  118.                 if(rbCanRead(&pRb)>1)
  119.                 {
  120.       rbRead(&pRb, &ReadDat, 2);//讀取兩個(gè)數(shù)據(jù)
  121.                         ReadDat16 = (u16)ReadDat[1]<<8;
  122.                         ReadDat16 = ReadDat16|ReadDat[0];
  123.                         STMFLASH_Write(addr2,&ReadDat16,1);       
  124.                         addr2+=2;
  125.     }
  126.                
  127.                 if(Usart1Flage == 1)//數(shù)據(jù)接收完成
  128.                 {
  129.                         addr2 = FLASH_APP2_ADDR;//存儲(chǔ)數(shù)據(jù)的地址
  130.                         Usart1Flage =0;//清零
  131.                         if(Overflow==1)//如果中途溢出了
  132.                         {
  133.                                 printf("程序中途溢出,準(zhǔn)備復(fù)位重啟!!");
  134.                                
  135.                                 UserDataAddr = FLASH_DATA_ADDR;//存儲(chǔ)其余的數(shù)據(jù)地址
  136.                                 ReadDat16 = 0x00;//寫入標(biāo)志告訴IAP程序有可更新的用戶程序
  137.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  138.                                 UserDataAddr+=2;
  139.                                
  140.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  141.                                 UserDataAddr+=2;

  142.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  143.                                 UserDataAddr+=2;
  144.                
  145.                                 Reset_MCU();//復(fù)位重啟CPU
  146.                         }
  147.                         if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  148.                         {         
  149.                                 printf("準(zhǔn)備執(zhí)行APP代碼!!\r\n");
  150.                                
  151.                                 UserDataAddr = FLASH_DATA_ADDR;//存儲(chǔ)其余的數(shù)據(jù)地址
  152.                                 ReadDat16 = 0x55;//寫入標(biāo)志告訴IAP程序有可更新的用戶程序
  153.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  154.                                 UserDataAddr+=2;
  155.                                
  156.                                 printf("寫入0x55標(biāo)志!!\r\n");
  157.                                
  158.                                 ReadDat16 = (u16)((Usart1RecCntCopy>>16)&0xffff);//存儲(chǔ)接收到多少數(shù)據(jù)高位
  159.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  160.                                 UserDataAddr+=2;
  161.                                
  162.                                 ReadDat16 = (u16)(Usart1RecCntCopy&0xffff);//存儲(chǔ)接收到多少數(shù)據(jù)低位
  163.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  164.                                 UserDataAddr+=2;
  165.                                 Usart1RecCntCopy = 0;
  166.                                
  167.                                 printf("開(kāi)始復(fù)位重啟!!\r\n");
  168.                                
  169.                                 Reset_MCU();
  170.                         }
  171.                         else
  172.                         {
  173.                                 printf("非FLASH應(yīng)用程序,無(wú)法執(zhí)行!\r\n");
  174.                                 Reset_MCU();
  175.                         }
  176.                        
  177. //                         printf("Cnt=%d\r\n",Usart1RecCntCopy);
  178. //                         for(i=0;i<Usart1RecCntCopy/2;i++)
  179. //                         {
  180. //         STMFLASH_Read(addr1,&ReadDat16,1);
  181. //                                 addr1+=2;//偏移2048  16=2*8.所以要乘以2.
  182. //                                 if((ReadDat16&0x00ff)<=15)
  183. //                                 {
  184. //                                         printf("0%x ",ReadDat16&0x00ff);
  185. //         }
  186. //                                 else
  187. //                                 {
  188. //           printf("%x ",ReadDat16&0x00ff);
  189. //         }
  190. //                                
  191. //                                 if((ReadDat16>>8)<=15)
  192. //                                 {
  193. //           printf("0%x ",ReadDat16>>8);
  194. //         }
  195. //                                 else
  196. //                                 {
  197. //           printf("%x ",ReadDat16>>8);
  198. //         }
  199. //       }
  200. //                         addr1 = FLASH_APP1_ADDR;
  201. //                         for(i=0;i<40;i++)
  202. //                         {
  203. //         STMFLASH_Erase(addr1,1024);//擦除FLASH_APP1_ADDR地址以及以上40頁(yè)
  204. //                                 addr1 +=2048;
  205. //       }
  206. //                         addr1 = FLASH_APP1_ADDR;
  207.     }
  208.         }
  209. }


復(fù)制代碼

所有資料51hei提供下載:
IAP升級(jí)2.zip (4.76 MB, 下載次數(shù): 77)
電壓電流采集.zip (4.8 MB, 下載次數(shù): 39)




作者: 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