CH32V307 異常處理

環(huán)境:MounRiver Studio??v1.91

開發(fā)板: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 改成機(jī)器模式(原來是 0x6088):


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


用MRS Download,會有 mcause 00000001

image.png

image.png


用開發(fā)板上的開關(guān) reset或拔掉電源,結(jié)果不相同:

image.png

image.png

試了 Debug,啟動的時候就有 mcause = 2

image.png

是不是需要自己清零 mcause ?

您好,關(guān)于異常原因寄存器mcause以及異常值寄存器mtval寄存器,這兩個寄存器在沒有異常或中斷產(chǎn)生的情況下,這兩個寄存器的值是沒有意義的。mcause指示的都是上一次的值,觸發(fā)中斷或異常后,mcause的值會更新。你可在程序中加個中斷試一下,其值就是固定的了。后續(xù)若有問題,可郵箱(lzs@wch.cn)和我溝通。



謝謝答復(fù)。


因?yàn)槲覀兊拇a是在 machine mode 下跑的,有部分的代碼會用 mcause 判斷是不是在中斷里被調(diào)用了,所以啟動就報錯。


在 handle_reset 里清零 mcause 就沒問題了。


請問有其他方法來判斷當(dāng)前是不是在中斷里?


您好,可以通過PFIC中斷全局狀態(tài)寄存器來判斷當(dāng)前是否有中斷在被執(zhí)行,如下圖

image.png


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频