STM32--IAP程序升级实验

1. STM32程序升级方法

1.1 ST-link / J-link下载

        将编译生成的hex文件使用ST-Link/J-Link工具直接下载进 Flash 即可。Keil中点击下载也能一键下载。下载后的代码会存放在Flash的起始地址0x0800 0000

简单补充一句,bin文件hex文件的区别:

  • bin文件不带地址信息,因此下载的时候需要指定下载地址。
  • hex文件自带地址信息,直接点击下载自己会找到要下载到的地址(默认0x0800 0000)。

ST-LINK/J-LINK方式支持在线调试

1.2 ISP(In System Programing) 

        我们常见的一键下载电路就是用的这种方式。这个是利用了 STM32 自带的 Bootloader 升级程序。可以通过USB转串口,再通过ISP软件导入程序

在用户参考手册中,可以看到下表,关于启动模式设置的。

ISP根据读取到的FLASH大小自动确定下载地址。

STM32启动模式

        ST公司在系统存储器中存放了BootLoader引导程序,通过BootLoader引导程序可完成自启动,并通过向量表跳转至用户APP程序。一般可通过USART1、USART3、CAN2、USB对Flash重新编程。系统BootLoader的起始地址0x1FFF F000,进入系统自带的BootLoader后可利用STM32CubeProgrammer更新程序

        不管通过何种方式,程序最后都是下载到主闪存存储器Flash里面的

可以这么理解:芯片出厂时,系统存储器中已经存储了一段程序,这段程序的功能是将串口1(固定的)收到的数据,放到主闪存存储器(Flash)中,从0x0800 0000地址处开始。

1.3 IAP(In Application Programing)

IAP 和 ISP 其实基本上是一样的,都是通过串口接收程序,存放到FLASH中的某段地址。

ISP 是由厂商已经提供好的,因此接口固定(串口1);

IAP可以自定义使用任何接口接收应用程序。因为这一点,用户可以用多种方式更新程序。

1.3.1 正常程序运行流程

正常情况下,程序从Flash启动时的流程如下:

1. 程序从Flash启动,根据中断向量表找到复位中断处理函数的地址。(0x0800 0004处是中断向量表的起始地址,也是中断向量表的起始,记录了复位中断处理函数的地址)。

2. 执行复位中断处理函数,初始化系统环境后跳转到main函数

3. 在main函数的死循环中运行,直到有中断发生

4. 中断发生时,跳转到中断向量表起始处,根据中断信号源跳找到相应的中断处理函数

5. 中断处理函数执行完后返回到main函数继续运行。

1.3.2 IAP时程序运行流程

引入IAP后的启动流程如下图所示。在Flash中存储了两套程序:

Bootloader程序:自举程序。负责接收数据(APP应用程序代码)并将其存储到Flash中。

APP应用程序:我们真正的应用程序。

  1. 程序从Flash启动,根据中断向量表找到复位中断处理函数的地址。
  2. 执行复位中断处理函数后,跳转到Bootloader的main函数。该函数检查并保存新的APP程序到Flash,然后跳转到第二套程序运行。
  3. 一旦进入新的APP程序,根据中断向量表找到复位中断处理函数,进入App程序的main函数运行。
  4. 为确保中断能正确跳转到APP程序的中断处理函数,需要在APP程序中修改中断向量表的偏移,确保中断发生时能正确执行APP程序的中断处理函数

ISPIAP
在系统存储器中存储了一套接收串口1数据的程序IAP是将Flash分成了两份,在第一份中存储了一套接收某个接口的程序
使用硬件BOOT引脚设置进行跳转使用软件(直接修改PC指针)进行跳转
仅能使用芯片厂商设置好的接口(串口1)用户自定义,理论上只要能接收数据的接口都可以用

2. STM32 Bootloader实现

bootloader基本概念

首先贴上参考文献,这位老哥开源了自己测试的代码,大家可以直接下载,此处做个补充完善

STM32深入系列02——BootLoader分析与实现_stm32 bootloader-CSDN博客文章浏览阅读3.3k次,点赞34次,收藏96次。stm32 bootloader功能分析与实现_stm32 bootloaderhttps://blog.csdn.net/weixin_46253745/article/details/135321134先说BootLoader的思想,对于新手来讲认识的编译后的程序就是.HEX文件,常见做法就是各种下载器或者usb转串口用ISP程序进行烧录,但是企业场景不可能每个设备挨个拿串口去传输,我要远程升级怎么办?

答案就是.BIN文件和BOOTLOADER自举思路。

在 默认方式下,我们的嵌入式程序是以连续二进制的方式烧录到 STM32 的可寻址 Flash 区域上 的。如果我们用的 Flash 容量大到可以存储两个或多个的完整程序,在保证每个程序完整的情 况下,上电后的程序通过修改 MSP 的方式,就可以保证一个单片机上有多个有功能差异的嵌 入式软件,这就是我们要讲解的 IAP 的设计思路。

通常实现 IAP 功 能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目代码通过USB、USART等方式接收更新程序并执行更新,第二个项目代码执行用户真正的功能。

我们将第一个项目代码称之为 Bootloader程序,第二个项目代码称之为 APP程序,他们存放在 STM32F429 FLASH 的不同地址范围。

bootloader原理

        我们知道的复位方式有三种:上电复位,硬件复位和软件复位。当产生复位,并且离开复位状态后,CM4 内核做的第一件事就是读取下列两个 32 位整数的值:

(1)从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。

(2)从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值指向复位后执行的第 一条指令。下面用示意图表示,如图 9.1.1 所示。

上述过程中,内核是从 0x0000 0000 和 0x0000 0004 两个的地址获取堆栈指针 SP 和程序计数器指针 PC。事实上,0x0000 0000 和 0x0000 0004 两个的地址可以被重映射到其他的地址空间。

例如:我们将 0x0800 0000 映射到 0x0000 0000,即从内部 FLASH 启动,那么内核会从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,从地址 0x0800 0004 处取出程序计数器指针 PC 的初始值。CPU 会从 PC 寄存器指向的地址空间取出的第 1 条指令开始执行程序,就是开始执行复位中断服务程序 Reset_Handler。 将 0x0000 0000 和 0x0000 0004 两个的地址重映射到其他地址空间,就是启动模式选择。

理论上所有程序都是从0x0000 0000开始启动!!!所谓不同的启动模式就是将0x0000 0000映射到了不同的地址!!!从而MSP取值和CP取值的地址不同!!

测试过程的碎碎念

注意,划分Flash的时候,注意App程序起始地址,根据芯片不同起始地址倍数关系也不同

STM32F1:地址必须是4的倍数,因为每次写入只能写入32位数据,即4个字节。
STM32F4:地址可以从任意地址开始,因为每次写入可以写入8位数据,每个地址就是1个字节。
STM32L4:地址必须是8的倍数,因为每次写入只能写入64位数据,即8个字节。

Stm32的flash都是从0x0800000开始的,结束地址看片子的flash大小

Stm32的sram都是从0x2000000开始的,结束地址看片子的sram大小

理论上我们只需要确保APP起始地址在Bootloader之后,并且偏移量为0X200的倍数即可(相关知识,请参考:NVIC的向量表偏移寄存器设置问题(已解决)-OpenEdv-开源电子网)

检查栈顶地址是否合法.0x20000000是sram的起始地址,也是程序的栈顶地址;

appxaddr存放的是用户程序Flash的首地址,(*(volatile u32*)appxaddr)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000。

在保存了一个完整的 APP 到了对应的位置后,我们需要对栈顶进行检查操作,初步检查 程序设置正确再进行跳转。我们以 FlashAPP 为例,用 bin 文件查看工具(A 盘→6,软件资料 →1,软件→winhex),可以看到 bin 的内容默认为小端结构

中断向量表一个中断占4个字节,正好是一个指针的大小。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化作业一:江西人口数据可视化

目录 作业要求 一、江西省各地市(年末)常住人口分布地图绘制 1.1 代码实现 1.1.1采用Map实现 1.1.2 采用Geo实现 1.2 绘制结果 二、江西省各地市常住人口分布饼状图绘制 2.1代码实现 2.2 绘制结果 三、江西省各地市常住人口城镇化率柱状图绘制 …

7_机械臂工作台坐标系理论_一般坐标系的映射_2

1、一般坐标系的映射 经常有这种情况,我们已知矢量相对坐标系{B}的描述,并且想求出它相对于另一个坐标系{A}的描述。结合上次的理论和平时对机械臂使用的经验,使用3点法标定机械臂工作台坐标系(我习惯称为用户坐标系,下面称为用户…

混剪视频的素材一般去哪找?做短视频素材混剪网站库分享!

在短视频和自媒体的快速发展时代,混剪视频已成为许多创作者展现创意和吸引观众的重要手段。制作高质量的混剪视频离不开优质素材的支持。今天,我将为大家推荐几个优秀的素材网站,帮助你轻松获取制作混剪视频所需的多样素材,提升视…

PyQt5.QtWidgets常用函数及说明

目录 PyQt5.QtWidgets简介常用函数设置窗口标题和固定大小创建垂直布局创建进度条 PyQt5.QtWidgets简介 PyQt5.QtWidgets 是 PyQt5 库中的一个模块,它包含了用于创建图形用户界面(GUI)的各种小部件(widgets)。这些小部…

Gobject tutorial 六

Instantiatable classed types Initialization and destruction 类型的实例化是通过函数g_tpye_create_instance()实现的。这个函数首先会查找与类型相关的GTypeInfo结构体,之后,查询结构体中的instance_size和 instance policy即 n_preallocs(在 2.10版…

陶建辉入选 2023 年度“中国物联网行业卓越人物榜”

在这个技术飞速发展的时代,物联网行业作为推动社会进步的重要力量,正在不断地演化和革新。近日,中国智联网生态大会暨“2023 物联之星”年度榜单颁奖典礼在上海浦东举行。现场公布了拥有物联网行业奥斯卡奖之称的 ——“物联之星 2023 中国物…

深度 | OpenAI COO闭门访谈:大模型已至,企业如何落地?

图片来源:OpenAI Z Highlights: 仅仅允许公司单一部门使用互联网非常可笑。类似地,给所有员工开放AI权限将会是最大的催化剂。当前阶段的AI企业级部署,要让员工熟悉AI工具的使用方式,让他们将工作流程与模型的功能紧密…

九、数据结构(并查集)

文章目录 1.并查集操作的简单实现2.解决问题3. 并查集优化3.1 合并的优化3.2查询优化3.3查询优化2 通常用“帮派”的例子来说明并查集的应用背景&#xff1a;在一个城市中有 n ( n < 1 0 6 ) n(n < 10^6) n(n<106)个人&#xff0c;他们分成不同的帮派&#xff0c;给出…

[算法刷题积累] 两数之和以及进阶引用

两数之和很经典&#xff0c;通常对于首先想到的就是暴力的求解&#xff0c;当然这没有问题&#xff0c;但是我们如果想要追求更优秀算法&#xff0c;就需要去实现更加简便的复杂度。 这里就要提到我们的哈希表法: 我们可以使用unordered_map去实现&#xff0c;也可以根据题目&a…

【Linux】线程(二:线程控制)

本篇文章主要围绕线程控制来进行展开。 主题思路是以create与join两个接口展开。 目录 pthread_create 与 pthread_join:pthread_create:pthread_join: 代码&#xff1a;问题一&#xff1a;主线程与新线程谁先退出&#xff1f;问题二&#xff1a;哪个线程应该最后退出&#xf…

【关键点检测和描述】SuperPoint

一、引言 论文&#xff1a; SuperPoint: Self-Supervised Interest Point Detection and Description 作者&#xff1a; Magic Leap 代码&#xff1a; SuperPoint 特点&#xff1a; 提出Homographic Adaptation策略&#xff0c;提升模型从虚拟数据迁移到真实数据的表现&#x…

邻氯苯甲酰氯在医药、农药等领域应用广泛 市场需求稳定且有增长趋势

邻氯苯甲酰氯在医药、农药等领域应用广泛 市场需求稳定且有增长趋势 邻氯苯甲酰氯又称为2-氯苯甲酰氯、氯化邻氯苯甲酰&#xff0c;化学式为C7H4Cl2O&#xff0c;是一种化学物质&#xff0c;外观为黄色液体&#xff0c;不溶于水&#xff0c;溶于醇、醚、丙酮&#xff0c;有强烈…

第100+12步 ChatGPT学习:R实现KNN分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现KNN分类 &#xff08;1&a…

API 设计技巧:基础知识与实践的方法

在这篇深入探讨中&#xff0c;我们将从基础开始&#xff0c;逐步介绍 API 设计&#xff0c;并探讨定义卓越API的最佳实践。 作为一名开发者&#xff0c;你可能已经熟悉了许多这些概念&#xff0c;但我将提供详细解释&#xff0c;以加深你的理解。 API 设计&#xff1a;电子商…

图纸管理最佳实践:从混乱到有序的转变

图纸管理最佳实践&#xff1a;从混乱到有序的转变 在工程项目中&#xff0c;图纸是不可或缺的重要资料&#xff0c;它们承载着设计者的智慧与心血。然而&#xff0c;随着项目的推进和时间的推移&#xff0c;图纸管理往往变得混乱不堪&#xff0c;给项目的顺利进行带来诸多不便。…

ROS(四)

write in advance 实验四&#xff0c;在经历了实验三的失败后&#xff0c;卷土重来。 幸运的是&#xff0c;此次实验很简单&#xff0c;很快就能搞定。 Part one 使用指令查看自己摄像头的设备号&#xff0c;如果报错&#xff0c;且你为虚拟机&#xff0c;可能是未在虚拟机处…

Java学习 (二)关键字、标识符、数组

一、关键字 我们第一章案例中有很多关键字&#xff0c;比如class、public、static、void等&#xff0c;这些关键字依旧被java定义好了&#xff0c;可以拿来用&#xff0c;不需要死记硬背&#xff0c;按照官方文档查询即可 #官方文档 https://docs.oracle.com/javase/tutorial/j…

docker-compose设置永久启动、自动重启

步骤一 找到 docker-compose.yml 文件 步骤二 vim 打开文件 找到 image: PS&#xff1a;就是为了对齐格式 步骤三 在其下方添加&#xff1a; restart: always而后保存即可

打开nginx连接的php页面报错502

目录 问题描述&#xff1a; 原因&#xff1a; 1. 使用 Unix 域套接字&#xff08;Unix Socket&#xff09; 区别和优势&#xff1a; 2. 使用 TCP/IP 套接字 区别和优势&#xff1a; 如何选择 扩展&#xff1a;Rocky_Linux9.4安装PHP的步骤&#xff1a; 使用Remi存储库…

Wifi通信协议:WEP,WPA,WPA2,WPA3,WPS

前言 无线安全性是保护互联网安全的重要因素。连接到安全性低的无线网络可能会带来安全风险&#xff0c;包括数据泄露、账号被盗以及恶意软件的安装。因此&#xff0c;利用合适的Wi-Fi安全措施是非常重要的&#xff0c;了解WEP、WPA、WPA2和WPA3等各种无线加密标准的区别也是至…