NXP MCU 技术论坛
直播中

李泳瑜

8年用户 1215经验值
私信 关注
[问答]

SDMMC SD_init() 在启用了TrustZone的项目中永久循环是怎么回事?

我是嵌入式领域的菜鸟,所以也许我错过了一些非常明显的东西。
我正在开发一个基于 LPCXpresso55S69 板上的 TrustZone 的项目。该项目所需的部分功能是启用某些对象的持久存储。
为此,我参考了 SDK sdcard_polling示例。我测试了它,它工作得很好。
然后我决定将代码、库和配置复制到我正在处理的项目中(现在,我实际上只是复制了示例的代码)。 SD 卡 IO 应从安全侧执行。我初始化 SD 配置并运行 main_s.c 类(安全项目的主要功能)中的示例代码。
我设法让它构建并运行,但是在调用 SD_CardInit() 时它陷入了无限循环。

Backtrace: SD_CardInit() -> SD_SendScr -> SDMMCHOST_TransferFunction -> SDIF_TransferBlocking -> sdif_transferdatablocking -> SDIF_GetInternalDMAStatus.
SDIF_GetInternalDMAStatus返回 0x400,并且执行循环永远在 sdif_transferdatablocking 内部。

不确定还有哪些其他信息可能与此相关。

回帖(1)

张伟

2025-3-28 18:10:45

在启用TrustZone的LPC55S69项目中,SD_CardInit()陷入无限循环的可能原因及解决方案如下:




1. 外设访问权限问题



  • 问题原因:SDMMC控制器或相关GPIO被配置为非安全外设,导致安全侧代码无法访问。


  • 解决方案



    • 使用MCUXpresso的TrustZone配置工具(如security.c文件或GUI配置器)检查以下配置:

    • 确认SDMMC控制器(如SDIF1SDIO)的SEC_CFG标记为安全外设

    • 确认与SD卡连接的GPIO引脚(如CLK、CMD、DATA)对应的GPIO端口(如GPIO0)被设置为安全。

    • 修改方法示例(在security.c中):

      /* 设置SDMMC控制器为安全 */
      SYSCON->AHBCLKCTRLSET[0] = SYSCON_AHBCLKCTRL_SDIO_MASK;
      SYSCON->SECCTRLSET = SYSCON_SECCTRL_SDIOSEC_MASK;


    / 设置GPIO端口为安全 /
    SYSCON->AHBCLKCTRLSET[0] |= SYSCON_AHBCLKCTRL_GPIO0_MASK;
    GPIO->SECCTRL[0] |= (1U << pin_number); // 设置具体引脚为安全







2. 时钟配置错误



  • 问题原因:SDMMC控制器时钟未启用或频率配置错误。

  • 解决方案

    • 检查时钟树配置,确保SDMMC的时钟源(如FRO_HF、PLL)已启用。

    • 验证SD_CardInit()中时钟分频配置是否适合当前SD卡版本(如HS/Default模式)。

    • 使用调试器查看SDMMC_CLK引脚是否有波形输出。





3. 内存访问权限问题



  • 问题原因:SD卡数据缓冲区或代码段位于非安全内存区域。

  • 解决方案

    • 确保数据缓冲区(如sd_card_config_t)定义在安全内存区域(如.sdata或显式标记为安全的内存)。

    • 检查链接脚本(.ld文件),确认安全侧代码和数据的地址范围正确。





4. GPIO配置错误



  • 问题原因:GPIO复用功能或电气属性未正确设置。

  • 解决方案

    • 确认SD卡相关的GPIO引脚已配置为SDMMC功能(如IOCON->PIO[]寄存器)。

    • 检查引脚的上拉/下拉设置,确保符合SD卡电气要求。





5. 初始化流程顺序问题



  • 问题原因:引脚初始化、时钟使明、SDMMC初始化顺序错误。

  • 解决方案

    • 确保初始化顺序为:时钟 → GPIO → SDMMC控制器

    • 对比原SDK示例的BOARD_Init()函数,检查是否存在缺失的初始化步骤。





调试建议



  1. 定位死循环位置:通过Backtrace或单步调试,确认卡在SD_CardInit()中的具体位置(如等待CMD0响应超时)。

  2. 寄存器检查

    • 查看SDMMC->STATUS寄存器,确认是否有错误标志(如CMD_TIMEOUT)。

    • 检查SDMMC->CLOCKSDMMC->POWER寄存器配置是否生效。


  3. 对比SDK示例

    • 使用Beyond Compare等工具,对比当前项目与SDK示例的security.cclock_config.cpin_mux.c文件差异。





关键配置总结



























配置项 安全侧要求
SDMMC控制器 标记为安全外设(SEC_CFG)
GPIO引脚 复用为SD功能 + 安全权限
时钟 启用SDMMC时钟 + 正确分频
数据缓冲区 位于安全内存区域

通过上述步骤逐一排查,应能解决SD卡初始化卡死的问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分