STM32 IAP相关的FLASH数据读取和跳转

news2025/7/23 17:02:36

IAP操作

  • 一、STM32 FLASH 分区
  • 二、BootLoader程序
  • 三、UserAPP程序
  • 四、Flash数据的读取
  • 五、BootLoader到UserAPP的跳转

一、STM32 FLASH 分区

以STM32G484RE举例,固件烧录到FLASH的起始地址进行保存,理论上可烧录的最大文件为512Kb,实际项目中固件一般不会这么大,所以空余的一部分可用作数据的保存。

项目Value
FLASH的起始地址0x8000000
FLASH的容量0x80000 512KB

FLASH分区如下,
将0x8000000作为运行BootLoader程序,最大为64KB,
将0x80100000作为System数据存储区域,可保存系统配置文件、时间等数据最大为64KB,
将0x80200000-0x80400000作为UserAPP_1程序的保存地址,大小为128KB,
将0x80400000-0x80600000作为UserAPP_2程序的保存地址,大小为128KB,
将0x80600000-0x80800000作为UpdataBin 程序的保存地址,大小为128KB,
在这里插入图片描述
STM32 KEIL中各分区对应的代码配置应与分区地址对应

BootLoader:0x8000000

在这里插入图片描述
UserApp_1:0x8020000

在这里插入图片描述

二、BootLoader程序

开机上电运行FLASH起始地址0x8000000 处保存的BootLoader程序,检查FLASH内是否有新的升级文件需要更新,流程具体任务如下所示
在这里插入图片描述

三、UserAPP程序

UserAPP就是用户项目的主要代码,

1.主函数内,第一行,执行下述语句,设置偏移量

SCB->VTOR = FLASH_BASE | 0x20000;//设置偏移量  对应当前APP程序的分区地址

2.将升级原始文件切片、加密按照传输协议封装打包,通过串口、SPI、以太网、蓝牙、WIFI、IIC等方式进行传输

3.在UserAPP中设计线程,接收UpdataBin更新文件,保存到上面分区的 UpdataBin 0x8060000中,大小不超过128KB

4.接收完成后 ,变更Parpam保存的参数,使能更新状态标志,

5.直接调用系统API函数 进行软件复位 重新启动 代码从BootLoader开始运行

四、Flash数据的读取

 typedef volatile uint32_t  vu32;  //四字节对齐的数据类型
 (vu32*)appxaddr  //将 appxaddr 地址强制转换为指针 
*(vu32*)appxaddr //取 appxaddr 指针指向地址保存的值

uint32_t ReadWord(uint32_t faddr)
{
	return *(vu32*)faddr; //可根据强制转换的类型来更改一次读取的长度 vu32 4字节 vu64 8字节
} 

五、BootLoader到UserAPP的跳转

typedef  void (*iapfun)(void);				//定义一个函数类型的参数.   
iapfun   jump2app; 
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(uint32_t addr) 
{
	MSR MSP, r0 			//set Main Stack value
	BX r14
}

void iap_load_app(uint32_t appxaddr)
{
	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	//检查栈顶地址是否合法.
	{ 
		jump2app=(iapfun)*(vu32*)(appxaddr+4);		//用户代码区第二个字为程序开始地址(复位地址)		
		MSR_MSP(*(vu32*)appxaddr);					//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
		jump2app();									//跳转到APP.
	}
}

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

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

相关文章

动态域名解析

众所周知,如果计算机想参与互联网通讯,无论是作为一台执行资源访问的客户端还是作为一台被访问的资源提供服务器,计算机必须分配一个合法的IP地址。这个地址通常由互联网服务商提供(在中国通常是电信部门) 这种IP地址…

2.JDBC必知必会

文章目录2.0 JDBC2.1 配置单数据源项目一:尝试Spring Boot自动装配数据源创建查看应用程序有哪些bean原理问题项目二:SpringMVC手动配置数据源Spring Boot自动装配原理与数据源相关配置项目三:尝试Spring Boot自动装配参数配置2.2.配置多数据…

基于自适应Sigmoid型函数的内镜图像增强与空间变颜色再现方法

论文题目:Image Enhancement and Space-variant Color Reproduction Method for Endoscopic Images using Adaptive Sigmoid Function 1 摘要 首先,使用YCCBR转换矩阵,将彩色图像分为亮度分量和色度分量,对均匀分布的亮度像素应…

论文笔记:PTR: Prompt Tuning with Rules for Text Classification

Abstract 手动设计大量语言提示麻烦且易出错,而自动生成的提示,在非小样本场景下验证其有效性昂贵且耗时。因此,提示调优以处理多类别分类任务仍然具有挑战。为此,本文提出使用规则进行多类别文本分类提示调优(PTR&…

深入理解Java线程间通信

合理的使用Java多线程可以更好地利用服务器资源。一般来讲,线程内部有自己私有的线程上下文,互不干扰。但是当我们需要多个线程之间相互协作的时候,就需要我们掌握Java线程的通信方式。本文将介绍Java线程之间的几种通信原理。 锁与同步 在…

进程与线程

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

微服务环境搭建

目录 一,微服务介绍 单体架构介绍 垂直应用架构 分布式架构 SOA架构 微服务架构 二,微服务架构简介 三,微服务搭建 模块设计 创建步骤 一,微服务介绍 系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构---&…

【python】bin/dec/hex/bnr进制转换函数及fp32转十六进制

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵! 前言 不知道为什么,给脚本专栏选的这个logo有种怪怪的感觉(⊙o⊙)… 为方便后续一些脚本工作,将常用的进制转换函数汇总。所有函数均为字符串输入输出,且不加0x、0b等关键字&a…

计算机硬件和软件

文章目录一 计算机硬件1)主板2)显示器3)键盘4)鼠标二 计算机软件(一)系统软件(1)操作系统(2)BIOS(3)设备驱动程序(二&…

K-verse 小型活动来袭!

欢迎来到韩流狂欢节! 我们的韩流活动以为期 2 周的 K-verse 小型活动拉开帷幕! 在 The Sandbox 的众多合作伙伴中,K League、Anicube、Sandbox Network 和 Cube 娱乐都为此次活动打造了独特的体验。从 11 月 24 日开始,玩家总共可…

digitalLogic_逻辑门和基本公式

文章目录refs逻辑闸或逻辑门与或非门反相器和泡泡与非/或非/异或同或/是/蕴含/蕴含非逻辑函数的表示方法及相互转换逻辑表达式化简基本公式异或和同或的常用运算公式refs digital_logic同或和异或的关系_xuchaoxin1375的博客-CSDN博客_异或与同或的关系模2运算_模二除法和CRC循…

彩虹之眼文化集团整体方案设计

彩虹之眼文化集团开业成功必须克服的问题是:既要有轰动的社会效应,又要有实实在在的营业额。而要使两者兼备,就要求助于开业前期的广告渲染,此方案解决的重要问题就是如何在有轰动社会效应的同时又兼具营业佳绩。因此本次公司宣传…

Android8.1 MTK 浏览器下载的apk点击无反应不能安装

最近测试人员发现用原生浏览器下载的apk点击安装时无反应,不能安装。 在/vendor/mediatek/proprietary/packages/apps/Browser/src/com/android/browser/DownloadHandler.java 中,发现下载的apk文件缺少了mime类型,如下图 mimetype null造…

第五章TCP/IP 网络在我们身边

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…

Ubuntu22.2下C语言编程实现,首次,最佳适应算法

参考目录:1.题目要求2.分析设计3.程序代码4.运行截图5.程序说明1.题目要求 编写C语言程序,模拟实现首次/最佳/最坏适应算法(选择其中之一即可)的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下&am…

SpringBoot整合redis+mysql

SpringBoot整合Redis 测试连接 添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

【TFS-CLUB社区 第7期赠书活动】〖从零开始利用Excel与Python进行数据分析 自动化办公实战宝典〗等你来拿,参与评论,即可有机获得

文章目录❤️‍&#x1f525; 赠书活动 - 《从零开始利用Excel与Python进行数据分析 自动化办公实战宝典》❤️‍&#x1f525; 编辑推荐❤️‍&#x1f525; 抽奖方式与截止时间❤️‍&#x1f525; 赠书活动 → 获奖名单❤️‍&#x1f525; 赠书活动 - 《从零开始利用Excel与…

【数据结构】二叉树的前中后序遍历

二叉树的三种遍历1. 创建一棵简单的二叉树1.1 二叉树结构体实现1.2 创造一个二叉树结点的函数1.3 手动创造一棵二叉树2.为什么要遍历&#xff1f;3.最重要的知识&#xff1a;由二叉树引出的子问题分析4.遍历4.1 前序遍历4.2 中序遍历4.3 后序遍历5.总结1. 创建一棵简单的二叉树…

基于springboot车辆充电桩设计与实现的源码+文档

摘 要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;车辆充电桩管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&…

18.3 内存池概念、代码实现和详细分析

一&#xff1a;内存池的概念和实现原理概述 malloc&#xff1a;内存浪费&#xff0c;频繁分配小块内存&#xff0c;浪费更加明显。 “内存池”要解决什么问题&#xff1f; 1、减少malloc()的次数&#xff0c;减少malloc()调用次数就意味着减少对内存的浪费 2、减少malloc()的…