网站上的动态背景怎么做的,株洲外贸网站建设,江苏润通市政建设工程有限公司网站,预付网站建设费用怎么做分录参考: CH32V 系列 MCU IAP 升级跳转方法 CH32V103 的 IAP 问题#xff08;跳转及中断向量表重定位#xff09; 1. 沁恒的RISC-V内核MCU的IAP跳转示例程序简要分析 
沁恒的RISC-V内核的MCU比如CH32V203、CH32V307等系列的EVT包中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寄存器值为0x6088MPP位配置为了用户模式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(value1){__asm(li  a6, 0x5000);__asm(jr  a6);}else if (value2){__asm(li  a6, 0x6000);__asm(jr  a6);}else if (value3){__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_APPaddr就可以灵活指定要跳转到的APP入口地址了。 
3.1. 简单测试 
这里我使用了Ymodem协议通过串口发送APP固件给bootloader固件接收保存在MCU中的flash后更新APP入口地址这个全局变量 jump_app_address值为0x7800实际为FLASH中的0x080000000x7800的地址在软件中断中跳转到偏移地址0x7800即可。 不用像ARM单片机那样考虑中断向量表的重新映射因为CH32V在默认的LD 文件里设置 FLASH 起始地址后中断向量会自动偏移IAP 不用管它。