STM32---串口实现在应用程序的固件更新(IAP)

2023-05-16

背景:

        在产品发布后,可能需要对固件进行更新或者升级,那么在影响产品正常运行的情况下,如果升级固件呢?

理论:

        下面的所有理论部分内容参考《STM32开发指南》。

什么是IAP:

        指在应用编程。即用户程序运行中作自身的更新操作。需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,(功能操作指:main函数里面的功能)而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;(第二部分代码指需要更新的程序第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行。操作如下:

        1.检查是否需要对第二部分代码进行更新;

        2.不需要更新的话,跳转到第二部分代码执行。需要更新的话执行更新操作。 

生成两个项目代码:

        这里将第一个项目代码称之为Bootloader程序,第二个项目代码称为APP程序,他们存放在STM32 FLASH的不同地址范围,一般从最低地址区开始存放第一个项目代码,紧跟其后的就是第二项目代码,当然如果内存够,可以再紧跟多个APP程序。并且,这个APP程序,可以放到FLASH中,也可以放到SRAM中运行。

两个项目代码烧录:

          第一部分代码必须JTAG 或ISP烧入;第二部分代码可以使用第一部分代码的IAP功能烧入,也可以和第一部分代码一起烧入,以后需要更新程序时再通过第一部分IAP代码更新。     

STM32正常运行流程:

        如上图所示,STM32F4的内部FLASH位于Block 0,地址起始于0x0800 0000,一般情况下,程序文件就从此地址开始写入。程序启动后(这里程序启动应该指上电。根据启动文件描述:系统上电复位后执行的是由汇编编写的启动文件,启动文件主要包含:初始化堆栈指针、初始化PC指针、初始化中断向量表、配置系统时钟、进入main函数),将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动。cortex-m4内核的“中断向量表”起始地址是0x0800 0004,当中断来临,内部硬件机制会将PC指针定位到“中断向量表”处,取出对应的中断向量执行中断服务程序。执行完复位中断后,会跳转到main函数,如果再发生中断,STM32会强制将PC指针指到中断向量表处执行中断完后再继续运行main函数。

 加入IAP之后的运行流程: 

        

        如上图所示,对应的两个项目的程序存储地址。IC复位后,还是从0x0800 0004取复位中断向量的地址并跳转到中断服务程序,再运行完后,跳转到IAP的main函数,之后执行新的程序的复位中断、main函数,并响应其他中断。执行的是上图下面灰色的部分。不同的是,在CPU得到一个中断后,PC指针将强制跳转到0x0800 0004中断向量表处,而不是新程序的中断向量表。

        那么,新的程序必须在IAP程序之后的某个偏移地址开始,新的程序的中断向量表也需要相应的移动偏移量。        

如何配置/编写IAP程序:

        APP偏移地址配置:

        在options for target选型的target页面下,IROM1的起始地址一般为0x0800 0000,大小为0x0010 0000,即从0x0800 0000开始的1024K空间是程序存储区。而若将此起始地址设置为0x0801 0000,相当于偏移量0x10000(64K字节)。那么留给APP用的flash区域就只有0x0010 0000-0x10000=0xF0000(960K字节)。

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif

        偏移量在systemInit()函数中定义了,如上图所示。一般不会在系统文件中修改code,而在flash的APP的main函数最开头处添加偏移量配置。那么:

        1.如果不使用IAP功能,是否还需要设置偏移量?

·       2. 偏移量我的理解是设置APP程序的起始地址。而如果在APP的main函数中才定义偏移量,是不是有误?

        3. 偏移量的目的只是将flash程序与IAP的程序区分开?

        如下图所示:

        烧录配置:

        MDK默认生成的文件是.hex文件,而IAP更新希望用的是.bin文件。通过MDK自带的fromeif.exe可以将.axf转换成.bin文件。

        IAP程序编写:

        在实现固件升级的功能中,需要先编写IAP程序,包含1)编写函数将串口接收到的数据Buf中的内容保存在flash中;2)写一个函数实现IAP到APP的跳转;3)编写main函数实现串口的接收,APP程序保存及跳转。

最后:在查资料过程中遇到以下疑问,下面将疑问以及理解写出,供由相同疑问的学者参考:(其实疑问在代码中可以解决)      

       1.  上面的这种方式和我们普通运行的程序是否不一样?区别?

        这里需要说STM32编程的两种方式,一种是在线编程 ICP,通过JTAG/SWD协议或者系统加载程序(bootloader)下载用户应用程序到微控制器;一种是在程序中编程IAP,通过任何一种通信接口下载程序或者应用数据到存储器中。    但是,IAP需要至少一部分程序已经使用ICP方式烧录到FLASH中(bootloader)。  同时,每种STM32芯片,虽然主存储器结构可能不同,但是都“系统存储区域”,该区域是留给ST自己用来存放芯片的bootloader,此程序在芯片出厂的时候已经固化在芯片内部。

             STM32 启动模式:B1=0,B0=1,程序从系统存储器中执行启动程序bootloader,也就是从串口下载程序到主程序中。B0=0,FLASH被选为启动区域,执行写入的应用程序。

        2.  那么,自己写的bootloader和系统存储器里本身有的是否一样?  

        不一样,自己写的bootloader 需要先通过ICP的方式下载到存储区域中,然后再通过IAP下载应用程序。

        3. 在上图3中,执行bootloader程序会跳转到IAPmain,那么IAP的地址是什么?如何实现的跳转?

       其实,IAP就是bootloader程序,他们只有一个Main 函数,执行完复位中断会直接跳转到main函数。

        4. 偏移的地址根据描述是APP程序的起始地址,还需要再在APP程序中配置中断向量表?

        通过上面IAP的main函数可以实现跳转到APP程序,但是新的程序的中断向量表需要重新配置,不然没办法响应中断。

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32---串口实现在应用程序的固件更新(IAP) 的相关文章

  • CSDN第25期编程竞赛部分题解报告

    第一题 xff1a 分层遍历二叉树 时间限制 1000ms 内存限制 256M 题目描述 给定一棵二叉树 节点定义如下 structNode span class token punctuation span Node 34 pLeft s

随机推荐

  • PX4飞控导出GPS数据拟合飞行轨迹

    前言 xff1a 想要拟合飞行轨迹 xff0c 百度了一下 xff0c 高人介绍的都是什么百度地图API xff0c 无忧地图 xff0c PYTHON 不是不好 xff0c 是尝试了一下 xff0c 注册非常麻烦 xff0c 结果没拟合出
  • ROS,GAZEBO,PX4视觉仿真

    https gitee com bingobinlw some tree master Overview Simulation Px4 command Slam map image process planning P200 AmovCar
  • PX4无人机飞控开发——第3篇:室内定点之光流一

    PX4无人机飞控开发 第3篇 xff1a 室内定点之光流一 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞
  • PX4无人机飞控开发——第4篇:室内定点之光流二

    PX4无人机飞控开发 第4篇 xff1a 室内定点之光流二 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞
  • PX4无人机飞控开发——第1篇:仿真工具介绍

    PX4无人机飞控开发 第1篇 xff1a 仿真工具介绍 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞控开
  • 5G网络实现自动驾驶车联网——第一篇:5G模块介绍实现上网功能

    5G网络实现自动驾驶车联网 第一篇 xff1a 5G模块介绍实现上网功能 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正
  • 5G网络实现自动驾驶车联网——第二篇:5G网络内网穿透

    5G网络实现自动驾驶车联网 第二篇 xff1a 5G网络内网穿透 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 xff0
  • MIT Mini Cheetah仿真 错误处理

    一 编译步骤 git clone https github com mit biomimetics Cheetah Software git cd Cheetah Software mkdir build cd build cmake sc
  • 使用PIXIWell_RF 射频模块 虚拟GPS

    使用PIXIWell RF 射频模块 虚拟GPS 文章目录 使用PIXIWell RF 射频模块 虚拟GPS 前言一 PIXIWell RF射频是什么 xff1f 二 虚拟GPS使用步骤1 硬件连接2 Ubuntu系统使用 三 查看连接情况
  • 如何去除button选中时的阴影效果

    使用box shadow可以去除button选中时四周的阴影 CSS代码如下 xff08 amp 是sass语法 xff0c 即当前button元素 xff09 xff1a button box shadow none webkit box
  • Failed to set attribute: Invalid input data or parameter 解决

    arm64 swconfig 配置vlan 失败问题 Failed to set attribute Invalid input data or parameter 解决 内核版本 xff1a linux 5 20 26 现象 xff1a
  • 使用PIXIWell_RF 射频模块 虚拟GPS windows系统

    使用PIXIWell RF 射频模块 虚拟GPS windows系统 文章目录 使用PIXIWell RF 射频模块 虚拟GPS windows系统 前言一 PIXIWell RF射频是什么 xff1f 二 虚拟GPS使用步骤1 硬件连接2
  • DJI Mavic 2 & AUTEL Evo无人机无线链路_射频_RF测试

    背景 xff1a 出于对DJI大疆无人机的好奇 xff0c 航时上的持久 xff0c 尺寸上的拔尖 xff0c 距离上的长远 xff1b 让我们来看看它的它的无线链路 射频 RF波形长什么样子的 AUTEL Evo无人机可能很多人不太了解
  • 我如何使用iPad作为学习工具

    引言 如果不懂得使用app xff0c 其实iPad就是一块屏幕而已 如果你已经有iPad xff0c 那么 xff0c 恭喜你 xff0c 这篇文章正是为了让它发挥出更大价值 如果你还没有 xff0c 那么你就又多了一个剁手的理由 上我的
  • 利用STM32实现自平衡机器人功能与方法

    将机器人整体开源 xff0c 同时总结一下机器人搭建过程中遇到的坑和未来的改进方向 在分享的文件里包含了结构设计 程序控制 电路设计以及其他模块相关资料供大家参考 第一 xff1a 机器人原理分析 首先来看成品图 xff1a 如图所示 xf
  • Ubuntu 终端(terminal) 配置文件修改后保存方法

    1 ESC退出INSERT模式进入命令模式 2 输入 w 保存 输入 wq 保存退出 输入 wq 保存并强制退出
  • Linux复习: semaphore.h信号量和生产者消费者

    点击查看demo代码 demo运行结果如图 借用网上的一段话 在线程世界里 xff0c 生产者就是生产数据的线程 xff0c 消费者就是消费数据的线程 在多线程开发当中 xff0c 如果生产者处理速度很快 xff0c 而消费者处理速度很慢
  • ubuntu使用经验

    1 查看文件夹大小 xff1a du h max depth 61 1 max depth 61 1表示查看当前目录下所有文件夹各自的大小 2 查看ubuntu版本信息 xff1a cat proc version Linux versio
  • 如何得到github上传的以前的版本

    有时候我们可能想得到github上老版本的代码 这个时候先 git clone xxxx 现在最新版本的代码 然后cd xx 到文件夹里面 然后 git log commit b56065418b63a971fcf4f8f35d058513
  • STM32---串口实现在应用程序的固件更新(IAP)

    背景 xff1a 在产品发布后 xff0c 可能需要对固件进行更新或者升级 xff0c 那么在影响产品正常运行的情况下 xff0c 如果升级固件呢 xff1f 理论 xff1a 下面的所有理论部分内容参考 STM32开发指南 什么是IAP