有关CH32V305RBT6芯片,中断嵌套初始化操作的一些问题请教

近期在开发过程中,尝试了中断嵌套的一些实验,有些地方感觉到有点疑惑,实验情况如下:

  1. 启动汇编文件中,CSR寄存器设定为“0x1F”,按照《QingkeV4》手册,这个是4级嵌套,硬件压栈,高优先级的中断处理函数配置为软件压栈,低优先级配置为硬件压栈。

  2. 启用“SysTick”,“Software”,“Uart1”三个中断处理函数。均设定为硬件压栈(“Software”来自RTT的汇编源代码,我看不出来是不是启用了硬件压栈)。软件有使用RT-Thread操作系统。

现在的实验结果是:

  1. NVIC_SetPriority(Software_IRQn, 0xE0);  NVIC_SetPriority(USART1_IRQn, 0x00); 时,系统正常。

  2. NVIC_SetPriority(Software_IRQn0x00);  NVIC_SetPriority(USART1_IRQn0xE0); 时,系统启动正常,但当串口中断发生之后,系统挂死。

多次修改数据实验之后,发现,只要“Software”中断的等级调高(比串口中断的优先级更高),那么系统启动正常,串口中断发生后,必定挂死。不知道是什么原因呢?可否得到一些讲解?谢谢。

您好,关于启动文件中相关CSR寄存器的描述,关于0x1f,是对0xbc0寄存器(微处理器配置寄存器)的描述,这个寄存器一般情况下不需要操作。关于中断嵌套级数,是对0x804寄存器(中断系统控制寄存器)的描述,启动文件中对该寄存器值配置为0x0b,根据寄存器对应位,即4级嵌套,使能中断嵌套和硬件压栈。如下图1。V305是V4F内核的,最大支持8级中断嵌套。若是使用了RT-Thread,具体看一下对mstatus寄存器的配置,可以判断配置是在机器模式下还是用户模式下,若机器模式下,则使用软件压栈。中断函数注意要加中断声明。若方便,可将测试工程发至我的邮箱(lzs@wch.cn)具体看一下。

image.png

图1



感谢,测试工程已发邮箱。

  1. 根据答复的指导,发现我将0x804配置成0x1F是不妥的,配成0x1b才符合想设定成4级嵌套的本意。

  2. RT-Thread中,“Software”中断应该用于任务切换,其中有操作mstatus的汇编,似乎修改为0x7800,再进行恢复。

现在的表现来看,似乎“Software”这个中断的优先级只能放置成最低优先级,系统才正常,不知何故。


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