关于 MPU s32k144 的问题 我有一个关于 MPU 的问题。在有关 MPU 的 S32K144 演示中,按下按钮后另一个指示灯将亮起,然后端口 0 的错误寄存器将捕获错误信息。我的问题是为什么端口 2 的错误寄存器也会捕获这些信息。我访问的地址不是 FLASH 地址吗?为什么 SRAM_L 的这个端口会出现这种错误? Re: A Question about MPU s32k144 是的,这是 MPU 演示中的预期行为。按下按钮会触发信号访问违规,该违规记录在错误寄存器中,并由第二个 LED 指示。 Re: A Question about MPU s32k144 /* * 版权所有 2020 NXP * 保留所有权利。 * * 恩智浦机密。本软件由恩智浦所有或控制,只能 * 严格按照适用的许可条款使用。通过明确 * 接受此类条款,或通过下载、安装、激活和/或以其他方式 * 使用本软件,即表示您已阅读并同意 * 遵守此类许可条款,并受其约束。如果您不同意接受 * 适用许可条款的约束,则不得保留、安装、 * 激活或以其他方式使用本软件。本软件明确授予 * 第 2.3 节中的生产使用许可。 */ /* ################################################################### ** Filename : main.c ** Project : mpu_memory_protection_s32k144 ** Processor : s32k144 ** Abstract : ** Main module. ** This module contains user's application code. ** Settings : ** Contents : ** No public methods ** ** ###################################################################*/ /*! ** @file main.c ** @brief ** 主要模块。 ** 该模块包含用户的应用程序代码。 */ /*! ** @addtogroup main_module main 模块文档 ** @{ */ /* MODULE main */ /* 包括必要的配置文件。*/ #include"sdk_project_config.h" volatile int exit_code = 0; /* 用户包括 */ /* 本示例默认情况下与 EVB 一起工作。要将其与其他板一起使用, 请注释以下行 */ #define EVB #ifdef EVB #define ON 0U /* LED ON */ #define OFF 1U /* LED OFF */ #define LED_GPIO PTD /* LED GPIO 类型 */ #define LED_RED 15U /* 引脚 PTD15 - DEV- KIT 上的 LED RGB */ #define LED_GREEN 16U /* 引脚 PTD16 - DEV-KIT 上的 LED RGB */ #define SW_GPIO PTC /* SW GPIO 类型 */KIT */ #define LED_GREEN 16U /* 引脚 PTD16 - DEV-KIT 上的 LED RGB */ #define SW_GPIO PTC /* SW GPIO 类型 */ #define SW 12U /* 引脚 PTC12 - DEV- 上的 SW2_BTN0 */ #else define LED_GREEN 16U /* 引脚 PTD16 - DEV-KIT 上的 LED RGBKIT */ #else #define ON 0U /* LED ON */ #define OFF 1U /* LED OFF */ #define LED_GPIO PTC /* LED GPIO 类型 */ #define LED_RED 0U /* 引脚 PTC0 - 主板上的 LED0 */ #define SW 12U /* 引脚 PTC12 - DEV- 上的 SW2_BTN0主板上的 LED0 */ #define LED_GREEN 1U /* 针 PTC1 - 主板上的 LED1 */ #define SW_GPIO PTC /* SW GPIO 类型 */ #define SW 12U /* 针 PTC12 - 主板上的 SW2_BTN0 */ #endif /* 闪存中受保护的地址 */ #define ADDRESS_PROTECT 0x0007FF04U /*! \brief 项目的主函数。 \启动初始化顺序如下: * - 启动 asm 例程 * - main() */ /* 预期错误 */ mpu_access_err_info_t expectedError = { .master= FEATURE_MPU_MASTER_CORE, /* Error Core master */ .attributes= MPU_DATA_ACCESS_IN_SUPERVISOR_MODE, /* 监督模式下的错误数据访问 */ .accessType= MPU_ERR_TYPE_READ, /* 读访问出错 */ .accessCtr= 0xA000U, /* 错误发生在区域 0 和区域 2 */ .addr= ADDRESS_PROTECT, /* 错误地址 */ #if FEATURE_MPU_HAS_PROCESS_IDENTIFIER .processorIdentification= 0U /* 错误处理器标识符 */ #endif }; /*! * @brief 错误比较器 * * @Param [输入] error1 错误访问。 *@Param[in] error2 错误访问。 * @return Status * - true : 错误相同。 * - 错误:错误是不同的。 */ bool ErrorCompare(mpu_access_err_info_t error1, mpu_access_err_info_t error2) { bool status = false; 如果 ((error1.master == error2.master) && (error1.attributes == error2.attributes) && (error1.accessType == error2.accessType) && (error1.accessCtr == error2.accessCtr) && (error1.addr == error2.addr)) { status = true; #if FEATURE_MPU_HAS_PROCESS_IDENTIFIER if(error1.processorIdentification)!= error2.processorIdentification) { status = false; } #endif } return status; } /* HardFault 处理程序 */ void HardFault_Handler(void) { /* 启用区域 3 以授予 Core 读取权限 */ MPU_DRV_EnableRegion(MPU_INST, 3U, true); } /*! \brief 项目的主要功能。 \启动初始化序列如下: * - 启动 asm 例程 * - main() */ int main(void) { /* 在此写入本地变量定义 */ bool status = false; uint32_t switchStatus = 0; status_t returnCode = STATUS_ERROR; volatile uint32_t test = 0U; mpu_access_err_info_t reportedError; /* Arm 禁用调试异常和监测控制寄存器 */ *(uint32_t *)0xE000EDFC = 0x1000000; /* 初始化时钟模块 */ CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT, g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT); CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT); /* 初始化 LED 和按钮配置 */ PINS_DRV_Init(NUM_OF_CONFIGURED_PINS0,g_pin_mux_InitConfigArr0); /* LED 关闭 */ PINS_DRV_WritePin(LED_GPIO,LED_RED,OFF); PINS_DRV_WritePin(LED_GPIO,LED_GREEN,OFF); /* 检查按钮的初始状态 */ switchStatus = PINS_DRV_ReadPins(SW_GPIO)& (1U<< SW); /* 初始化 MPU 模块 */ returnCode = MPU_DRV_Init(MPU_INST,MPU_NUM_OF_REGION_CFG0,MPU_Cfg0); /* 检查初始化 */ if (returnCode == STATUS_SUCCESS) { /* 打开 LED_GREEN */ PINS_DRV_WritePin(LED_GPIO, LED_GREEN, ON); } /* 无限循环 */ for(;;) { /* 检查按钮 */ if (switchStatus != (PINS_DRV_ReadPins(SW_GPIO)& (1U<< SW))) { /* 禁用区域 3 以忽略 Core 读取权限 */ MPU_DRV_EnableRegion(MPU_INST, 3U, false); } /* 读取闪存中受 MPU 保护的地址 */ test = *((uint32_t *)ADDRESS_PROTECT); /* 转为 void 以避免"设置但未使用的警告" */ (void)test; /* 获取从端口 0 的错误访问详情 */ status = MPU_DRV_GetDetailErrorAccessInfo(MPU_INST,FEATURE_MPU_SLAVE_FLASH_BOOTROM,&reportedError); /* 检查错误状态 */ if (status) { /* 与预期错误比较 */ status = ErrorCompare(reportedError, expectedError); /* 如果为 true */ if (status) { /* 打开 LED_RED,关闭 LED_GREEN */ PINS_DRV_WritePin(LED_GPIO, LED_RED, ON); PINS_DRV_WritePin(LED_GPIO, LED_GREEN, OFF); break; } } } for(;;) { if(exit_code != 0) { break; } } return exit_code; } /* END MAIN */ /*! ** @} */ 这是 S32K144 官方示例中的程序。上面的屏幕截图显示了寄存器,EAR0 和 EAR3 都捕获了这个错误 Re: A Question about MPU s32k144 您能具体说明所用的示例代码并澄清一下问题吗?谢谢
View full article