查看: 1035|回复: 2

[分享] MCXA153: 通过MBC配置Flash操作权限

[复制链接]

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24974
最后登录
2025-7-25
发表于 2024-11-4 18:10:56 | 显示全部楼层 |阅读模式
本帖最后由 小恩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,如下图所示。
Picture1.png

3.调试过程:
  • source/flashiap.c 的第 149 行处设置断点。运行 flash_erase_sector 会弹出 semihost_hardfault.c 文件提示出现 HardFault 异常

Picture2.png

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.烧写命令:
  • 在 cmd 命令行中依次输入以下指令:
blhost -p comX flash-erase-region 0x01000000 0x100blhost -p comX write-memory 0x01000000 cmpa.bin

注意:comX为你的设备所连接的com接口号。
Picture3.png
5.运行程序:
  • 随后运行程序打开串口可以看到例程运行成功
Picture4.png

方法二在应用代码中配置 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 异常问题。
回复

使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 292 天

    连续签到: 1 天

    [LV.8]以坛为家I

    82

    主题

    1161

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3028
    最后登录
    2025-7-22
    发表于 2024-11-4 20:09:25 | 显示全部楼层
    大佬~当时我也遇到了,但是我单纯的更新了一下SDK包就好了,俺的KEIL 版本是 5.39
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24974
    最后登录
    2025-7-25
     楼主| 发表于 2024-11-11 12:10:42 | 显示全部楼层
    ltbo4b8d6e 发表于 2024-11-4 20:09
    大佬~当时我也遇到了,但是我单纯的更新了一下SDK包就好了,俺的KEIL 版本是 5.39 ...

    对的,新版SDK 默认使能了flash 擦、写功能。本文主要引出MBC,当遇到操作flash出现问题时,可以查看MBC模块的配置。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-29 09:48 , Processed in 0.085865 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表