• 正文
  • 相关推荐
申请入驻 产业图谱

TrustZone串口DMA传输失败?DMA通道必须匹配 SRAM 的特权 + 安全属性

12/23 14:50
137
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

STM32U5 SBSFU(TrustZone)环境下,串口 DMA 传输数据全为 0 的核心原因是DMA 通道未配置特权属性——SRAM2 默认是 Secure+Privileged 属性,而 DMA 默认仅为 Non-Secure+Non-Privileged,仅配置 Secure 属性无法访问 Privileged 级别的 SRAM,导致传输失败。解决方案:在 DMA 通道属性中同时启用 Secure 和 Privileged,确保与内存属性完全匹配。

资料获取:【应用笔记】LAT1446TrustZone应用中串口通信的DMA传输失败问题

1. 问题背景:TrustZone 环境的 DMA 传输异常

1.1 应用场景

  • 硬件平台:STM32U5(支持 TrustZone);
  • 软件框架:SBSFU 工程(含 Boot、APP、Loader),Boot 工程使用 SRAM2;
  • 功能配置:串口(LPUART1)+ DMA 传输,非 DMA 模式正常,DMA 模式数据全为 0;
  • 核心参数:115200bps、1+8+1 数据格式,GPDMA1 通道 0(TX)、通道 1(RX)。

1.2 异常表现

  • PC 端接收串口数据全为 0,示波器测量 TX 引脚无有效波形;
  • 测试工程验证:单独创建的 TrustZone + 串口 DMA 工程(配置 SRAM1+GTZC MPCBB1)正常,移植到 SBSFU Boot 工程后失败。

2. 根源拆解:TrustZone 下的资源属性不匹配

2.1 核心矛盾:SRAM 与 DMA 的属性差异

TrustZone 启用后,MCU 资源的默认属性是关键(参考手册 RM0456 Rev4):

资源 默认属性 配置情况
SRAM2(Boot 工程使用) Secure + Privileged 未配置 GTZC MPCBB2,沿用默认
DMA 通道 Non-Secure + Non-Privileged 仅手动配置 Secure,未配 Privileged
  • 关键规则:TrustZone 环境中,外设(DMA)访问内存时,安全属性和特权属性必须完全匹配,否则访问被阻断,数据传输失败。

2.2 测试工程与 Boot 工程的差异

  • 测试工程:配置 SRAM1 为 Secure,且通过 GTZC MPCBB1 明确属性,DMA 通道仅需配置 Secure 即可(SRAM1 默认无 Privileged 要求);
  • Boot 工程:使用 SRAM2,默认 Secure+Privileged,DMA 仅配置 Secure,缺少 Privileged 属性,导致访问 SRAM2 被拒绝。

3. 解决方案:配置 DMA 通道为 Secure+Privileged

核心是通过HAL_DMA_ConfigChannelAttributes函数,同时启用 DMA 通道的 Secure 和 Privileged 属性,确保与 SRAM2 的默认属性匹配。

3.1 关键代码修改(Boot 工程中)

在 DMA 通道初始化时,补充 Privileged 属性配置:

// 串口TX DMA通道(GPDMA1 Channel0)配置
__HAL_LINKDMA(&hlpuart1, hdmatx, handle_GPDMA1_Channel0);
// 同时启用Secure和Privileged属性
if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel0,
    DMA_CHANNEL_PRIV | DMA_CHANNEL_SEC | 
    DMA_CHANNEL_SRC_SEC | DMA_CHANNEL_DEST_SEC) != HAL_OK) {
  Error_Handler();
}

// 串口RX DMA通道(GPDMA1 Channel1)配置
__HAL_LINKDMA(&hlpuart1, hdmarx, handle_GPDMA1_Channel1);
if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel1,
    DMA_CHANNEL_PRIV | DMA_CHANNEL_SEC | 
    DMA_CHANNEL_SRC_SEC | DMA_CHANNEL_DEST_SEC) != HAL_OK) {
  Error_Handler();
}

3.2 代码参数说明

属性宏 作用
DMA_CHANNEL_PRIV 启用 DMA 通道的 Privileged 属性
DMA_CHANNEL_SEC 启用 DMA 通道的 Secure 属性
DMA_CHANNEL_SRC_SEC DMA 源地址为 Secure 区域
DMA_CHANNEL_DEST_SEC DMA 目标地址为 Secure 区域

3.3 补充配置:GTZC(可选,按需启用)

若手动修改 SRAM 属性,需配置 GTZC 的 MPCBB(内存保护控制器),确保 SRAM 属性明确:

static void gtzc_init_cfg(void) {
  __HAL_RCC_GTZC1_CLK_ENABLE();
  // 配置SRAM2为Secure+Privileged(若需修改默认属性)
  GTZC_MPCBB2_S->SECCFGR[0] = 0xFFFFFFFF; // 全部Secure
  GTZC_MPCBB2_S->PRIVCFGR[0] = 0xFFFFFFFF; // 全部Privileged
}

4. 验证结果

  • 编译修改后的 Boot 工程,烧录后串口 DMA 传输正常,PC 端接收数据正确;
  • 示波器测量 TX 引脚波形稳定,符合串口通信协议,传输无丢包、无异常数据。

5. TrustZone 开发关键注意事项

  1. 属性匹配优先:外设(DMA、UART 等)与内存(SRAM/Flash)的安全属性(Secure/Non-Secure)和特权属性(Privileged/Non-Privileged)必须完全一致;
  2. 默认属性不可忽视:未配置 GTZC 时,SRAM 默认 Secure+Privileged,Securable 外设默认 Non-Secure+Non-Privileged,需手动对齐;
  3. 测试工程对比法:移植功能失败时,优先创建最小测试工程验证,通过对比资源配置(内存、GTZC、DMA 属性)定位差异;
  4. 参考资源默认表:
    资源类型 默认安全属性 默认特权属性
    片上 SRAM(1-6) Secure Privileged
    Securable 外设 Non-Secure Non-Privileged
    片上 Flash Secure Privileged
    中断 Secure -

TrustZone 环境下的 DMA 传输失败,核心是 “属性不匹配” 而非硬件配置错误。开发时需重点关注资源的安全级别和特权级别,尤其是默认属性与手动配置的一致性 —— 仅配置 Secure 属性忽略 Privileged,会导致内存访问被阻断。通过明确 DMA 通道的双属性配置,可快速解决传输异常问题。

相关推荐