本帖最后由 小恩GG 于 2024-11-19 17:24 编辑
MCXA153: 通过MBC配置Flash操作权限
不正确的 Flash 操作权限设置会导致 HardFault 错误。本文重点介绍如何通过 Memory Block Checker (MBC) 配置 Flash 操作权限。 1. 问题描述 1.1 环境配置 - 开发板: FRDM-MCXA153
- IDE: MCUXpresso v11.9
- SDK: v2.14.2 以下(已在 v2.16 中修正)
- Demo: driver_examples->flashiap
1.2 问题复现 - 打开 MCUXpresso IDE,导入 FRDM-MCXA153 开发板的 SDK中的 driver_examples->flashiap 工程。
2.编译和调试:
- 对工程文件进行编译后,连接 FRDM 开发板进行调试。
- 程序进入 HardFault,如下图所示。
3.调试过程: - 在 source/flashiap.c 的第 149 行处设置断点。运行 flash_erase_sector 后,会弹出 semihost_hardfault.c 文件,提示出现 HardFault 异常。
2. 解决方案 2.1 问题原因 出现 HardFault 的原因是,在启动后的默认状态下,Flash 由 ROM 使用内存块控制(MBC)进行保护,不允许进行擦除/写入操作。 2.2 解决方法
方法一:修改 CMPA 中的 ACL_SEC_14 为 0 - 因为 flashiap 示例中擦除的是 sector 14,所以需要修改 ACL_SEC_14。
- 将 MCXA513 进入 ISP 模式,通过 blhost 烧写。
2.找到并复制文件:- 在 workspace 的工程文件夹下找到 cmpa.bin 文件,并将其复制到 blhost 的目录文件夹下。
3.进入 ISP 模式:- 首先将开发板上电,并进入 ISP 模式(按住板上的 ISP 按键的同时按下 RESET)。
4.烧写命令:blhost -p comX flash-erase-region 0x01000000 0x100blhost -p comX write-memory 0x01000000 cmpa.bin
注意:comX为你的设备所连接的com接口号。 5.运行程序:
方法二:在应用代码中配置 MBC (已集成在 SDKv2.16.0) - 打开 device/system_MCXA153.c 文件,找到 SystemInit 函数,并将其替换为以下代码:
__attribute__ ((weak)) void SystemInit (void) {
SCB->CPACR |= ((3UL << 0*2) | (3UL << 1*2)); /* set CP0, CP1 Full Access in Secure mode (enable PowerQuad) */
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
SCB_NS->CPACR |= ((3UL << 0*2) | (3UL << 1*2)); /* set CP0, CP1 Full Access in Normal mode (enable PowerQuad) */
#endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
SCB->NSACR |= ((3UL << 0) | (3UL << 10)); /* enable CP0, CP1, CP10, CP11 Non-secure Access */
#if defined(__MCUXPRESSO)
extern void(*const g_pfnVectors[]) (void);
SCB->VTOR = (uint32_t) &g_pfnVectors;
#else
extern void *__Vectors;
SCB->VTOR = (uint32_t) &__Vectors;
#endif
/* Enable the LPCAC */
SYSCON->LPCAC_CTRL |= SYSCON_LPCAC_CTRL_LPCAC_MEM_REQ_MASK;
SYSCON->LPCAC_CTRL &= ~SYSCON_LPCAC_CTRL_DIS_LPCAC_MASK;
/* Enable flash RWX when FLASH_ACL in IFR0 is invalid */
if ((*((volatile const uint32_t *)(0x1000000)) == 0xFFFFFFFFU) ||
((*((volatile const uint32_t *)(0x1000000)) == 0x59630000U) &&
(*((volatile const uint32_t *)(0x1000040)) == 0xFFFFFFFFU) &&
(*((volatile const uint32_t *)(0x1000044)) == 0xFFFFFFFFU)))
{
/* Enable MBC register written with GLIKEY index15 */
GLIKEY0->CTRL_0 = 0x00060000U;
GLIKEY0->CTRL_0 = 0x0002000FU;
GLIKEY0->CTRL_0 = 0x0001000FU;
GLIKEY0->CTRL_1 = 0x00290000U;
GLIKEY0->CTRL_0 = 0x0002000FU;
GLIKEY0->CTRL_1 = 0x00280000U;
GLIKEY0->CTRL_0 = 0x0000000FU;
/* Enable RWX for GLBAC0 */
MBC0->MBC_INDEX[0].MBC_MEMN_GLBAC[0] = 0x7700U;
/* Use GLBAC0 for all flash block */
for (uint8_t i = 0; i < 2U; i++)
{
MBC0->MBC_INDEX[0].MBC_DOM0_MEM0_BLK_CFG_W = 0x00000000U;
}
/* Disable MBC register written */
GLIKEY0->CTRL_0 = 0x0002000FU;
}
SystemInitHook();
}
2.重新编译和运行:- 完成后,重新编译程序,运行,打开串口即可看到例程成功运行。
3. 结论 本文适用于客户由于开发阶段不同,不想升级SDK版本情况。通过以上两种方法,可以有效解决 MCXA153 开发板在运行 flashiap 示例时出现的 HardFault 异常问题。
|