i STM32 IAP(在线更新程序)的使用关键点-嵌入式MCU技术-电子人社区 -

电子人社区

 找回密码
 立即注册
今日 : 0|主题 : 4177|排名 : 314 
打印 上一主题 下一主题

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

发表于 2019-1-9 16:03:44 | 77830 只看该作者 回帖奖励 |倒序浏览 |阅读模式

[复制链接]
发表于 2019-1-9 16:03:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电子人社区网讯:   所谓IAP其实就相当于一个小小的bootloader 用来更新程序的
  本文引用地址: http://www.21ic.com/app/mcu/201812/783703.htm
  很多产品基本都是程序做好后就直接在产线烧录一次就OK了,但是,但是BUG有时候是无可避免的,经常有产品装好后又要重新拆外壳 取下板子重新上烧录架烧的惨痛经历,所以,这种情况下IAP就很有必要了,只要一个对外的接口就能在线更新了,常用的是USB口,当然要是一定要用串口的话也是可以的 硬件上麻烦一些而已,下面就是例程
  typedefvoid(*pFunction)(void);
  pFunctionJump_To_Application;
  unsignedlongJumpAddress;
  if(!Check_Whether_Enter_UpdateMode())//这个函数是自定义的通过判断按键决定进入bootloader还是APP应用
  {
  if(((*(__IOuint32_t*)FLASH_START_ADDR_NORMAL_FIRMWARE)&0x2FFE0000)==0x20000000)//检查栈顶指针
  {
  /*Jumptouserapplication*/
  JumpAddress=*(__IOuint32_t*)(FLASH_START_ADDR_NORMAL_FIRMWARE+4);//取出APP的RESET地址
  Jump_To_Application=(pFunction)JumpAddress;//将地址传给函数指针
  /*Initializeuserapplication'sStackPointer*/
  __set_MSP(*(__IOuint32_t*)FLASH_START_ADDR_NORMAL_FIRMWARE);//设置栈顶指针
  Jump_To_Application();//跳入APP
  }
  }
  FLASH_START_ADDR_NORMAL_FIRMWARE这个地址是APP起始地址
  这就是IAP的基本思路如果不进入APP的话就进入IAP进行代码更新IAP里在添加USB的处理到了这里IAP的程序就基本完成了(不过USB协议的相关处理还是有点麻烦有点难度的,
  要理解了才好动手,不然容易懵,我本人就是经常懵了...)
  其实类似的关于IAP博文已经很多人写了,这里之所以又写是因为有一点比较容易被忽略的,自己就碰到了,可能是我比较粗心人家其实已经提醒而我没注意到,亦或是我读的文章
  不够多,又啰嗦了...唉,进入正题
  上面例程的APP地址我设的是0x08003000;那APP工程的程序基地址也要设为0x08003000FLASHSIZE也要相应的减去0x3000

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


  • STM32单片机中文官网
  • STM32单片机官方开发工具
  • STM32单片机参考设计

来源:网络转载

 

                                                   转载请注明:电子人社区

0条回复
跳转到指定楼层

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|电子人物联网  

Copyright 2013 最新最精彩-社区论坛 版权所有 All Rights Reserved.

QQ|电子人物联网  

GMT+8, 2024-5-2 05:07 , Processed in 0.101434 second(s), 33 queries.

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