【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.hqwc.cn/news/410238.html

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

相关文章

软件测试卷王的自述,我难道真的很卷吗?

前言 转眼就到了2024年了,工作这几年我的薪资也从12k涨到了18k,对于工作只有3年多的我来说,还是比较满意的,毕竟一些工作4、5年的可能还没我高。 我可能就是大家说的卷王,感觉自己年轻,所以从早干到晚&am…

龙蜥操作系统上安装MySQL:步骤详解与常见问题解决

目录 博客前言 一.下载MySQL 1.官网下载 2.上传文件到龙蜥操作系统中 ​编辑二.安装MySQL 1.检查操作系统中的默认数据库并移除 2.创建文件夹解压 3.开始安装 4.启动服务 ​编辑 5.登录修改密码,进行授权 三.第三方工具连接(naviact&#xff…

计算机三级(网络技术)——应用题

第一题 61.输出端口S0 (直接连接) RG的输出端口S0与RE的S1接口直接相连构成一个互联网段 对172.0.147.194和172.0.147.193 进行聚合 前三段相同,将第四段分别转换成二进制 11000001 11000010 前6位相同,加上前面三段 共30…

网络安全中的“三高一弱”和“两高一弱”是什么?

大家在一些网络安全检查中,可能经常会遇到“三高一弱”这个说法。那么,三高一弱指的是什么呢? 三高:高危漏洞、高危端口、高风险外连 一弱:弱口令 一共是4个网络安全风险,其中的“高危漏洞、高危端口、弱…

Qt6入门教程 8:信号和槽机制(连接方式)

目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 一.一个信号与槽连接…

vscode(visual studio code) 免密登陆服务器

1.生成密钥 首先,在本地,打开命令输入框: WinR–>弹出输入框,输入cmd,打开命令框。 然后,在命令框,输入 ssh-keygen -t rsa -C "love"按两次回车键,问你是否重写,选择…

城建档案数字化怎么做?

城建档案数字化的关键是整理、扫描、标注、管理和安全性管理,通过建立适当的系统和流程,可以实现城建档案的数字化管理和应用。 城建档案数字化的具体步骤可以分为以下几个方面: 1. 档案整理与分类:首先需要将城建档案进行整理和分…

无需任何三方库,在 Next.js 项目在线预览 PDF 文件

前言: 之前在使用Vue和其它框架的时候,预览 PDF 都是使用的 PDFObject 这个库,步骤是:下载依赖,然后手动封装一个 PDF 预览组件,这个组件接收本地或在线的pdf地址,然后在页面中使用组件的车时候…

本地一键部署grafana+prometheus

本地k8s集群内一键部署grafanaprometheus 说明: 此一键部署grafanaPrometheus已包含: victoria-metrics 存储prometheus-servergrafanaprometheus-kube-state-metricsprometheus-node-exporterblackbox-exporter grafana内已导入基础的dashboard【7个…

贪心算法-活动安排-最详细注释解析

贪心算法-活动安排-最详细注释解析 题目: 学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使用。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用…

class_7: C++引用

//1、引用是给变量取别名&#xff0c;定义的时候必须初始化&#xff0c;且指向一个确定的内存空间&#xff1b; //2、引用实质是指针常量&#xff0c;值可以改变&#xff0c;地址不可改变&#xff0c;即不可重复赋值#include <iostream> using namespace std;//1、引用是…

设计模式之六大设计原则

3.1 设计原则概述 古人云: 有道无术,术可求.有术无道,止于术. 而设计模式通常需要遵循一些设计原则&#xff0c;在设计原则的基础之上衍生出了各种各样的设计模式。设计原则是设计要求&#xff0c;设计模式是设计方案&#xff0c;使用设计模式的代码则是具体的实现。 设计模式中…