STM32F4_串口 IAP

news2024/10/7 16:18:04

目录

前言

1. IAP简介

2. APP程序起始地址设置方法

3. 中断向量表的偏移量设置

4. 如何在MDK中生成 .BIN 文件

5. APP程序生成步骤


前言

        IAP,即在应用编程

1. IAP简介

        IAP(In Application Programming)即 在应用编程IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现 IAP 功能时,即用户程序运行中做自身的更新操作,需要在设计固件程序时编写两个项目代码第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作

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

        2. 如果不需要更新则转到 4.

        3. 执行更新操作

        4. 跳转到第二部分代码执行

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

我们常见的 MCU/CPU 代码烧录方式主要有以下三种:

一、ICP(In Circuit Programing)

        ICP 指的是在电路编程,可通过 CPU的Debug Access Port 烧录代码,比如 ARM Cortex的 Debug Interface主要是SWD(Serial Wire Debug)或JTAG(Joint Test Action Group);

二、ISP(In System Programing)

        ISP 指的是在系统编程,可以借助MCU厂商预置的 BootLoader 实现通过板载UART或USB接口烧录代码,比如STM32存储映射Code分区中的System Memory可以预置厂商的BootLoader,让MCU支持通过UART下载(不限于UART,具体由厂商预置BootLoader实现而定)

        简单来说就是,我们已经学习过STM32的存储器了,STM32在出厂时就已经在存储区间内部预置了一段BootLoader(也就是ISP程序),这段程序是无法更改的,也就是我们的系统存储区,一般来说,厂家提供 BootLoder 一般支持UART程序,也就是说厂家出厂时就已经帮我们把UART烧录的程序写入系统存储区了,其目的就是为了帮我们用户实现可以通过串口烧录的目的,这一部分不需要我们用户手动来实现,通过系统存储区中的UART串口协议,可以让我们直接通过串口将代码烧录到 Main Flash Memory 中

三、IAP(In Application Programing)

        IAP 指的是在应用编程,由开发板实现 BootLoader 功能,比如说STM32 存储映射Code分区中的Flash本应该是存储用户应用程序的区间(也就是开发板上电后从 Flash 区中执行用户代码),开发者是可以将自己实现的BootLoader存放到 Falsh 区间(开发板一旦上电是优先执行这个区域的程序的),执行这个BootLoader代码程序可以为用户应用程序的下载、校验、增量/补丁更新、升级、恢复等提供支持,如果用户代码提供了网络访问功能,IAP 还能通过无线网络下载更新代码,实现 OTA 空中升级功能。

四、IAP 和 ISP 的区别

  1.         ISP程序一般是芯片厂家提供的,IAP一般是用户自己编写的
  2.         ISP一般支持的烧录方式有限,只有串口等。IAP就比较灵活,可以灵活的使用各种通信协议烧录
  3.         ISP一般需要芯片进行一些硬件上的操作才行,IAP全部工作由程序来完成
  4.         ISP一般只需要按格式将升级文件通过串口发送就可以。IAP相对来说是比较麻烦的,如果是OTA的话还需要编写后台

:系统存储器的BootLoader程序会通过串口1接收应用程序。

STM32启动模式选择:

BOOT1设置为X,BOOT0设置为0:表示主闪存存储器被选为启动区域
BOOT1设置为0,BOOT0设置为1:表示系统存储器被选为启动区域
BOOT1设置为1,BOOT0设置为1:表示内置SRAM被选为启动区域

        通过上述的介绍,我们将第一个项目代码称之为BootLoader程序第二个项目代码称之为APP程序,它们存放在 STM32F4 FLASH 的不同地址范围,一般从最低地址区开始存放BootLoader,紧跟其后的就是APP程序(这里注意:如果FLASH 容量足够,是可以设计很多的APP程序的)。所以本节我们就是要实现两个程序:BootLoader 和 APP

        STM32F4 的APP程序不仅可以放到FLASH里面运行,也可以放到SRAM里面运行;

STM32F4正常运行流程图:

        STM32F4 的内部闪存(FLASH)地址起始于0x08000000,一般情况下,程序文件从此地址开始写入。STM32F4 是基于Cortex - M4 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从 “中断向量表” 取出复位中断向量执行复位中断程序完成启动,根据上图可知,中断向量表的起始地址是0x08000004,当中断来临,STM32的内部硬件机制会自动将PC指针定位到 “中断向量表” 处,并且根据中断源取出对应的中断向量执行中断服务函数。

        在上图中,STM32F4 在复位后,先从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务函数,如图标记①所示;

        在复位中断服务程序执行完以后,会跳转到我们 main 函数,如图标号②所示;

        我们写main函数时一般都是在while循环中执行主要的程序,所以一般都是一个死循环,在main函数执行过程中,如果收到中断请求(我们已经学习过中断,中断优先级是非常高的,一旦有中断来临,将优先执行中断服务函数),此时STM32 强制将 PC 指针指回中断向量表处,如图标号③所示;

        然后根据中断源进入相应的中断服务函数,如图标号④所示;

        在执行完中断服务函数以后,程序再次返回 main 函数执行,如图标号⑤所示;

加入IAP程序之后,STM32程序运行流程图:

        如上图,STM32F4复位后,还是从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到 IAP 的 main 函数,如图标号①所示;

        在执行完 IAP 以后(也就是将新的 APP  代码写入STM32F4 的 FALSH,也就是上图中灰底的部分,新程序的复位中断向量起始地址为0x08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数,如图标号 ②和③ 所示;

        main函数为一个死循环,并且STM32F4 在不同位置上,共有两个中断向量表。

        在 main 函数执行过程中,如果 CPU 得到一个中断请求,PC 指针仍强制跳转到地址0x08000004中断向量表处,而不是新程序的中断向量表,如图标号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;再执行完中断服务程序后,程序返回 main 函数继续运行,如图标号⑥所示。

通过对以上两个过程的学习,我们知道IAP 程序必须满足两个要求:

  1.         新程序必须在IAP程序之后的某个偏移量为x 的地址开始;
  2.         必须将新程序的中断向量表相应的移动,移动的偏移量为x;

2. APP程序起始地址设置方法

        如上图所示,根据之前的学习,我们知道IROM是FLASH存储区域,IRAM是SRAM存储区域

        默认条件下,图中IROM1的起始地址(Start)一般为0x08000000,大小Size为0x100000,意思就是从0x08000000开始的1024K空间为我们的FLASH存储空间,1024K也就是STM32F4的FLASH存储区域的大小;

        在上图中,我们设置的起始地址Start是0x08010000,也就是偏移量为0x10000(64K字节),所以留给APP用的FLASH空间就只有0x100000-0x10000=0xF0000(960K 字节)大小了(在起始地址之后,我们先要存储中断向量表,所以需要先预留出一定的空间,之后紧接着就是APP的存储空间)。设置好 Start 和 Size,就完成 APP 程序的起始地址设置。

注意:这里的64K字节大小需要我们根据 BootLoader 程序大小进行选择。

SRAM APP起始地址设置:

        这里我们将IROM1 的起始地址Start设置为:0x20001000,大小为0x19000(100K字节),也就是从起始地址0x20000000偏移0x1000开始,存放APP代码。整个STM32F4的SRAM大小为128K字节,所以IRAM1(SRAM)的起始地址变为0x2001A000,大小只有0x6000(24K 字节)。

        这样一来,整个STM32F4的SRAM分配情况为:最开始的4K给BootLoader程序使用,随后的100K存放APP程序,最后24K,用作 APP 程序的内存。

3. 中断向量表的偏移量设置

        在系统启动的时候,会首先调用 SystemInit 函数初始化时钟系统,同时SystemInit 还完成了中断向量表的设置;

#ifdef VECT_TAB_SRAM
    SCB->VTOR=SRAM_BASE|VECT_TAB_OFFSET;
                        //内部 SRAM 中的矢量表重定位
#else
    SCB->VTOR=FLASH_BASE|VECT_TAB_OFFSET;
                        //内部 SRAM 中的矢量表重定位
#endif

        VTOR 寄存器存放的是中断向量表的起始地址。默认情况下VECT_TAB_SRAM是没有定义的,所以执行 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET

        对于FLASH APP,我们设置为FLASH_BASE+偏移量 0x10000,我们可以在SystemInit 函数中修改SCB->VTOR寄存器的值。也可以在main函数最开头添加代码实现起始位置的重设;

SCB->VTOR = FLASH_BASE | 0x10000; 

        对于SRAM APP,同样的方法,我们也可以在SRAM APP的 main 函数开始处设置;

SCB->VTOR = SRAM_BASE | 0x1000;

4. 如何在MDK中生成 .BIN 文件

        通过以上两个步骤的设置,我们就可以生成APP程序了;不过MDK默认生成的文件是 .hex 文件,并不方便我们用作IAP更新,我们更希望生成的文件是 .bin文件,这样方便我们进行 IAP升级,我们需要通过MDK自带的格式转换工具fromeIf.exe,来实现.axf文件到.bin文件的转换

fromeIf.exe 转换工具的语法格式如下:

        fromeIf[options] input file

fromeIf工具的选项如下:

5. APP程序生成步骤

1. 设置APP程序的起始地址和存储空间大小

        对于在FLASH里面运行的APP程序,我们只需要设置APP程序的起始地址和存储空间大小即可。但是对于在SRAM里面运行的APP程序,我们还需要设置SRAM的起始地址和大小。无论哪种APP程序,都需要确保APP程序的大小和所占SRAM大小不超过我们设置的范围

2. 设置中断向量表偏移量

        该步骤只需要设置SCB->VTOR寄存器的值即可。

3. 设置编译后运行 fromeIf.exe,生成 .bin 文件

        通过MDK中的User选项卡,设置编译后调用fromeIf.exe,根据 .axf 文件生成 .bin 文件,用于 IAP 更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/767602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache RocketMQ5.x-消息队列体验

Apache RocketMQ5.x-消息队列体验 Apache RocketMQ 是一款低延迟、高并发、高可用、高可靠的分布式消息中间件,由阿里开源,后由阿里捐赠给Apache基金会。 本次体验的目的是从技术角度验证一下在微服架构中,用Apache RocketMQ做为消息队列&am…

MQTT 订阅标识符详解

为什么需要订阅标识符 在大部分 MQTT 客户端的实现中,都会通过回调机制来实现对新到达消息的处理。 但是在回调函数中,我们只能知道消息的主题名是什么。如果是非通配符订阅,订阅时使用的主题过滤器将和消息中的主题名完全一致,…

chatglm微调

chatGML 看到 【【官方教程】ChatGLM-6B 微调:P-Tuning,LoRA,Full parameter】 【精准空降到 15:27】 https://www.bilibili.com/video/BV1fd4y1Z7Y5/?share_sourcecopy_web&vd_sourceaa8c13cff97f0454ee41e1f609a655f1&t927 记得看…

Java Mybatis02+oracle拓展

0目录 Mybatis 02Oracle 拓展 1.Mybatis 02 创建数据库和表 创建工程 实体类 util工具类 接口方法 Resource Mapper xml文件 配置文件 测试 加入模糊查询(根据姓名) 测试结果 2.ParameterType语法 实战 参数为对象 参数为…

Bean 作用域与生命周期

Bean 作用域与生命周期 ​ 对于 Spring 来说,核心操作对象就是存和取 Bean ,接下来就 Bean 的作用域与生命周期进行探讨。 文章目录 Bean 作用域与生命周期一、作用域的定义1.1、Bean 的6种作用域1.2、Bean作用域设置方法 二、Bean 的生命周期2.1、Bean…

【Java】Java实现微信小程序发送服务通知

文章目录 前言一、文档来源二、JAR包引入三、后端工作四、编写配置文件配置一:WxConfig配置二:WxProperties 五、代码编写 前言 在上个月接到一个需求,大概是需要计算一条数据的最大办理时间从而发送任务超期的微信小程序服务通知&#xff0…

怎么进行流程图制作?分享几种绘制方法

怎么进行流程图制作?流程图是一种图形化表示流程的图表,通常用于描述业务、计划或工作流程。它可以帮助人们更好地理解复杂的流程,并且提供了一种清晰的方法来记录和共享流程信息。下面介绍一些绘制流程图的方法,可以帮助我们快速…

4 自动微分 Automatic Differentitaion

计算图 Computational Graph 图上的每个节点代表一个中间值边事输入输出的关系 forward 求导 forward mode AD 上图中从前向后,一步一步计算每个中间值对 x1的偏导,那么计算到 v7,就得到了整个函数对于 x1的偏导。 有limitation 对一个参数…

echarts开发遇到的问题

echarts开发遇到的问题 1.rich富文本标签作为横向柱状图的刻度标签,其中带有icon。rich里不能写参数,只能写死?圆角设置无效? 解决办法: 自己写横向柱状图 散点图性能优化配置的临界点,最低优化数值必须…

超全整理,软件测试高频面试题(功能/接口/自动化测试-附答案)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 功能测试 1、双十…

LCD—STM32液晶显示(4.液晶控制代码讲解)

目录 STM32液晶控制代码讲解 液晶接口封装介绍 使用LCD的配置步骤 内存操作要使用volatile进行修饰 图形绘制实现 绘制矩形 重点补充 STM32液晶控制代码讲解 液晶接口封装介绍 指南者液晶接口原理图 左边DB00—DB15表示液晶屏的数据线引脚,分别对应STM32的F…

使用ppocr突然退出问题

本次使用conda装了一个cuda10.2版本的paddleocr,然后所有的环境检查没问题,使用paddle自带的检查代码,输出提醒paddle可以正常使用: >>> import paddle >>> paddle.utils.run_check() 输出结果提示安装正常 …

零编程经验也能打造精美微信展示小程序的秘诀揭秘

随着微信的普及和发展,微信展示小程序成为了许多企业展示自己形象的重要渠道。那么如何快速地搭建一个精美的微信展示小程序呢?下面就为大家详细介绍一下具体操作步骤。 首先,进入【乔拓云】平台后台。乔拓云是一款非常优秀的小程序开发平台&…

php伪协议(文件包含)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 php伪协议 伪协议详情 php伪协议 文件包含直接读取的是文件,而不是文件源码,所以要想办法读取源码方法。 那么就要涉及到 PHP 伪协议 ph…

LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统

LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统 航电集成系统是现代战争飞机的重要组成部分,包括惯性导航系统、飞行控制系统、机电管理系统和任务计算机等子系统。战机的作战性能与航电系统息息相关,可以说,没有高性能的空电系统&#x…

行业首家!法大大荣获“数据安全管理能力认证(DSMC)”证书

7月11日,法大大获得由中国信息通信研究院(以下简称“中国信通院”)颁发的“数据安全管理能力认证(DSMC)证书”(以下简称“DSMC证书”),成为行业内首家获颁该证书的企业,法…

基于Java+SpringBoot+Vue前后端分离校园管理系统详细设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Spring Cloud Alibaba【创建支付服务生产者、创建服务消费者 、Dubbo和OpenFeign区别 、微服务接入OpenFeign】(二)

目录 分布式服务治理_创建支付服务生产者 分布式服务治理_创建服务消费者 服务调用_Dubbo和OpenFeign区别 服务调用_微服务接入OpenFeign 分布式服务治理_创建支付服务生产者 创建服务提供者工程cloud-provider-payment8001 POM文件引入依赖 <dependencies><…

MP4怎么转换为gif的格式?快试试这两个方法!

想要将MP4视频文件转换为GIF格式&#xff1f;不用担心&#xff0c;本文将为您介绍两种简单易行的方法&#xff1a;记灵在线工具和使用FFmpeg命令行工具。这些方法适用于不同的用户&#xff0c;无论您是喜欢在线工具还是偏向命令行操作&#xff0c;都能找到适合自己的方式。让我…

开源代码分享(8)—大规模电动汽车时空耦合双层优化调度(附matlab代码)

参考文献&#xff1a; [1]He L , Yang J , Yan J , et al. A bi-layer optimization based temporal and spatial scheduling for large-scale electric vehicles[J]. Applied Energy, 2016, 168(apr.15):179-192. DOI:10.1016/j.apenergy.2016.01.089 1.基本原理 1.1摘要 电…