×
单片机 > 单片机程序设计 > 详情

STM32 IAP(在线更新程序)的使用关键点

发布时间:2020-06-03 发布时间:
|

所谓IAP其实就相当于一个小小的bootloader 用来更新程序的

很多产品基本都是程序做好后就直接在产线烧录一次就OK了,但是,但是BUG有时候是无可避免的,经常有产品装好后又要重新拆外壳 取下板子重新上烧录架烧的惨痛经历,所以,这种情况下IAP就很有必要了,只要一个对外的接口就能在线更新了,常用的是USB口,当然要是一定要用串口的话也是可以的 硬件上麻烦一些而已,下面就是例程


  1. typedef  void (*pFunction)(void);  

  2. pFunction Jump_To_Application;  

  3. unsigned long  JumpAddress;  

  4.   

  5. if(!Check_Whether_Enter_UpdateMode())//这个函数是自定义的 通过判断按键决定进入bootloader 还是APP应用  

  6. {  

  7.     if (((*(__IO uint32_t*)FLASH_START_ADDR_NORMAL_FIRMWARE) & 0x2FFE0000 ) == 0x20000000)//检查栈顶指针  

  8.     {   

  9.         /* Jump to user application */  

  10.         JumpAddress = *(__IO uint32_t*) (FLASH_START_ADDR_NORMAL_FIRMWARE + 4);//取出APP的RESET地址   

  11.         Jump_To_Application = (pFunction) JumpAddress;//将地址传给函数指针  

  12.         /* Initialize user application's Stack Pointer */  

  13.         __set_MSP(*(__IO uint32_t*) FLASH_START_ADDR_NORMAL_FIRMWARE);//设置栈顶指针  

  14.         Jump_To_Application();//跳入APP  

  15.     }  

  16. }  


  1. FLASH_START_ADDR_NORMAL_FIRMWARE这个地址是APP起始地址  

  2. 这就是IAP的基本思路 如果不进入APP的话就进入IAP进行代码更新 IAP里在添加USB的处理 到了这里IAP的程序就基本完成了(不过USB协议的相关处理还是有点麻烦有点难度的,  

  3. 要理解了才好动手,不然容易懵,我本人就是经常懵了...)  

  4. 其实类似的关于IAP博文已经很多人写了,这里之所以又写是因为有一点比较容易被忽略的,自己就碰到了,可能是我比较粗心人家其实已经提醒而我没注意到,亦或是我读的文章  

  5. 不够多,又啰嗦了...唉,进入正题  

  6. 上面例程的APP地址我设的是0x08003000; 那APP工程的程序基地址也要设为0x08003000 FLASH SIZE 也要相应的减去0x3000  


到了这里还有一点要注意的,我们都知道一般情况STM32复位后从0x08000000开始取指,中断向量从0x08000004开始第一个为RESET向量 那APP工程的中断向量就不能如此了 APP的向量地址要从0x08003000开始,这点比较容易被忽略掉,不过也可能是我自己比较傻的问题,说不定大部分人都懂了就我还蒙在鼓里  如下图




    『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

    热门文章 更多
    51单片机的线阵CCD实时检测系统的开发