【IAP】核心开发流程

news2024/9/24 18:00:18

最近做了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;//禁止SysTick
    SysTick->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.coloradmin.cn/o/1397368.html

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

相关文章

Java基础面试题-2day

面向对象 创建一个对象用什么运算符,对象实体和对象引用有什么不同? 创建对象使用new String A new String(); A即为对象引用,通过new运算符,创建String()类型的对象实体。 对象引用的存储位置在栈内存 对象实体的存储位置在堆…

2024玩儿转TikTok之环境介绍及搭建

郑重申明:本文章只对合法合理做tiktok视频运营的用户做学习交流使用,有其他使用不当的违规违法行为后果自负! 一、网络环境图介绍:我们只需要保证红色的环境通畅即可(手机阿里tiktok运营专用服务器) 二、服务器部分环境搭建 1、…

STM32F103标准外设库——SysTick系统定时器(八)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

软件测试|sqlalchemy一对一关系详解

简介 SQLAlchemy 是一个强大的 Python ORM(对象关系映射)库,它允许我们将数据库表映射到 Python 对象,并提供了丰富的关系模型来处理不同类型的关系,包括一对一关系。在本文中,我们将深入探讨 SQLAlchemy …

大数据工作岗位需求分析

前言:随着大数据需求的增多,许多中小公司和团队也新增或扩展了大数据工作岗位;但是却对大数据要做什么和能做什么,没有深入的认识;往往是招了大数据岗位,搭建起基础能力后,就一直处于重复开发和…

基于springboot+vue的校园周边美食探索及分享平台系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

网络知识梳理:TCP与UDP

TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的互联网协议,它们都用于在网络层和传输层进行数据传输,但它们在数据传输的方式和特性上有显著的区别: 1.TCP (传输控制协议) 连接导向&…

贪心算法 ——硬币兑换、区间调度、

硬币兑换: from book:挑战程序设计竞赛 思路:优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

万户 ezOFFICE wf_printnum.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

vue中父组件异步传值,渲染问题

vue中父组件异步传值&#xff0c;渲染问题 父组件异步传值&#xff0c;子组件渲染不出来。有如下两种解决方法&#xff1a; 1、用v-if解决&#xff0c;当父组件有数据才渲染 <Child v-if"dataList && dataList.length > 0" :data-list"dataLis…

深度学习记录--mini-batch gradient descent

batch vs mini-batch gradient descent batch&#xff1a;段&#xff0c;块 与传统的batch梯度下降不同&#xff0c;mini-batch gradient descent将数据分成多个子集&#xff0c;分别进行处理&#xff0c;在数据量非常巨大的情况下&#xff0c;这样处理可以及时进行梯度下降&…

6. UE5 RPG AttributeSet的设置

AttributeSet 负责定义和持有属性并且管理属性的变化。开发者可以子类化UAttributeSet。在OwnerActor的构造方法中创建的AttributeSet将会自动注册到ASC。这一步必须在C中完成。 Attributes 是由 FGameplayAttributeData定义的浮点值。 Attributes能够表达从角色的生命值到角色…

【微信小程序独立开发 4】基本信息编辑

这一节完成基本信息的编辑和保存 首先完成用户头像的获取 头像选择 需要将 button 组件 open-type 的值设置为 chooseAvatar&#xff0c;当用户选择需要使用的头像之后&#xff0c;可以通过 bindchooseavatar 事件回调获取到头像信息的临时路径。 从基础库2.24.4版本起&…

关于java的继承

关于java的继承 我们在上一篇文章中&#xff0c;了解到了封装&#xff0c;我们本篇文章来介绍一下面向对象的第二大特点&#xff0c;继承&#xff0c;还是遵循结合现实生活中的实际情况&#xff0c;理解着去学习&#xff0c;能更好的加深印象&#x1f600;。 一、继承 继承的…

使用phpunit进行接口自动化测试

年初一个偶然的机会接触到了phpunit&#xff0c;一个用PHP编程语言开发的开源软件&#xff0c;也是一个单元测试框架&#xff0c;有效利用的话可以大大提高接口遍历的效率。废话不多说&#xff0c;直接干货。 1.安装 在php的目录下 1 2 pear channel-discover pear; pear in…

Gradle——基础

1、Gradle基础 1.1、Ant/Maven/Gradle对比 无论那种项目构建工具&#xff0c;都有自身的优势和劣势&#xff0c;所以选择一款最适合项目的就是最好的&#xff01; 1.2、Gradle项目目录结构 Gradle项目默认目录结构和Maven项目的目录结构一致&#xff0c;都是基于约定大于配置…

HackTheBox - Medium - Linux - Health

Health Health 是一台中型 Linux 计算机&#xff0c;在主网页上存在 SSRF 漏洞&#xff0c;可利用该漏洞访问仅在 localhost 上可用的服务。更具体地说&#xff0c;Gogs 实例只能通过 localhost 访问&#xff0c;并且此特定版本容易受到 SQL 注入攻击。由于攻击者可以与 Gogs …

关于Windows 10的操作中心 ,看这篇文章就可以了

这篇文章介绍了Windows 10操作中心&#xff0c;也称为通知中心&#xff0c;以及如何使用它。操作中心会在需要你注意的事情时发送警报。 如何在操作中心中访问和解决通知 Windows操作中心显示为Windows任务栏右下角的发言气泡。图标下的数字表示你有未解析的通知。 通知会在…

企业微信无法正常启动 报错0xc0000142

报错内容如下&#xff0c;每次打开工作电脑时候企业微信一般会正常启动&#xff0c;但是有时候经常会出现下面这种错误&#xff0c;重启也解决不了&#xff0c;每次都得重装企业微信&#xff0c;今天整理了一下网上的方法&#xff0c;这个原因大概率是亿赛通。 解决办法&#x…

递归、搜索与回溯算法(专题六:记忆化搜索)

目录 1. 什么是记忆化搜索&#xff08;例子&#xff1a;斐波那契数&#xff09; 1.1 解法一&#xff1a;递归 1.2 解法二&#xff1a;记忆化搜索 1.2.1 记忆化搜索比递归多了什么&#xff1f; 1.2.2 提出一个问题&#xff1a;什么时候要使用记忆化搜索呢&#xff1f; 1.3 …