当前位置: 首页 > news >正文

GD32 IAP升级——boot和app相互切换

GD32 IAP升级——boot和app相互切换

目录

  • GD32 IAP升级——boot和app相互切换
    • 1 Keil工程设置
      • 1.1 修改ROM
      • 1.2 Keil烧录配置
    • 2 代码编写
      • 2.1 app跳转
      • 2.2 软件重启
      • 2.3 app中断向量表偏移
    • 结束语

1 Keil工程设置

1.1 修改ROM

GD32内部Flash是一整块连续的内存,但是因为要分成boot和app,因此我们的boot工程和app工程要分别设置代码存放的地址。

举个例子:我这里用的是GD32E50x,内存大小为512k,我把前面16k作为boot分区,后面的496k作为app分区。那么Keil的ROM的配置如下:

分区起始地址大小
boot0x80000000x04000
app0x80040000x7C000

keil配置如下图:
boot工程配置:
在这里插入图片描述
app工程配置:
在这里插入图片描述

1.2 Keil烧录配置

如果需要使用Keil一键烧录的话,要先修改一下烧录的配置,具体根据自己boot和app的分区来设置。
boot配置参考:
在这里插入图片描述

app配置参考:
在这里插入图片描述

2 代码编写

2.1 app跳转

从boot跳转到app的代码参考:

app_func application;
uint32_t app_address;void jump_to_app(uint32_t app_load_addr)
{if (((*(__IO uint32_t*)app_load_addr) & 0x2FFE0000U) == 0x20000000U) {app_address = *(__IO uint32_t*) (app_load_addr + 4U);application = (app_func) app_address;/* initialize user application's stack pointer */__set_MSP(*(__IO uint32_t*) app_load_addr);/* jump to user application */application();}
}

完整用法示例:

#include "main.h"#define APP_LOADED_ADDR    0x08004000Uapp_func application;
uint32_t app_address;void jump_to_app(uint32_t app_load_addr)
{if (((*(__IO uint32_t*)app_load_addr) & 0x2FFE0000U) == 0x20000000U) {app_address = *(__IO uint32_t*) (app_load_addr + 4U);application = (app_func) app_address;/* initialize user application's stack pointer */__set_MSP(*(__IO uint32_t*) app_load_addr);/* jump to user application */application();}
}int main(void)
{systick_config();jump_to_app(APP_LOADED_ADDR);while(1){}
}

2.2 软件重启

在app运行期间,如果需要重新进入boot,可以通过软件重启实现,参考代码如下:

NVIC_SystemReset();

NVIC_SystemReset()函数原形如下:

/**\brief   System Reset\details Initiates a system reset request to reset the MCU.*/
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
{__DSB();                                                          /* Ensure all outstanding memory accesses includedbuffered write are completed before reset */SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */__DSB();                                                          /* Ensure completion of memory access */for(;;)                                                           /* wait until reset */{__NOP();}
}

2.3 app中断向量表偏移

GD32的Flash存放了程序固件,默认从0x08000000开始启动,前面的部分是中断向量表,在做了boot和app的区分后,从0x08000000开始运行的是boot的中断向量,它在跳转到app以后就失效了,因此需要重新映射app的中断向量表。
做法是在app的程序里面,修改中断向量表偏移,如下:

#define VECT_TAB_OFFSET  (uint32_t)0x4000            /* vector table base offset */

注:上述代码在system_gd32e50x.c里面定义,具体偏移多少取决于你app分区的起始地址,计算方法是:偏移 = app起始地址 - 0x08000000。

结束语

好了,关于GD32如何切换boot和app就讲到这里,有什么问题欢迎评论区留言。

相关文章:

GD32 IAP升级——boot和app相互切换

GD32 IAP升级——boot和app相互切换 目录 GD32 IAP升级——boot和app相互切换1 Keil工程设置1.1 修改ROM1.2 Keil烧录配置 2 代码编写2.1 app跳转2.2 软件重启2.3 app中断向量表偏移 结束语 1 Keil工程设置 1.1 修改ROM GD32内部Flash是一整块连续的内存&#xff0c;但是因为…...

C++11革新之旅:探索C++编程的无限可能

C11革新之旅&#xff1a;探索C编程的无限可能 C11&#xff0c;作为C语言的一个重要标准&#xff0c;为C编程带来了革命性的变革。它不仅引入了众多新特性和改进&#xff0c;还极大地增强了C的表达能力、提高了程序的性能和资源利用率。本文将从多个方面深入探讨C11的新特性&am…...

免费自动化AI视频剪辑工具

下载地址&#xff1a;https://pan.quark.cn/s/3c5995da512e FunClip是一款完全开源、本地部署的自动化视频剪辑工具&#xff0c;通过调用阿里巴巴通义实验室开源的FunASR Paraformer系列模型进行视频的语音识别&#xff0c;随后用户可以自由选择识别结果中的文本片段或说话人&a…...

Linux中安装C#的.net,创建运行后端或控制台项目

安装脚本命令&#xff1a; 创建一个sh文件并将该文件更改权限运行 sudo apt update wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get upd…...

最长上升子序列LIS(一般+优化)

1. 题目 题目链接&#xff1a; B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 输入样例&#xff1a; 6 1 2 4 1 3 4 输出样例&#xff1a; 4 说明/提示&#xff1a; 分别取出 1、2、3、4 即可。 2. 具体实现 2.1 一般做法 dp[i]表示第i个位置的…...

【Python系列】Python 协程:并发编程的新篇章

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

详解C/C++输入输出

前言 C/C输入输出很多&#xff0c;在不同的情况会用不同的输入输出&#xff0c;有的题目在输入时可能换一种输入输出就能不会TLE&#xff0c;有的输入可能要循环输入&#xff0c;但是可以换一种输入直接就能把所有数据输入进去。C/C有哪些常用的输入输出&#xff0c;在什么时候…...

AI人工智能开发环境配置

AI人工智能 为什么使用Python来开发AI 人工智能被认为是未来的趋势技术。 已经有了许多应用程序。 因此&#xff0c;许多公司和研究人员都对此感兴趣。 但是这里出现的主要问题是&#xff0c;在哪种编程语言中可以开发这些 AI 应用程序&#xff1f; 有各种编程语言&#xff0c…...

Tomcat 8.5 下载、安装、启动及各种问题

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容主要介绍 Tomcat 8 的安装&#xff0c;以及可能会遇到的问题 文章目录 1. Tomcat 安装2. 可能会遇到的问题2.…...

Harbor系列之5:复制管理

Harbor的镜像复制功能 Harbor 提供镜像复制功能&#xff0c;允许用户以推送和拉取方式在不同 Harbor 仓库之间&#xff0c;以及 Harbor 与非 Harbor 仓库间&#xff08;如Alibaba ACR、Quay、Aws ECR、Azu热ACR、Docker Registry、Docker Hub等&#xff09;复制 image、chart …...

V.PS德国VPS详细测评

V.PS的德国机房位于法兰克福&#xff0c;默认接入电信CN2 GIA、联通CUII网络&#xff0c;针对中国大陆进行路由优化处理的。而且是强制移动走联通的CUII链路&#xff0c;确保三网都处在轻负载的网络环境下。 CPU是Intel Xeon Gold 6133 &#xff0c;启用了BBR&#xff0c;归属德…...

【Vue3】组件通信之自定义事件

【Vue3】组件通信之自定义事件 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋…...

[CTF]-PWN:ORW题型综合解析

经典ORW&#xff1a; 例题&#xff08;极客大挑战 2019 Not Bad&#xff09;&#xff1a; 这里使用mmap函数创造了一个内存映射区域 从地址0x123000开始&#xff0c;大小位0x1000 权限为可写可执行&#xff08;可读0x1&#xff0c;可写0x2&#xff0c;可执行0x3&#xff09;…...

VSCode中yarn的安装和使用

VSCode只要是做前端的&#xff0c;大家都不陌生&#xff0c;就不讲其使用了。 Yarn是一款高效、可靠的JavaScript包管理器&#xff0c;与NPM类似&#xff0c;但有其独特的优势&#xff0c;如更高效的安装速度、更好的依赖管理等 要在VSCode中使用Yarn&#xff0c;‌需要按照以…...

Java后端面试复习7.23

进程和线程线程优先级线程状态线程构造方式三种推荐用哪种为什么线程中断调用什么方法&#xff0c;本线程怎检查为什么线程不应强制停止线程通信方式四种ThreadLocalFUtureTask线程礼让终止线程的另一个缺陷&#xff08;锁&#xff09;守护线程什么时候设置为守护县城sleep&…...

Arduino PID库 (2) –微分导致的过冲

Arduino PID库 &#xff08;2&#xff09; – Derivative Kick 参考&#xff1a;手把手教你看懂并理解Arduino PID控制库——微分冲击 pid内容索引-CSDN博客 Arduino PID库 &#xff08;1&#xff09;– 简介 问题 此修改将稍微调整derivative term。目标是消除一种称为“…...

基于强化学习算法玩CartPole游戏

什么事CartPole游戏 CartPole&#xff08;也称为倒立摆问题&#xff09;是一个经典的控制理论和强化学习的基础问题&#xff0c;通常用于测试和验证控制算法的性能。具体来说&#xff0c;它是一个简单的物理模拟问题&#xff0c;其目标是通过在一个平衡杆&#xff08;倒立摆&a…...

uniapp0基础编写安卓原生插件和调用第三方jar包(Ch34的jar包)和如何解决android 如何Application初始化

前言 我假设你会uniapp安卓插件开发了,如果不会请看这篇文章,这篇文章是0基础教学。 这篇文章我们将讲一下如何使用CH34XUARTDriver.jar进行开发成uniapp插件。 它的难点是:uniapp如何Application初始化第三方jar包 先去官网下载CH340/CH341的USB转串口安卓免驱应用库:h…...

使用Leaflet进行船舶航行警告区域绘制实战

目录 前言 一、坐标格式转换 1、数据初认识 2、将区域分割成多个点 3、数据转换 4、数据转换调用 二、WebGIS展示空间位置信息 1、定义底图 2、Polygon的可视化 3、实际效果 三、总结 前言 通常而言&#xff0c;海事部门如海事局&#xff0c;通常会在所述的管辖区域内…...

用Ollama 和 Open WebUI本地部署Llama 3.1 8B

说明&#xff1a; 本人运行环境windows11 N卡6G显存。部署Llama3.1 8B 简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它允许用户在自己的硬件环境中轻松部署和使用大规模预训练模型。Ollama 的主要功能是在Docker容器内部署和管理大型语言模型&#xff08;LLM&…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...