K64 MPU问题:为什么在设置K64的MPU的RGD0的时候会出现总线错误的问题:
流程如下:
SYSMPU_Init()//配置MPU,传入的参数只设置REGION 1 ,不设置REGION 0。REGION 0值为默认值。
EnableBusFaultIrq() //使能总线错误中断
(*(volatile unsigned int*)0x4000D40C) = 0 //这里会出现“总线错误”异常
SYSMPU->WORD[0][1] = 0xFFFFFFFF; //这里也会出现“总线错误”异常
请问这个是什么原因?
谢谢!
你好,
请提供完整的工程软件,我可以在FRDM-K64板子测试一下,看看能否复现这个问题。
谢谢。
Have a great day,
Mike
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
您好:多谢您的答复!
工程在附件中,该工程是SDK中的 SDK_2.3.0_FRDM-K64F\boards\frdmk64f\driver_examples\sysmpu的工程,没有太多修改。
在main函数的下面这个位置会进入总线错误的异常:
// (*(volatile unsigned int*)0x4000D40C) = 0;
SYSMPU->WORD[0][1] = 0xFFFFFFFF;
另外关于MPU有几个问题咨询一下:
(1)MPU的重叠的Regoin地址保护的问题:如果地址处于Regoin A和Regoin B中,RegoinA不允许访问,RegoinB允许访问;那最终的结果是运行访问的?(这是我测试的结果)
(2)Regoin 0是不是有什么特殊性?其默认是运行全地址可读写的,那如果有2个Regoin(1 和 2 ),如果只是想Regoin 1中禁止访问生效,也要把Regoin 0设置成禁止的才行?这样Regoin 1和Regoin 2未覆盖到的区域就无法访问了?
谢谢!
Hi,
抱歉回复晚了。
K64的手册里面有下列描述:
所以通过代码(core)来改变RGD0相关寄存器值时,系统会产生异常。
MPU重叠区域的保护采用“或”逻辑,只要有一个RGD保护了,这块重叠区域访问就会受到限制。
best regards,
Mike
多谢你的解释,已经解惑了!
再次感谢!