STM32F469BIT6外接IS42S16400J SDRAM读写数据异常求助
STM32F469BIT6外接IS42S16400J SDRAM数据损坏排查求助
定制PCB使用STM32F469BIT6芯片,外接IS42S16400J-7TLI型8Mb SDRAM。此前基于STM32F429ZIT6搭配同款SDRAM(选型参考STM32F429-DISCO开发板)的板卡可正常读写SDRAM,但更换为STM32F469BIT6后,虽能执行读写操作,但数据出现损坏。
测试代码
/* USER CODE BEGIN PV */ volatile uint8_t *externalRAM = (uint8_t*) 0xC0000000; const uint32_t size = 8 * 1024 * 1024; //8MB /* USER CODE END PV */ /* USER CODE BEGIN 2 */ //write external RAM for (uint32_t i = 0; i < size; i++) { externalRAM[i] = i % 256; } //read external RAM for (uint32_t i = 0; i < size; i++) { if (externalRAM[i] != i % 256) { asm("nop"); // insert error handling logic here } } /* USER CODE END 2 */
SDRAM配置代码
/* USER CODE BEGIN FMC_Init 2 */ FMC_SDRAM_CommandTypeDef Command; /* Step 1 and Step 2 already done in HAL_SDRAM_Init() */ /* Step 3: Configure a clock configuration enable command */ Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; /* Set MODE bits to "001" */ Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; /* configure the Target Bank bits */ Command.AutoRefreshNumber = 1; Command.ModeRegisterDefinition = 0; HAL_SDRAM_SendCommand(&hsdram2, &Command, 0xfff); HAL_Delay(1); /* Step 4: Insert 100 us minimum delay - Min HAL Delay is 1ms */ /* Step 5: Configure a PALL (precharge all) command */ Command.CommandMode = FMC_SDRAM_CMD_PALL; /* Set MODE bits to "010" */ HAL_SDRAM_SendCommand(&hsdram2, &Command, 0xfff); /* Step 6: Configure an Auto Refresh command */ Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; /* Set MODE bits to "011" */ Command.AutoRefreshNumber = 2; HAL_SDRAM_SendCommand(&hsdram2, &Command, 0xfff); /* Step 7: Program the external memory mode register */ Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;/*set the MODE bits to "100" */ Command.ModeRegisterDefinition = (uint32_t) 0 | 0 << 3 | 2 << 4 | 0 << 7 | 1 << 9; HAL_SDRAM_SendCommand(&hsdram2, &Command, 0xfff); /* Step 8: Set the refresh rate counter - refer to section SDRAM refresh timer register in RM0455 */ /* Set the device refresh rate * COUNT = [(SDRAM self refresh time / number of row) x SDRAM CLK] – 20 = [(64ms/4096) * 100MHz] - 20 = 1562.5 - 20 ~ 1542 */ HAL_SDRAM_ProgramRefreshRate(&hsdram2, 1292); // 84MHZ /* USER CODE END FMC_Init 2 */
异常现象
示波器可观测到时钟信号,但不同数据类型测试均出现异常:
- 以uint8_t类型写入时,奇数数值会覆盖所有地址,偶数数值仅覆盖偶数地址;
- 以uint16_t类型写入时,仅偶数地址变化且值均相同;
- 以uint32_t类型写入时,内存无任何变化。
已尝试调整时钟频率(30MHz、90MHz)及SDRAM时序参数,问题未解决,寻求技术排查帮助,必要时可提供逻辑分析仪数据。
内容的提问来源于stack exchange,提问作者cserp
相关产品推荐
相关产品推荐

