STM32在线升级IAP功能全套源码

admin 2017-8-10 9224

 Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片机复位离线的情况下编程,需要人工的干预,而iap则是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。在工程应用中经常会出现我们的产品被安装在某个特定的机械结构中,更新程序的时候拆机很不方便,使用iap技术能很好地降低工作量.

  实现iap有两个很重要的前提,首先,单片机程序能对自身的内部flash进行擦写,第二,单片机要有能够和外部进行通讯的方式,无论是网络还是别的方式,只要能传输数据就行

  通常实现 IAP 功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如 USB、 USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作: 
1)检查是否需要对第二部分代码进行更新 
2)如果不需要更新则转到 4) 
3)执行更新操作 
4)跳转到第二部分代码执行 
    第一部分代码必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码可以调用第一部分的功能

也就是说,将iap和app做成两个程序,这是其中的一种策略,还有一种策略,可以把iap程序和app程序做在一个代码中,但是那样耦合性有点高,我们先进行第一种尝试.

要做iap首先我们要知道stm32的启动流程,流程如下

单片机从0x80000000位置启动,并将该地址当成系统栈顶地址
运行到中断向量表中,默认的中断向量表为0x80000004,该位置存放复位中断
跳转到复位中断处理函数当中,进行系统初始化,然后运行main函数


  当我们准备用iap的时候,单片机内部是有着两套程序的,这个时候我们就需要在iap中

  和app中分别放置两套中断向量表,当iap代码中将app烧写到flash中之后,跳转到app的中断向量表中,程序就可以正常执行了,当然需要修改某些系统设置,使得在app和iap阶段单片机可见的中断向量表只能有一套(具体请查看stm32芯片的启动代码)

  而当需要从app跳转到iap的时候,只需要将app的中断向量表修改成iap的中断向量表,同时主动跳转到iap的reset中断处理程序,这样就能再次开始iap流程.

  这样,在系统中就需要我们确定几个东西,第一个是iap程序的中断向量表,为0x80000004位置(80000000存放的是msp的初始值),第二个是app程序的中断向量表,该位置需要根据iap程序的长度计算,比如iap占用了64K,那么512K的芯片而言,就还有448K的空间存放app程序,448K的最开始放置中断向量表,位置就应该是0x08000000+0x10004的位置.

Cortex-m3的中断向量并不是在程序中固定的,我们可以通过修改某些寄存器来修改对于当前应用的中断向量表位置.

决定中断向量表的寄存器是如下这个

技术分享

  通过修改这个寄存器的值,我们可以控制对于当前单片机应用来说可见的向量表的位置(也就说说逻辑上我们有两个向量表,但是同一时间只有一个运行)

  以上是内核阶段的操作,在此之外我们还需要对stm32的flash进行编程,那么就涉及到删除的编程和擦除操作,这需要参考stm32的闪存编程手册

  首先,当单片机复位之后,闪存式被锁住的,需要主动去解锁,向FLASH_KEYR写入两个指定的连续键值用于解锁

  然后将需要写入的闪存擦除,擦除之后在进行写入,写入完成,再次上锁

对应的代码如下

隐藏内容,回复可看

最新回复 [24]
  • up93lc 2017-12-13
    0 2
    回复下看卡
  • tiger_man 2018-5-5
    0 3
    感谢
  • cnc2020 2018-5-26
    0 4
    very  good,
  • pennnnnn 2018-7-20
    0 5
    nice!
  • ZHAGN 2018-7-28
    0 6
    thanks
  • maidilong 2018-8-7
    0 7
    学习了
  • 13029881200 2018-8-13
    0 8
    感谢
  • jansf 2018-12-25
    0 9
    先回复看内容,再评价
  • power3000 2019-4-27
    0 10
    感谢
  • huningning 2019-7-31
    0 11
    试下能不能看
  • Chanhuni 2019-9-6
    0 12
    学习一下
  • himaxmis 2019-10-5
    0 13
    学习了,感谢
  • hnhebing 2019-12-12
    0 14
    学习
  • MRxing 2019-12-20
    0 15
    非常感谢
  • MRxing 2019-12-20
    0 16
    提取码是多少呢
  • sadate 2020-7-10
    0 17
    提取码是多少呢 
  • yue8713 2020-10-22
    0 18
    谢谢分享!!!
  • eemcu 2020-11-17
    0 19
    感谢
  • mmmp 2020-11-26
    0 20
    感谢分享
  • lucky_ant 2021-1-7
    0 21
    感谢分享
  • fyx986 2021-7-30
    0 22
    感谢分享
  • user_create 2022-11-15
    0 23
    学习一下
    感谢
  • forme001 2023-1-18
    0 24
    感谢大大无私分享
返回