CH32V307 异常处理

环境:MounRiver Studio  v1.91

开发板:CH32V307V-EVT-R0


代码:基于用串口打印 mcause 和 mtval

#include "debug.h"
#include "core_riscv.h"


int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(115200);	
	printf("SystemClk:%d\r\n",SystemCoreClock);
	printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

	while(1)
    {
	    printf("mcause %08x\r\n", __get_MCAUSE());
	    printf("mtval  %08x\r\n", __get_MTVAL());
	    Delay_Ms(500);
	}
}

为了能读取 mcause 和 mtval, 在 startup_ch32v30x_D8.S 改成机器模式(原来是 0x6088):


/* Enable floating point and interrupt */
    li t0, 0x7888
    csrs mstatus, t0


用MRS Download,会有 mcause 00000001

image.png

image.png


用开发板上的开关 reset或拔掉电源,结果不相同:

image.png

image.png

试了 Debug,启动的时候就有 mcause = 2

image.png

是不是需要自己清零 mcause ?

您好,关于异常原因寄存器mcause以及异常值寄存器mtval寄存器,这两个寄存器在没有异常或中断产生的情况下,这两个寄存器的值是没有意义的。mcause指示的都是上一次的值,触发中断或异常后,mcause的值会更新。你可在程序中加个中断试一下,其值就是固定的了。后续若有问题,可邮箱(lzs@wch.cn)和我沟通。



谢谢答复。


因为我们的代码是在 machine mode 下跑的,有部分的代码会用 mcause 判断是不是在中断里被调用了,所以启动就报错。


在 handle_reset 里清零 mcause 就没问题了。


请问有其他方法来判断当前是不是在中断里?


您好,可以通过PFIC中断全局状态寄存器来判断当前是否有中断在被执行,如下图

image.png


只有登录才能回复,可以选择微信账号登录