找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3388|回复: 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, 下载次数: 73)
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表