ST意法半导体
直播中

陈伟

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

STM32MP135D 操作DDR过慢怎么解决?

处理器STM32MP135D (单核CA7)
问题现象:操作 DDR 过慢。
一秒才能画(进行)大约 200000~300000 个点(次写操作,尺度为 uint16_t)。速度大约 ??kB/s,但正常情况应该是 ?? MB/s(吧?)。
应用背景:LTDC.LAYER + DDR
例程参考 :STM32Cube_FW_MP13_V1.1.0
映射地址:0xC000'0000
使用DDR:NT5CC256M16EP-EKI DDR3(L) 4Gb SDRAM CL-TRCD-TRP{13-13-13}
手册要求 933MHz Clock但是STM32MP13x 最高给 DDRC 频率 533MHz
其他外设 LTDC频率 33MHz
CL-TRCD-TRP 为{7-7-7},这个参数不知道怎么配置。
以下为本人时钟树配置信息:
    using namespace RCCReg;    RCC.canMode();    PWR.setDBP(true);    RCC[BDCR].maset(_IMM(_BDCR::LSEDRV), 2, 0b10);    // OSC PART:  Order: HSE HSI CSI LSI LSE PLL    uni::RCC.HSE.setMode(false);// no-bypass    uni::RCC.HSI.setMode(0, 0);// DIV1 and Cali(0x0)    uni::RCC.CSI.setMode(0x10);    uni::RCC.LSI.setMode();    uni::RCC.LSE.setMode(false);// no-bypass    if (!RCC.PLL1.setModePLL12(PLLMode::Fractional, PLL1Source::HSE,        .m=3, .n=81, .p=1, .q=2, .r=2, .frac=0x800)) erro();    if (!RCC.PLL2.setModePLL12(PLLMode::Fractional, PLL2Source::HSE,        .m=3, .n=66, .p=2, .q=2, .r=1, .frac=5120)) erro();// for 533M DDR    bool if_range3 = true;    if (!RCC.PLL3.setModePLL34(PLLMode::Fractional, PLL3Source::HSE, if_range3,        .m=2, .n=34, .p=2, .q=17, .r=2, .frac=0x1a04)) erro();    bool if_range4 = true;    if (!RCC.PLL4.setModePLL34(PLLMode::Fractional, PLL4Source::HSE, if_range4,        .m=2, .n=38, .p=12, .q=14, .r=6, .frac=4096)) erro();// 33M for LTDC    bool state = true;    // BUS PART:  Order: MPU ACLK HCLK PCLK4 PCLK5 PCLK1 PCLK2 PCLK3 PCLK6    asserv(state) = RCC.Sysclock.setMode(SysclkSource::PLL1, 1);// PLL1 DIV2    else erro();    asserv(state) = RCC.AXIS.setMode(AxisSource::PLL2, 1);// PLL2 DIV1    else erro();    asserv(state) = RCC.MLAHB.setMode(MLAHBSource::PLL3, 0);// PLL3 DIV1    else erro();    // APBs    RCC.APB4.setMode(1);// PCLK4 RCC_APB4_DIV2    RCC.APB5.setMode(2);// PCLK5 RCC_APB5_DIV4    RCC.APB1.setMode(1);// PCLK1 RCC_APB1_DIV2    RCC.APB2.setMode(1);// PCLK2 RCC_APB2_DIV2    RCC.APB3.setMode(1);// PCLK3 RCC_APB3_DIV2    RCC.APB6.setMode(1);// PCLK6 RCC_APB6_DIV2初始化代码
    __HAL_RCC_CSI_ENABLE() ;    __HAL_RCC_SYSCFG_CLK_ENABLE() ;    #if (USE_STPMIC1x) && !defined(USE_DDR)      BSP_PMIC_Init();      BSP_PMIC_InitRegulators();    #endif      /*##-1- Enable MCE ####################*/      __HAL_RCC_MCE_CLK_ENABLE();      /*##-2- TZC configuration ####################*/      __HAL_RCC_TZC_CLK_ENABLE();      /* Configure TZC to allow  DDR Region0 R/W  non secure for all IDs */      TZC->GATE_KEEPER =0;      TZC->REG_ID_ACCESSO=0xFFFFFFFF;  //Allow DDR Region0 R/W  non secure for all IDs      TZC->REG_ATTRIBUTESO = 0xC0000001;      TZC->GATE_KEEPER |=1;  //Enable the access in secure Mode  // filter 0 request close      /*##-3- Enable ETZPC & BACKUP SRAM for security ####################*/      __HAL_RCC_ETZPC_CLK_ENABLE();      __HAL_RCC_BKPSRAM_CLK_ENABLE();      /*##-4- Unlock debugger ####################*/      BSEC->BSEC_DENABLE = 0x47f;      /*##-5- Init DDR ####################*/      hddr.wakeup_from_standby = false;      hddr.self_refresh = false;      hddr.zdata = 0;      hddr.clear_bkp = false;      if (HAL_DDR_Init(&hddr) != HAL_OK)      {        while(1);      }对应配置文件亦有修改:
#ifndef STM32MP13XX_DDR3_4GBIT_H#define STM32MP13XX_DDR3_4GBIT_H#define DDR_MEM_NAME "DDR3-1066 bin F 1x4Gb 533MHz v1.53"#define DDR_MEM_SPEED 533000U#define DDR_MEM_SIZE (256*1024*1024)//0x20000000U...#define DDR_DFITMG0 0x02050105U// 不知道这个需不需要change...#define DDR_ADDRMAP6 0x0F0F0707//0x0F070707U...#define DDR_MR0 0x00000830U求助家人们怎么解决这个问题。

回帖(1)

hxjq

2025-3-12 17:43:20

针对你描述的 STM32MP135D 操作 DDR 过慢的问题,以下是一些可能的原因和解决方案:




1. DDR 时钟频率配置



  • 问题:STM32MP135D 的 DDRC 最高频率为 533MHz,但你的 DDR3 手册要求 933MHz。这意味着 DDR 的性能被限制在 533MHz。

  • 解决方案

    • 确认 DDRC 的时钟配置是否正确,确保 DDRC 的时钟频率设置为最高 533MHz。

    • 如果 DDR3 的频率要求高于 533MHz,可能需要更换兼容的 DDR3 芯片,或者降低对 DDR 性能的期望。





2. DDR 时序参数配置



  • 问题:DDR3 的时序参数(如 CL、TRCD、TRP)配置不正确,可能导致性能下降。

  • 解决方案

    • 根据 DDR3 芯片手册(NT5CC256M16EP-EKI),正确配置时序参数。

    • 对于 533MHz 的 DDRC,CL-TRCD-TRP 可以设置为 7-7-78-8-8(具体值需要根据芯片手册和实际测试调整)。

    • 使用 STM32CubeMX 或手动配置 DDRC 寄存器,确保时序参数与 DDR3 芯片匹配。





3. DDR 初始化配置



  • 问题:DDR 初始化配置不正确,可能导致性能问题。

  • 解决方案

    • 使用 STM32CubeMX 生成 DDR 初始化代码,确保 DDR 的配置(如 Bank、Row/Column 地址、刷新周期等)正确。

    • 参考 STM32Cube_FW_MP13_V1.1.0 中的例程,确保 DDR 初始化流程正确。





4. LTDC 与 DDR 的带宽瓶颈



  • 问题:LTDC 的频率为 33MHz,可能成为性能瓶颈。

  • 解决方案

    • 检查 LTDC 的配置,确保其时钟频率和分辨率设置合理。

    • 如果 LTDC 需要频繁访问 DDR,可以优化 LTDC 的刷新率或降低分辨率,减少对 DDR 的带宽占用。





5. DDR 访问优化



  • 问题:DDR 访问模式(如 Burst 长度、Prefetch 等)未优化,可能导致性能下降。

  • 解决方案

    • 启用 DDR 的 Burst 模式和 Prefetch 功能,以提高访问效率。

    • 确保 DMA 或 CPU 访问 DDR 时使用对齐的地址和合适的数据宽度(如 32 位或 64 位)。





6. Cache 配置



  • 问题:Cache 未启用或配置不正确,可能导致 DDR 访问效率低下。

  • 解决方案

    • 启用 Cortex-A7 的 L1 Cache 和 L2 Cache(如果支持)。

    • 确保 Cache 的配置与 DDR 访问模式匹配。





7. 性能测试与优化



  • 问题:性能测试方法可能不准确,导致误判 DDR 性能。

  • 解决方案

    • 使用更精确的性能测试工具(如 ARM DS-5 或 Perf)测量 DDR 的实际带宽。

    • 优化代码,减少不必要的 DDR 访问,提高整体性能。





8. 硬件设计检查



  • 问题:硬件设计(如 PCB 布线、电源噪声等)可能影响 DDR 性能。

  • 解决方案

    • 检查 PCB 布线,确保 DDR3 的信号完整性(如阻抗匹配、长度匹配等)。

    • 确保电源稳定,减少噪声对 DDR 性能的影响。





9. 参考例程与工具



  • 问题:可能未充分利用 STM32CubeMX 和参考例程。

  • 解决方案

    • 使用 STM32CubeMX 重新生成 DDR 初始化代码,确保配置正确。

    • 参考 STM32Cube_FW_MP13_V1.1.0 中的 DDR 和 LTDC 例程,优化代码。





10. 总结



  • 首先,确认 DDR 的时钟频率和时序参数配置是否正确。

  • 其次,优化 LTDC 和 DDR 的访问模式,减少带宽瓶颈。

  • 最后,通过性能测试和硬件检查,排除潜在问题。


如果以上方法仍无法解决问题,建议联系 ST 官方技术支持,获取更详细的帮助。

举报

更多回帖

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