磨砂 发表于 2025-7-8 18:16

国民技术N32G457REL7 IAP升级的实现

1.认识IAP
      IAP 是(In Application Programming)即在应用中编程的缩写,是用户自己的程序在运行过程中对 User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现 IAP 功能时,用户程序运行中进行对自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,只是通过某种通信方式(如 USB、UART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 的 不同区域中,当芯片上电后,首先是第一个项目代码开始运行(即我认为的bootloader),它作如下操作:
      1.MCU上电先执行Bootloader(这里的bootloader指的是最开始烧录的那个程序)
      2.在执行Bootloader的程序中检测到了更新相关的指令,则执行更新程序,若未检测到则执行原来的bootloader即可,指的是为升级前的程序。
      3.执行升级操作
      4.升级完成后,设置中断向量的偏移,并跳转到对应flash中存储的第二段程序中执行即可
      升级的APP程序可以选择放在芯片内部的flash或者芯片的sram(即运行内存),理论上来讲,当芯片的flash的内存足够大时,芯片可以存储多个APP程序供代码使用,当然sram足够大也完全可以。下图是N32G45x的bootloader与APP正常执行时的流程图:



      上图得知Flash的起始地址为0x08000000,MCU的复位中断程序所存储的位置为0x08000004,即偏移了4个字节,其余的程序即MCU bootloader的大小,这里注意,在设置MCU中断向量表偏移的时,偏移地址要大于MCU bootloader的大小,否则在进行升级时,可能会将MCU的bootloader的程序被擦除,造成升级失败。
2.MCU的启动流程

      若要实现IAP升级的功能,就需要清除MCU的启动流程是怎么样的,下面的内容是根据
下图是MCU的启动文件相关的内容:






      这里我们可以根据启动文件确认MCU的启动流程:
      首先是初始化MCU的栈和堆空间,再注册其中断向量,中断向量注册完成后,程序会进入MCU的复位中断,进行硬件复位,将其寄存器的值进行重置,复位程序执行完成后,进入系统的初始化,初始化完成后,进入main函数执行代码段。
3.IAP升级的实例讲解
      3.1了解芯片的Flash和SRAM
                N32G457REL7 Flash和Sram的相关信息在keil中可以查看,如下图所示:

该芯片的Flash大小为512K,Sram为144K,主频最高为144MHz,对于IAP只需要了解这么多即可,另外Flash的一页对应的数据大小为 2048bit数据,即256个字节的数据,在后续flash的烧写中使用的到。



      3.2软件实现
                第一个工程的main.c中编写如下程序,博主后续也会将源码分享给大家。



上图中,关闭MCU的所有中断后,JumpAddress的地址可以明显看到,该地址为APP的起始地址+4,这是什么意思呢?意思就是,在设置完成栈顶指针后,需要将程序跳转到对应的app程序内,则这里跳转的则是,更新后程序的复位中断程序中,待复位完成后,则会执行更新后main程序中的内容。
      根据上图可看出,Bootloader的程序只输出开始BOOT Run和栈顶指针的日志,具体如下图:



      第二个工程的main.c中编写如下的图所示的程序:



       在编写完升级后的mian程序后,先不要烧录。此时需要根据bootloader中提前预留的APP区域设置对应的中断向量偏移,具体配置如下图:



         打开MCU的启动文件,找到系统初始化,跳转到对应的函数内,找到SCB->VTOR寄存器的相关配置,具体操作如下图。





      找到VECT_TAB_OFFSET这个宏的相关定义,如下图所示,该宏大小的修改可以根据bootloader程序中预留的app区域进行修改,由于博主预留的区域是256K,则将偏移量设置为0x40000即可。



      配置完成后,可以对工程2进行编译,进行烧录。注意:此时该工程被烧录的到了芯片flash的那个区域内呢?答案就是预留的APP区域内,即0x8040000为工程二bin文件在flash的起始地址,结束地址则为0x8040000+bin文件的大小。

      烧录完成后,程序将会输出如下图所示的内容:



      由此图可以看出,IAP升级以及成功实现。

      这里这样演示IAP升级的实例,只是为了方便理解,IAP升级的流程,与实现方法。

      正常的IAP升级通常是要通过网络去获取云端所存储的bin文件,bin文件的获取一般是通过WiFi模组转发云端的bin文件信息进行获取,其中则需要对bin文件的数据进行分包处理,并将数据写入到对应的APP区域内,数据接收完成后,验证文件的MD5,确保bin文件被正确写入到了APP区域内,之后则是设置中断向量的偏移,和升级后程序的栈顶指针并跳转到对应的APP程序内,再执行复位中断程序后进入升级后的mian程序中执行app的代码。

4.IAP升级总结
       IAP升级的实现最主要的就是bin文件的获取和中断向量的偏移配置和app程序的跳转。

      关于个人对IAP升级的理解:本质上就是将芯片的Flash内存划分出不同的区间,有bootloader和APP的区域,其中APP的区域可以有多个,但bootloader只能有一个具体的划分如下图:      



即一个flash的起始位MCU的bootloader程序,后续的内存区域都可存放对应的APP程序,但要保证APP程序的大小不能超过flash的结束地址。

      上述内容是对flash内存区域的划分。

      IAP升级的步骤如下:

1.编写bootloader程序

2.编写升级后的程序

3.将升级后的程序放云端,通过MCU获取文件,或者通过其它途径发送给MCU

4.MCU对接收到的文件数据进行解析,并将文件数据存储到对应的APP区域内

5.校验接收到的文件数据是否正确

6.设置中断向量表的偏移和栈顶指针

7.跳转到对应的APP的复位中断函数中,待复位完成执行更新后的程序
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/wxy888888/article/details/146980219

天灵灵地灵灵 发表于 2025-7-22 10:26

IAP是需要Flash编程支持的。
页: [1]
查看完整版本: 国民技术N32G457REL7 IAP升级的实现