久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4211|回復: 3
打印 上一主題 下一主題
收起左側

STM32串口IAP程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:282316 發表于 2018-2-5 12:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
轉眼間天亮了......
然后就想起了一個朋友QQ的個性簽名:年輕人總是要為一些自己認為有意義的事情而廢寢忘食,通宵達旦,直至白發方休........
對了這篇文章一定會介紹的很詳細,請細嚼慢咽.......嗯,我是這樣認為的,,,,,,

上面是昨天寫的,應該說是今天寫的,,今天發現發現博客又不能復制粘貼圖片了!!!!然后就睡了一覺,,麻煩。。。。是不是因為我寫的博客有太多的圖片而把我屏蔽了。能讓人一目了然的就是圖片。。。。

說一下自己是如何做的,,,

先說一下實現的功能
IAP程序的功能
再看自己的用戶程序--用戶程序自己也做了些設置


對了關于我為什么拷貝到Flash里面------自己用的單片機的RAM不夠用,存不了用戶程序,所以自己就定義了一個小點的數組(環形隊列),串口一邊接收,一邊往Flash里面寫,環形隊列可是幫了大忙了,,,

單片機源程序如下:
  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;//讀數據間接變量
  9.         __IO u32 addr1 = FLASH_APP1_ADDR;//APP程序地址
  10.         __IO u32 addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
  11.         __IO u32 UserDataAddr = FLASH_DATA_ADDR;//用戶數據地址
  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);//程序數據個數高位
  24.                 UpdaCnt = (u32)ReadDat16<<16;
  25.           UserDataAddr +=2;
  26.                 STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序數據個數低位
  27.                 UpdaCnt = UpdaCnt + ReadDat16;
  28.                 printf("有更新程序,數據大小=%d\r\n",UpdaCnt);
  29.   }
  30.   else
  31.   {
  32.                 printf("擦除存儲用戶程序地址Flash\r\n");
  33.     for(i=0;i<40;i++)
  34.                 {
  35.                         STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁
  36.                         addr2 +=1024;
  37.                 }
  38.   }               
  39.         addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
  40.         rbCreate(&pRb,ReceBuff,USART_REC_LEN);//創建接收環形隊列
  41.         DelayInit();
  42.         printf("開始進入主函數\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頁
  51.                                 addr1 +=1024;
  52.       }
  53.                         printf("擦除了FLASH_APP1_ADDR....\r\n");
  54.                        
  55.                         addr1 = FLASH_APP1_ADDR;//APP程序地址
  56.             addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
  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("程序已經拷貝....\r\n");
  66.                        
  67.                         printf("擦除存儲用戶程序地址Flash\r\n");
  68.                         addr2 = FLASH_APP2_ADDR;//存儲用戶程序地址
  69.                         for(i=0;i<40;i++)
  70.                         {
  71.                                 STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40頁
  72.                                 addr2 +=1024;
  73.                         }
  74.                        
  75.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  76.                   {         
  77.                           printf("準備執行新的APP代碼!!\r\n");
  78.                           iap_load_app(FLASH_APP1_ADDR);//執行FLASH APP代碼
  79.                   }
  80.                   else
  81.                   {
  82.                                 UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數據地址
  83.                                 ReadDat16 = 0x00;//寫入標志告訴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應用程序,無法執行!RstMCU\r\n");
  92.                                 Reset_MCU();//復位重啟CPU
  93.                   }
  94.       UpdaFlage = 0;                       
  95.     }
  96.                 else
  97.                 {
  98.       if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  99.                   {         
  100.                           printf("準備執行自帶的APP代碼!!\r\n");
  101.                           iap_load_app(FLASH_APP1_ADDR);//執行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);//讀取兩個數據
  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)//數據接收完成
  128.                 {
  129.                         addr2 = FLASH_APP2_ADDR;//存儲數據的地址
  130.                         Usart1Flage =0;//清零
  131.                         if(Overflow==1)//如果中途溢出了
  132.                         {
  133.                                 printf("程序中途溢出,準備復位重啟!!");
  134.                                
  135.                                 UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數據地址
  136.                                 ReadDat16 = 0x00;//寫入標志告訴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();//復位重啟CPU
  146.                         }
  147.                         if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  148.                         {         
  149.                                 printf("準備執行APP代碼!!\r\n");
  150.                                
  151.                                 UserDataAddr = FLASH_DATA_ADDR;//存儲其余的數據地址
  152.                                 ReadDat16 = 0x55;//寫入標志告訴IAP程序有可更新的用戶程序
  153.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  154.                                 UserDataAddr+=2;
  155.                                
  156.                                 printf("寫入0x55標志!!\r\n");
  157.                                
  158.                                 ReadDat16 = (u16)((Usart1RecCntCopy>>16)&0xffff);//存儲接收到多少數據高位
  159.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  160.                                 UserDataAddr+=2;
  161.                                
  162.                                 ReadDat16 = (u16)(Usart1RecCntCopy&0xffff);//存儲接收到多少數據低位
  163.                                 STMFLASH_Write(UserDataAddr,&ReadDat16,1);
  164.                                 UserDataAddr+=2;
  165.                                 Usart1RecCntCopy = 0;
  166.                                
  167.                                 printf("開始復位重啟!!\r\n");
  168.                                
  169.                                 Reset_MCU();
  170.                         }
  171.                         else
  172.                         {
  173.                                 printf("非FLASH應用程序,無法執行!\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頁
  204. //                                 addr1 +=2048;
  205. //       }
  206. //                         addr1 = FLASH_APP1_ADDR;
  207.     }
  208.         }
  209. }


復制代碼

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



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:396960 發表于 2018-12-7 09:18 | 只看該作者
感謝分享,下來學習下
回復

使用道具 舉報

板凳
ID:489073 發表于 2019-3-12 10:49 | 只看該作者
不錯 研究看看
回復

使用道具 舉報

地板
ID:250478 發表于 2019-10-24 17:09 | 只看該作者
感謝分享!!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区 | 9久久精品| 久久久久久久久久久久91 | 久热国产精品视频 | 成年人免费网站 | 国产特级毛片aaaaaa | 国产精品久久av | www.中文字幕av | 亚洲精品电影网在线观看 | 91电影在线播放 | 亚洲激情专区 | 久久精品国产免费高清 | 欧美一区二区在线播放 | 国产视频一区在线 | 国产成人精品一区二区三区 | 久久国产美女视频 | 欧美精品一区三区 | 欧美精品久久久久 | av一级久久 | 国产一区二区三区www | 国产日韩一区二区三免费 | 久久久久久久久久爱 | av午夜激情 | av影音在线 | 一区二区三区四区在线 | 免费成人高清 | 91精品欧美久久久久久久 | 91性高湖久久久久久久久_久久99 | 97精品国产97久久久久久免费 | 久久精品一区二区视频 | 玖玖精品视频 | 亚洲三级在线 | 欧美在线亚洲 | 日韩a v在线免费观看 | 亚洲乱码国产乱码精品精98午夜 | 国产精品福利视频 | 国产农村妇女毛片精品久久麻豆 | 欧美日韩精品免费观看 | 国产精品久久久久久久久久免费 | 亚洲激情网站 | 日韩中字幕 |