完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大虾们好,最近在使用 STM32f7x单片机对sdram 读写 ?? 出现如下情况:
图片1,读写正常,单个字节读写,见图片描述 一写一读正常,这说明硬件木有什么问题吧 ?? 下面的连续写或者连续读都不行,图片如下: 大神们看看是哪里不对,SDRAM 我是使用两片 16位组合成32位的 a、 b、 c、上述a或者b操作后,如果不使用 static void MPU_Config(void) 这个函数,那么再单独进行单个字节的读写也不正常,这又是为何啊 ??? 软件设置如下: /** * @brief Configure the MPU attributes as Write Back for SDRAM. * @note The Base Address is 0xC0000000. * The Region Size is 32MB, it is related to SDRAM memory size. * @param None * @retval None */ static void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct; /* Disable the MPU */ HAL_MPU_Disable(); /* Configure the MPU attributes as WB for SDRAM */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress = SDRAM_BASE_ADDR; // 0xC0000000; MPU_InitStruct.Size = MPU_REGION_SIZE_32MB; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.SubRegionDisable = 0x00; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enable the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } // 执行外部存储器SDRAM的初始化序列 /** * @brief Perform the SDRAM external memory initialization sequence * @param hsdram: SDRAM handle * @param Command: Pointer to SDRAM command structure * @retval None */ void BSP_SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) { __IO uint32_t tmpmrd =0; /* Step 1: Configure a clock configuration enable command */ Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 2: Insert 100 us minimum delay */ /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */ HAL_Delay(1); /* Step 3: Configure a PALL (precharge all) command */ Command->CommandMode = FMC_SDRAM_CMD_PALL; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 4 : Configure a Auto-Refresh command */ Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 8; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 5: Program the external memory mode register */ tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 | SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | SDRAM_MODEREG_CAS_LATENCY_2 | SDRAM_MODEREG_OPERATING_MODE_STANDARD | SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = tmpmrd; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 6: Set the refresh rate counter */ /* (15.62 us x Freq) - 20 */ /* Set the device refresh counter */ hsdram->Instance->SDRTR |= ((uint32_t)((1292)<< 1)); // 1292 } /* FMC initialization function */ void MX_FMC_Init(void) /** Perform the SDRAM1 memory initialization sequence */ hsdram1.Instance = FMC_SDRAM_DEVICE; //SDRAM在BANK5,6 /* hsdram1.Init */ /* 两片 MT48LC32M16(数据宽度16位) 组合成为 一片 MT48LC32M32(即把两片16位的组合成32位宽的)*/ hsdram1.Init.SDBank = FMC_SDRAM_BANK1; //SDRAM接在BANK5上 hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; // 列地址线数目 hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; // 行地址线数目 hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32; hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; //一共4个BANK hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2; //CAS为3 hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; // 使能突发读 hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; // 定义在CAS个延时后在等待多少个HCLK时钟才读取数据 /* SdramTiming */ #if 1 SdramTiming.LoadToActiveDelay = 2; // TMDR 加载模式寄存器到激活时间的延迟为2个时钟周期 SdramTiming.ExitSelfRefreshDelay = 6; // TXSR 退出自刷新延迟为x个时钟周期 SdramTiming.SelfRefreshTime = 4; // TRAS 自刷新时间为x个时钟周期 SdramTiming.RowCycleDelay = 6; // TRC 行循环延迟为x个时钟周期 SdramTiming.WriteRecoveryTime = 2; // TWR 恢复延迟为x个时钟周期 SdramTiming.RPDelay = 2; // TRP 行预充电延迟为x个时钟周期 SdramTiming.RCDDelay = 2; // TRCD 行到列延迟为x个时钟周期 #else SdramTiming.LoadToActiveDelay = 3; // TMDR 加载模式寄存器到激活时间的延迟为2个时钟周期 SdramTiming.ExitSelfRefreshDelay = 7; // TXSR 退出自刷新延迟为x个时钟周期 SdramTiming.SelfRefreshTime = 5; // TRAS 自刷新时间为x个时钟周期 SdramTiming.RowCycleDelay = 7; // TRC 行循环延迟为x个时钟周期 SdramTiming.WriteRecoveryTime = 3; // TWR 恢复延迟为x个时钟周期 SdramTiming.RPDelay = 3; // TRP 行预充电延迟为x个时钟周期 SdramTiming.RCDDelay = 3; // TRCD 行到列延迟为x个时钟周期 #endif if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { Error_Handler(); } /* Program the SDRAM external device */ BSP_SDRAM_Initialization_Sequence(&hsdram1, &SDRAMcommand); // 执行外部存储器SDRAM的初始化序列 } MT48LC32M16 芯片截图 详细的 MT48LC32M16资料如下: |
|
相关推荐
22个回答
|
|
sdram 太高深,暂时还没接触,支持一下
|
|
|
|
这个真的不会,只能帮楼主加人气了。
|
|
|
|
遇到这种问题,建议用如此测试:
1.原厂例程+评估板 2.原厂例程+自制板 3.自写程序+评估板 4.自写程序+自制板 并对照原厂和自己的软件、硬件设计,以找出问题所在 当然不必全部测试 |
|
|
|
顶楼主,学习啦。
|
|
|
|
顶楼主,学习啦。
|
|
|
|
2片SDRAM么?
|
|
|
|
帮楼主顶一下
|
|
|
|
不会,帮顶
|
|
|
|
|
|
是的 两片 MT48LC32M16(两片16bit)组合成 MT48LC32M32(32bit) |
|
|
|
顶楼主,学习啦
|
|
|
|
学习了。。。。
|
|
|
|
刚看了看代码,你吧printf放到你连续的外面试试?printf毕竟速度最慢,操作内存是很快的。
|
|
|
|
这个确实比较麻烦,我还没试过 |
|
|
|
没接触过,帮顶了
|
|
|
|
钢开始贴的两片 MT48LC32M16不是一个批次的,造成程序有时稳定,有时不行,还有就是
这个 需要设置为 1 hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; // 定义在CAS个延时后在等待多少个HCLK时钟才读取数据 需要特别注意的是两片 MT48LC32M16 要一样的 |
|
|
|
钢开始贴的两片 MT48LC32M16不是一个批次的,造成程序有时稳定,有时不行,还有就是
这个 需要设置为 1 hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; // 定义在CAS个延时后在等待多少个HCLK时钟才读取数据 需要特别注意的是两片 MT48LC32M16 要一样的 |
|
|
|
遇到这种问题一般多是楼主不会,哈哈 我也不会
|
|
|
|
已经搞定了,吧两个芯片更换为一模一样的就可以了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
702 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1099 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1573 浏览 1 评论
532 浏览 0 评论
1065 浏览 0 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 00:37 , Processed in 0.983551 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号