这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】MCM FPU 异常状态检测

共2条 1/1 1 跳转至

【S32K3XX】MCM FPU 异常状态检测

高工
2026-03-24 08:44:16     打赏

【简介】

我们在上一篇介绍了MCM 模块的local memeory 信息获取(【S32K3XX】MCM 获取 CPU Local Memory 信息),MCU的另一个功能特性时FPU异常状态的监测。可以监测的FPU的异常状态如下:

image.png

上述的FPU 的异常状态监测寄存器设计上都有对应的状态使能位,软件设置上只要开启对应的功能即可。

image.png


软件通过配置该寄存器打开这些功能即可

    mcm->ISCR |= MCM_CM7_ISCR_FIDCE_MASK | 
                 MCM_CM7_ISCR_FIXCE_MASK |
                 MCM_CM7_ISCR_FUFCE_MASK |
                 MCM_CM7_ISCR_FOFCE_MASK |
                 MCM_CM7_ISCR_FDZCE_MASK |
                 MCM_CM7_ISCR_FIOCE_MASK |
                 MCM_CM7_ISCR_WABE_MASK; /* Interrupt Status and Control */

NVIC 中断控制器端使能MCM 的中断配置。

image.png

在中断函数内添加FPU异常状态打印,并添加测试代码触发FPU的除0错误验证FPU异常监测功能。

void MCM_IRQHandler(void)
{
#if defined(CORE0)
    MCM_CM7_Type * mcm = IP_MCM_0_CM7;
#elif defined(CORE1)
    MCM_CM7_Type * mcm = IP_MCM_1_CM7;
#else
    #error "No valid MCM instance defined!"
#endif
    uint32_t isr = mcm->ISCR;
    LOG_E("MCM error interrupt triggered! ISR: %08lX", isr);
   
    if(mcm->ISCR & MCM_CM7_ISCR_FDZC_MASK)
    {
        LOG_E("MCM fault: FPU divide-by-zero");
        mcm->ISCR &= ~MCM_CM7_ISCR_FDZCE_MASK; /* Disable the fault */
    }
}

unsigned int mcm(char argc, char **argv)
{
#if defined(CORE0)
    MCM_CM7_Type * mcm = IP_MCM_0_CM7;
#elif defined(CORE1)
    MCM_CM7_Type * mcm = IP_MCM_1_CM7;
#else
    #error "No valid MCM instance defined!"
#endif
    if(argc == 2 && strcmp(argv[1],"fpu") == 0)
    {
        LOG_I("%f", 1.0f/0.0f );/* Trigger FPU divide-by-zero exception */
    }
    return 0;
}


测试代码运行结果如下,异常事件已经按照预期的被检测到

image.png

从手册的描述也可以知道对应的状态寄存器来自于FPU 的FPSCR->DZC状态的清除需要通过FPU来清除。

image.png

查看FPSCR->DZC 状态也是被设置状态。

image.png

   


           


院士
2026-03-26 18:25:15     打赏
2楼

做笔记,坚持分享,积累经验

楼主真棒


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]