处理器: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
求助家人们怎么解决这个问题。
❤️
目前待定原因是,测试读写时SYSRAM的读写速度受限导致的