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 不用管它。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

先进制造业数字化转型,为什么基于传统存储无法完成?

本文是 XSKY 智能存储方案助力先进制造数字化转型系列文章中的第一篇,重点分享先进制造行业数字化转型过程中,对于数据存储的需求,以及为何传统存储架构无法很好满足这些需求。 随着智能制造的发展,自动化、信息化、智能化等技术…

linux命令——fdisk分区

在linux中,一切皆文件,硬盘设备在系统中也以文件形式存在,使用fdisk命令可以查看硬盘分区信息 并非硬盘转速越快,文件读取速率越高,有一个文件存储密度的概念

数据合规官认证证书CCRC-DCO使用设计和默认数据保护处理个人数据

快来了解隐私保护工程实践!合法原则是关键,一起守护数据安全! 隐私保护工程实践需要遵循合法原则,控制者必须确保处理个人数据有明确的法律依据。在设计和默认数据保护中,相关性、差异化、特定目的、必要性和自主权是合…

在ATECLOUD测试平台测试新能源车内连接器

在测试车内连接器的温度时,需要用到直流电源和温度巡检仪,通过温度巡检仪采集连接器工作时的温度。由于用户在测试时会用到多台直流电源和温度巡检仪,并且型号不一样。因此,在用ATECLOUD测试连接器温度时,技术工程师需…

框架漏洞RCE-1

一、前提 1、命令执行漏洞:直接调用操作系统命令。攻击者构造恶意命令,将命令拼接到正常的输入中,达到恶意攻击的目的。 (1)、常见命令执行函数 PHP:exec、shell_exec、system、passthru、popen、proc_open、反引号等 ASP.N…

拉普拉斯丨独家冠名2024年度ATPV技术分论坛,助力产业科技持续创新

为了进一步促进行业技术交流,推进光伏行业发展及标准建设的进程,针对高效电池,领跑组件,新产品认证及应用等技术专题及国内外光伏标准的最新进程,由中国绿色供应链联盟光伏专委会(ECOPV)指导的2…

Java 运行的底层原理

Java是一种跨平台的编程语言,其底层原理涉及到了多个方面,包括Java虚拟机(JVM)、字节码、类加载机制、垃圾回收器等。让我们逐一深入了解Java运行的底层原理。 1. Java虚拟机(JVM) Java虚拟机是Java程序运…

Java代码基础算法练习-年龄问题-2024.05.07

数学家维纳智力早熟,11岁就上了大学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10 个数字正好包含了从0到9这10个数字&#…

Mybatis报错sql injection violation, syntax error: TODO :IDENTIFIER

今天被这个报错搞了一下午 <select id"getMmZxZffs" resultType"cn.vetech.asms.pay.service.freepwdpay.vo.ZxZffsQueryVO" parameterType"cn.vetech.asms.pay.service.freepwdpay.dto.ZxZffsQueryDTO">select t.A skFs,t.B,t.C skFsm…

建筑物健康监测:振弦式应变计的应用

随着科技的进步和建筑安全意识的提高&#xff0c;对建筑物健康状况的监测变得日益重要。振弦式应变计作为一种高精度、高灵敏度的测量工具&#xff0c;已经在建筑物健康监测中得到了广泛应用。本文将探讨如何使用振弦式应变计进行建筑物的健康监测&#xff0c;并分享一些最佳实…

安卓手机原生运行 ARM Ubuntu 24.04 桌面版(一)

本篇文章&#xff0c;聊一聊尝试让安卓手机原生运行 Ubuntu&#xff0c;尤其是运行官方未发布过的 ARM 架构的 Ubuntu 24.04 桌面版本。 写在前面 最近的几篇文章&#xff0c;都包含了比较多的实操内容、需要反复的复现验证&#xff0c;以及大量的调试过程&#xff0c;为了不…

Linux——综合实验

要求 按照上面的架构部署一个简单的web节点所有的服务器使用DNS服务器作为自己的DNS服务器 就是/etc/reslov.conf 中nameserver的值必须是途中dns服务器的地址所有的数据库都是用mysql应用 nfs共享导出在客户端(web服务器上)使用autofs在自动挂载&#xff0c;或者写入/etc/fsta…

使用 Gitea 进行私有 Git 仓库管理

在本文中&#xff0c;我们将介绍如何使用 Gitea 搭建并管理私有 Git 仓库。Gitea 是一个轻量级的 Git 服务&#xff0c;提供了类似于 GitHub 的功能&#xff0c;适合个人和小团队使用。我们将通过以下步骤来完成搭建和配置 Gitea 服务器。 步骤一&#xff1a;安装 Gitea 首先…

沉浸式的三维立体3D产品互动展示,有哪些优势?如何实现?

沉浸式的三维立体3D产品互动展示&#xff0c;可以720度旋转缩放查看产品的每一个细节&#xff0c;具有很强的交互性和逼真性&#xff0c;从品牌营销的层面来分析&#xff0c;具有以下优势&#xff1a; 首先&#xff0c;3D产品展示能够带来生动、真实的视觉冲击效果。 随着消费…

OurBMC开源大赛企业获奖队伍专访来啦!

精彩纷呈的 OurBMC 开源大赛已告一段落&#xff0c;经历为期四个月的实战&#xff0c;各个参赛队伍也积淀了丰富的实践经验与参赛心得。本期&#xff0c;社区特别邀请 OurBMC 开源大赛获奖企业团队分享「走进OurBMC开源大赛&#xff0c;共同践行开放包容、共创共赢的开源精神」…

Python下运行 XQuery 的方法

要在 Python 中运行 XQuery&#xff0c;我们可以使用一些库或工具来执行 XQuery 查询。Saxon-HE 是一个开源的 XQuery 和 XSLT 处理器&#xff0c;它是用 Java 编写的&#xff0c;并提供了 Python 绑定。你可以使用 saxonc Python 模块来调用 Saxon-HE&#xff0c;执行 XQuery …

阿赵UE引擎C++编程学习笔记——HelloWorld

大家好&#xff0c;我是阿赵。   从这一篇开始学习虚幻引擎的C编程。   学习所有编程好像都应该从HelloWorld开始&#xff0c;所以我这里也不例外。不过为了能打印出HelloWorld&#xff0c;需要做的事情还不少。不过到了能打印出HelloWorld的时候&#xff0c;我感觉学习的过…

文件夹重命名技巧:克服文件夹名混乱不规律的难题,实现高效管理

在数字时代&#xff0c;我们每天都在与无数的文件夹打交道。这些文件夹中可能存储着文档、图片、视频等各种类型的文件。然而&#xff0c;随着文件夹数量的增加&#xff0c;如何有效地管理和命名这些文件夹成为了一个挑战。混乱和不规律的文件夹名不仅降低了工作效率&#xff0…

237基于matlab的偏振态仿真

基于matlab的偏振态仿真&#xff0c;不同偏振态下光强计算。本仿真软件可以仿真波片对偏振光的相位调制过程。用户可以通过改变波片的类型&#xff0c;波片长轴与 X 轴的夹角&#xff0c;起偏器透光与 X 轴的夹角&#xff0c;检偏器透光轴与 X 轴的夹角等参数&#xff0c;来观察…

企业年中宣传的几个核心点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 过了五一小长假&#xff0c;就来到了夏天&#xff0c;在生机勃勃的春天里&#xff0c;我们定好了全年的宣传计划&#xff0c;包括要举行哪些活动&#xff0c;参加哪些展会&#xff0c;一…