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

CH32V 系列 MCU IAP 使用函数形式通过传参形式灵活指定APP跳转地址

参考:
CH32V 系列 MCU IAP 升级跳转方法
CH32V103 的 IAP 问题(跳转及中断向量表重定位)

1. 沁恒的RISC-V内核MCU的IAP跳转示例程序简要分析

沁恒的RISC-V内核的MCU比如CH32V203、CH32V307等系列的EVT包中IAP升级的示例程序中都是通过使能软件中断之后,在 SW_Handler 函数中进行 APP 地址的跳转,如下图指定了 0x5000 的偏移地址去跳转,实际是为0x08000000 + 0x5000的地址,只不过在 LD 文件里设置了APP的 FLASH 起始地址后中断向量会自动偏移,IAP 不用管它。
在这里插入图片描述
在这里插入图片描述
这种方法是通过使能软件中断,使内核自动从用户模式进入机器模式后,进行的跳转,该方式无需配置工程在机器模式下,无需修改启动文件中 mstatus 寄存器的值。但是是写死的跳转地址,不够灵活。参见**QingKeV4_Processor_Manual.PDF**中

1.1 mstatus描述

在这里插入图片描述
在默认的启动文件中可以看到mstatus寄存器值为0x6088,MPP位配置为了用户模式,MPIE和MIE使能。
在这里插入图片描述
在这里插入图片描述

2. 直接在 IAP 程序中需跳转位置直接进行跳转

重点参考: CH32V 系列 MCU IAP 升级跳转方法

但某些情况下,软件中断函数需用做他用,或用户不想通过中断进行跳转,可直接在 IAP 程序中需跳转位置直接进行跳转。当不通过中断直接进行跳转时,需要配置工程在机器模式下,需要修改 mstatus 寄存器的值。

mstatus 寄存器为机器模式状态寄存器,通过该寄存器可配置 MCU 运行在机器模式或用户模式下。此外,对于支持浮点运算的
MCU,通过该寄存器可开启或关闭浮点运算功能。关于该寄存器的具体介绍,可参考各 MCU 对应的青稞手册,具体可在沁恒官网搜索下载。

CH32V103 机器模式下配置 mstatus 的值为:0x1888

CH32V307 机器模式下配置 mstatus 的值为:0x7888

方式 1:

跳转函数按照下方式编写,注意此处一定要使用 a0,需要加__attribute__((noinline)),具体如下:

__attribute__((noinline))
void jump_APP(uint32_t  addr)
{__asm("jr  a0");while(1);
}

入参addr实际保存在寄存器a0中,通过jr a0跳转到addr地址中。
在这里插入图片描述

方式2:

void jump_APP(uint32_t  addr)
{__asm volatile("jr %0": :"r"(addr));while(1);
}

使用方法与方式 1 一致,直接在程序调用即可,这里同样注意,是相对的偏移地址,即 0x08000000 + addr 的地址

方式3:

void jump_APP(uint8_t  value)
{if(value==1){__asm("li  a6, 0x5000");__asm("jr  a6");}else if (value==2){__asm("li  a6, 0x6000");__asm("jr  a6");}else if (value==3){__asm("li  a6, 0x7000");__asm("jr  a6");}else{__asm("li  a6, 0x8000");__asm("jr  a6");}while(1);
}

这种其实和EVT中的IAP没啥区别,都是写死的地址跳转,不像方式2那种可以灵活制定地址进行跳转。

3. 利用软件中断+jump_APP(addr)使用

/********************************************************************** @fn      SW_Handler** @brief   This function handles Software exception.** @return  none*/
// 这里的addr是相对0x08000000的偏移地址
void jump_APP(uint32_t addr)
{__asm volatile("jr %0": :"r"(addr));while(1);
}void SW_Handler(void)
{
//    假设要跳转到的APP地址为 0x08005000
//    jump_app_address = 0x08005000 - 0x08000000 = 0x5000;jump_APP(jump_app_address);
}

如上所示,进入软件中断中,使用jump_APP(addr)就可以灵活指定要跳转到的APP入口地址了。

3.1. 简单测试

这里我使用了Ymodem协议通过串口发送APP固件给bootloader,固件接收保存在MCU中的flash后,更新APP入口地址这个全局变量 jump_app_address值为0x7800,实际为FLASH中的0x08000000+0x7800的地址,在软件中断中跳转到偏移地址0x7800即可。
不用像ARM单片机那样考虑中断向量表的重新映射,因为CH32V在默认的LD 文件里设置 FLASH 起始地址后中断向量会自动偏移,IAP 不用管它。
在这里插入图片描述

相关文章:

CH32V 系列 MCU IAP 使用函数形式通过传参形式灵活指定APP跳转地址

参考: CH32V 系列 MCU IAP 升级跳转方法 CH32V103 的 IAP 问题(跳转及中断向量表重定位) 1. 沁恒的RISC-V内核MCU的IAP跳转示例程序简要分析 沁恒的RISC-V内核的MCU比如CH32V203、CH32V307等系列的EVT包中IAP升级的示例程序中都是通过使能软件中断之后&…...

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广,还是国外的餐厅运营、参加国际展会,或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码,你都可以在QR Tiger去制作您需要的二维码! 一、认识QR Tiger 二…...

ComfyUI 基础教程(十三):ComfyUI-Impact-Pack 面部修复

SD的WebUI 中的面部修复神器 ADetailer,无法在ComfyUI 中使用。那么如何在ComfyUI中进行面部处理呢?ComfyUI 中也有几个面部修复功能,比如ComfyUI Impact Pack(FaceDetailer),以及换脸插件Reactor和IPAdapter。 ComfyUI-Impact-Pack 是一个功能强大的插件,专为 ComfyUI …...

专题五_位运算(2)

目录 面试题 01.01. 判定字符是否唯一 解析 题解 268. 丢失的数字 解析 题解 371. 两整数之和 解析 题解 面试题 01.01. 判定字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode) 解析 题解 class Solution { public:bool isUnique…...

ZCC5503 18V 1A 6uA低静态功耗 同步降压控制器

1. 概要 ZCC5503R 是一款基准电压源、振荡电路、 比较器 PWM/PFM 控制器构成的 CMOS 降压电路调整器,利用 PWM/PFM 自动切换控制电路达到可调占空比,具有全输入电压范围(3~18V )内的低纹波、高效率及大电流输出等特点. 2. 产…...

python操作minio中常见错误

因为我参考minio的文档操作,当时文档并不是很详细,这篇博文会统一记录自己所遇到的问题。以下的每个标题都是具体的错误信息。 minio-py文档 错误1:SSL: WRONG_VERSION_NUMBER 这个错误的原因是在创建minio的客户端时候没有关闭SSL,请使用如…...

SpringCloud-Seata分布式事务的环境搭建搭建

目录 一、版本说明 二、建立Seata Server数据库(TC-带头大哥的数据库) 三、业务库建表 四、安装Seata-Server 4.1 虚拟机里新建一个/opt/seate/seata-server文件夹,在seate文件夹下新建一个docker-compose.yml 文件 4.2 运行容器 4.3 在na…...

ChatGPT4 Turbo 如何升级体验?官网如何使用最新版GPT-4 Turbo?

本文会教大家如何教大家升级自己的GPT4到GPT4 Turbo,同时检验自己的GPT4 Turbo是否是最新版本的GPT-4-Turbo-2024-04-09 说明 新版GPT-4 Turbo再次重夺大模型排行榜王座,超越了Claude 3 Opus。 最新版本的GPT-4 Turbo被命名为GPT-4-Turbo-2024-04-09。…...

如何利用工作流自定义一个AI智能体

选择平台 目前已经有不少大模型平台都提供自定义智能体的功能,比如 百度的文心 https://agents.baidu.com/ 阿里的百炼平台 https://bailian.console.aliyun.com/。 今天再来介绍一个平台扣子(https://www.coze.cn/),扣子是…...

嵌入式学习day12

每日面试题 static 关键字在 全局变量、局部变量、函数的区别? ①全局变量static:改变作用域,改变(限制)其使用范围。 只初始化一次,防止在其他文件单元中被引用。全局变量的作用域是整个源程序&#xff…...

【Leetcode 42】 接雨水-单调栈解法

基础思路: 维持栈单调递减,一旦出现元素大于栈顶元素,就可以计算雨水量,同时填坑(弹出栈顶元素) 需要注意: 单调栈通常保存的是下标,用于计算距离 public static int trap2(int[…...

Python 贪吃蛇

文章目录 效果图:项目目录结构main.pygame/apple.pygame/base.pygame/snake.pyconstant.py 效果图: 项目目录结构 main.py from snake.game.apple import Apple # 导入苹果类 from snake.game.base import * # 导入游戏基类 from snake.game.snake im…...

计算机网络 2.4差错检验与校正

第四节 差错检验与校正 一、认识检验与校正 1.差错形成原因 内部因素(随机错):噪声脉冲、脉动噪声、衰减、延迟失真等。 外部因素(突发错):电磁干扰、太阳噪声、工业噪声等。 2.差错控制编码分类&#…...

uniapp遍历数组对象的常见方法

在 UniApp 中,遍历数组对象的方法与在普通 JavaScript 中是相同的。UniApp 是一个使用 Vue.js 开发所有前端应用的框架,因此你可以使用 Vue.js 和 JavaScript 的语法来遍历数组对象。 以下是一些常见的遍历数组对象的方法: 使用 for 循环 …...

Milvus向量数据库(一)Milvus存储byte[]类型源向量数据

两种路线&#xff1a; 第一种是把byte[]转换为List< float >&#xff0c;然后存储到Milvus的floatVector中第二种是把byte[]转换为ByteBuffer&#xff0c;然后存储到Milvus的BinaryVector中 步骤&#xff1a; 我先用的是第一种&#xff0c;但是在转换float过程中&…...

Jupyter Notebook魔术命令

Jupyter Notebook是一个基于网页的交互式笔记本&#xff0c;支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实现代码&#xff0c;数学方程&#xff0c;可视化和markdown。用途包括&#xff1a;数据…...

python基础---生成器

生成器 这个老师的课 这个老师的网页 获取系列有规律但是个数不确定的数据 使用迭代器的时候可以使用一个不会产生异常的迭代器, 实际记录的是生成的数据的方式, 不是实际的数据 使用迭代器的时候这一个规则的改变不方便, 需要加一个专门的方法 还有就是如果需要大量的数据,…...

wangEditor 富文本详解

前言&#xff1a;wangEditor 官网 。本文档讲解 wangEditor 在 vue3 中的使用。 一&#xff1a;快速开始 1. 安装 需要安装 wangeditor/editor、wangeditor/editor-for-vuenext 两个依赖 # 安装 editor npm install wangeditor/editor # or yarn add wangeditor/editor # o…...

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测

Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…...

Java多线程:常见的线程的创建方法及Thread类详解

目录 一.并发编程相关概念 线程与进程 多线程 Java中线程的状态 二.线程的创建方法 方法一&#xff1a;继承Thread类 方法二&#xff1a;实现Runnable接口 其他方法 三.Thread类详解 Thread常见构造方法 Thread常见属性 Thread常见方法 start() 与 run() sleep(…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...