这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】MPU 功能验证

共1条 1/1 1 跳转至

【S32K3XX】MPU 功能验证

高工
2025-11-02 07:37:01     打赏

【简介】

在之前的帖子中介绍了S32K3 的MPU默认配置属性(【S32K3XX】Memory 访问默认权限配置  ),在此基础上我们继续验证MPU 保护的功能,我们可以编写代码触发MPU 属性异常来验证MPU 保护功能。

【XN】权限异常验证

本地的MPU配置DPLASH 是XN = [y] 不具备代码执行的权限

image.png

本地编写如下代码触发DFLASH 上取指令操作触发MPU异常。

static int mpu_no_xn(void) {
  int r;
  int (*pF)(void);

  pF = (int(*)(void))0x10000000;
  r = pF();
     005056F4   B508        PUSH           {R3, LR}
     005056F6   F04F 5380   MOV.W          R3, #0x10000000
     005056FA   4798        BLX            R3
  return r;
}


上述代码执行后会进入hard fault 异常,异常地址显示为在0x10000000 跟本地触发异常的地址吻合。

image.png 

查看异常状态寄存器可知发生可Memory Manage 的错误,取指令出发了Memory 访问异常。

image.png

对应错误异常状态寄存器说明如下

image.png

因为本地没有使能Memory Management Fault 的异常所以会上报成Hard fault,违反MPU设定的存储器访问规则 会触发Memory Management Fault 异常,本地添加以下代码使能Memory Management Fault。

本地添加以下代码使能MM Fault

 void enable_mmfault(void)
 {
    /* Enable MemManage Fault */
    SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
 }

开启上述代码后,触发MPU的异常访问会进入到memory manager 的异常中。

image.png

【写权限异常验证】

本地的Pflash  MPU 默认属性为read only 属性

image.png

本地添加如下代码触发Pflash 写入操作触发MPU异常。

static void mpu_no_write(void) {
  volatile uint32_t *p = (uint32_t *)0x500000;
  *p = 0x12345678;
}

 

上述代码运行后会触发MM fault,并从MM fault的异常寄存器地址查看到触发异常访问的地址。

image.png



共1条 1/1 1 跳转至

回复

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