【IAP】核心开发流程

最近做了IAP U盘升级模块开发,总结下IAP基本开发流程,不深入讨论原理。
详细原理参考
在这里插入图片描述
首先需要知道我们需要把之前的APP区域拆一块出来做BOOT升级程序区域。
在这里插入图片描述
以STM32F103为例,0x08000000到0x0807FFFF为FLASH空间,即上图代码区域。那么可以以此划分APP区域和BOOT区域
在这里插入图片描述

而具体怎么划分,可以用JLINK读取当前芯片BOOT程序占用了多少空间,比如占用了0x8960字节,后面都是FF 即 空。
在这里插入图片描述

那么我们可以给BOOT划分0x08000000~0x0800C000的地址空间(方便举例,可以不用余这么多)
这里好像需要注意得是4的整数倍,
部分芯片如LPC177X会涉及到扇区与地址对应,但思路是一样的,参考这篇
这里用了1K即0x400做校验地址空间(0X0800C000~0X0800C3FF),但这不是必须的,也可以不要

#define APP_START_ADDR						0x0800C400UL				//业务程序起始地址
#define APP_END_ADDR						0x0807FFFFUL                //业务程序结束地址
#define CRC_SAVE_START_ADD					0X0800C000UL				//CRC程序校验码存放开始地址
#define CRC_SAVE_END_ADD					0X0800C3FFL				//CRC程序校验码存放结束地址,共1k

现在0x08000000~0x0800C000放boot,
0X0800C000~0X0800C3FF放校验,
那么剩下的都可以做APP空间啦
在这里插入图片描述

0X0800C400~0X0807FFFF爽用,注意ROM右边是SIZE不是截止地址,这个做个十六进制减法就好了。
那么地址配置现在做完了,接下来就是跳转。

由BOOT跳转到APP区域有以下两个即可,jumpToApp是在main里跳,如果用了Freertos在任务中跳就用jumpToAppInTask

void jumpToApp(uint32_t appBaseAddr)
{void (*firmwareFunc)(void);uint32_t fwStackVal = *((uint32_t *)(appBaseAddr));     /* the first word is for the stack pointer. */uint32_t fwEntryVal = *((uint32_t *)(appBaseAddr+4U));  /* the second works is for the boot function. */firmwareFunc = (void (*)(void))fwEntryVal;SCB->VTOR = appBaseAddr; /* The stack address is also the start address of vector. */__set_MSP(fwStackVal);__set_PSP(fwStackVal);firmwareFunc();
}
void jumpToAppInTask(uint32_t appBaseAddr)
{void (*firmwareFunc)(void);SysTick->CTRL = 0X00;//禁止SysTickSysTick->LOAD = 0;SysTick->VAL = 0;__disable_irq();uint32_t fwStackVal = *((uint32_t *)(appBaseAddr));     /* the first word is for the stack pointer. */uint32_t fwEntryVal = *((uint32_t *)(appBaseAddr+4U));  /* the second works is for the boot function. */firmwareFunc = (void (*)(void))fwEntryVal;SCB->VTOR = appBaseAddr; /* The stack address is also the start address of vector. */__set_MSP(fwStackVal);__set_PSP(fwStackVal);firmwareFunc();
}

需要注意在APP main开头加上SCB->VTOR = APP_START_ADDR;以保证正确跳转
APP跳BOOT只需要NVIC_SystemReset();即可
跳转逻辑可以参考
在这里插入图片描述

地址配置,跳转都完成后就是升级数据接收,Flash擦除与写入了
主要逻辑是在BOOT程序中擦除APP空间的FLASH,然后再可以1K 1K的写入,当然擦1K写1K也可以

具体接收逻辑就自己定义就可以了,比如收一包回一包,加序号都可以的

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

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

相关文章

Unity解决Udp客户端无法接收数据的问题

Unity解决Udp客户端无法接收数据的问题 在我之前做过的项目中,其中不少涉及Udp客户端的项目。在这些项目中,一般只需要实现客户端向服务器端发送数据的功能就可以了,一般都不用接收服务器端发送的数据,但是也有同学使用了我分享的…

vue-router之路由钩子函数应用解析

vue-router是vue开发中不可或缺的一部分,也是vue全家桶生态的重要部分,平时开发vue时会高频率使用,那么它除了在routes上的应用外,还有一些钩子函数具体可以应用在哪些地方呢 路由的钩子函数共有6个 全局的路由钩子函数&#xff…

DOM 的 diff 算法

经典面试题: 1)react/vue中的 key 有什么作用?(key的内部原理是什么?) 2)为什么遍历列表时,key 最好不用 index? 1、虚拟dom中key的作用: 1) 简…

【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?

自动化测试是一种软件测试方法,通过编写和使用自动化脚本和工具,以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程,提高测试效率和准确性。 自动化测试可以覆盖多种测试类型,包括功能测试、性能测试、安全测试等&…

Spring06

一、SpirngMvc的基本概念 Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。 MVC(Model View Controller),一种用于设计创建Web应用程序的开发模式 Model(模型&#xff…

软件测试|使用matplotlib绘制气泡图

简介 气泡图(Bubble Chart)是一种数据可视化工具,通常用于展示三维数据的分布情况,其中数据点以气泡的形式显示在二维平面上,每个气泡的位置表示两个变量的值,气泡的大小表示第三个变量的值。在Python中&a…

广告效果评估的意义 | 广告效果评估的重要性有哪些?

本文由群狼调研(长沙品牌推广测试)出品,欢迎转载,请注明出处。广告效果评估的重要性体现在多个方面,以下是一些关键点: 1.投资回报评估: 广告活动往往需要巨大的投资,通过评估广告效…

编程语言的发展未来?

编程语言的未来? 随着科技的飞速发展,编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心,为程序员提供了与机器沟通的桥梁。那么,在技术不断进步的未来,编程语言的走向又将如何呢? 方向…

austin-admin 消息推送平台前端项目依赖低代码平台Amis 怎么使用

austin-admin 消息推送平台前端项目🔥依赖低代码平台Amis 怎么使用 收到一个通知,要将部署一个开源的消息系统 :austin的前端开源:https://gitee.com/zhongfucheng/austin-admin 本地运行 1、使用npm或者yarn这些咯 yarn yarn start2、使用…

使用muduo库编写网络server端

muduo库源码编译安装和环境搭建 C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客 #include<iostream> #include<muduo/net/TcpServer.h> #include<muduo/net/EventLoop.h> using namespace std; using namespace muduo; using name…

Linux 系统之部署 h5ai 目录列表程序

一、h5ai 介绍 1.1&#xff09;h5ai 简介 h5ai 是用于 HTTP Web 服务器的现代文件索引器&#xff0c;专注于您的文件。目录以吸引人的方式显示&#xff0c;浏览它们通过不同的视图、面包屑和树概述得到增强。最初 h5ai 是 HTML5 Apache Index 的首字母缩写&#xff0c;但现在它…

Linux Mii management/mdio子系统分析之六 fixed-mii_bus分析(mac2mac分析)

&#xff08;转载&#xff09;原文链接&#xff1a;[https://blog.csdn.net/u014044624/article/details/130674908] (https://blog.csdn.net/u014044624/article/details/130674908) 前面几章我们介绍了MDIO模块的大部分内容&#xff0c;针对mii_bus、mdio_bus、phy_device、p…

vue3__Provide / Inject (依赖注入)和mixins

一、 Provide提供和Inject 注入 Provide提供 <script setup> import { provide } from vueprovide(/* 注入名 */ message, /* 值 */ hello!) </script> 例如父组件中提供方法 <template> <div class"home">dfhualsf<div><button…

Qt优秀开源项目之二十一:遇见QSkinny,一个轻量级Qt UI库

目录 一.QSkinny简介 二.工作原理 三.编译 一.QSkinny简介 QSkinny库基于Qt Graphic View和Qt/Quick中少量的核心类。它提供了一组轻量级控件&#xff0c;可以在C或QML中使用这些控件。QSkinny默认是启用硬件加速的&#xff0c;非常适合嵌入式设备&#xff0c;目前已经应用于…

Python之assert断言介绍

python自动化测试中寻找元素并进行操作&#xff0c;如果在元素好找的情况下&#xff0c;相信大家都可以较熟练地编写用例脚本了&#xff0c;但光进行操作可能还不够&#xff0c;有时候也需要对预期结果进行判断。 常用 这里介绍几个常用断言的使用方法&#xff0c;可以一定程度…

iOS长按时无法保存图片问题解决方案

在使用iOS设备的用户中&#xff0c;相信很多人都有过在浏览网页时遇到长按时无法保存图片的困扰。这主要是因为网页开发者为了保护版权或隐私&#xff0c;默认屏蔽掉了图片长按时保存的功能。 具体来说&#xff0c;问题出在-webkit-touch-callout这个CSS属性上。这个属性用于定…

Vue3组件库开发 之Button(1)

需求分析&#xff1a; Button 组件大部分关注样式&#xff0c;没有交互 根本分析可以得到具体的属性列表&#xff1a; type:不同的样式(Default,Primary,Danger,Info,Success,Warning) plain:样式的不同展现模式boolean round:圆角boolean circle:圆形按钮&#xff0c;适合图标…

React入门 - 07(说一说 JSX 中的语法细节)

本章内容 目录 1、js 表达式2、列表渲染3、条件渲染4、className5、jsx 中的样式处理6、dangeouslySetInnerHTML7、htmlFor8、使用 jsx 的注意事项 上一节内容我们完成了一个简单的TodoList案例。到现在为止我们已经知道怎么在 JSX中使用 “js 表达式”和”列表渲染“了&#…

蓝桥杯 最长递增

输入 7 5 2 4 1 3 7 2 输出 3 思路 这个思路也很简单&#xff0c;后面大于前面&#xff0c;长度加一。当后面不大于前面的时候&#xff0c;就是一个新的递增序列了&#xff0c;递增序列的长度最小为1。 代码 #include <iostream> using namespace std; int main() {in…

Nginx初体验

文章目录 定义正向代理 & 反向代理安装与尝试 之前没怎么用过代理服务器Nginx&#xff0c;主要也是因为没有架构知识&#xff0c;根本不会去部署相关的机器。但是最近公司内部在调试的时候&#xff0c;经常用本机去充当Ngnix代理服务器&#xff0c;由于对这块知识掌握得还不…