硬汉嵌入式论坛

 找回密码
 立即注册
查看: 649|回复: 7
收起左侧

[SDRAM] STM32CubeMX+H743读写W9825G6KH异常求助

[复制链接]

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-11-13 17:55:27 | 显示全部楼层 |阅读模式
本帖最后由 lorelia 于 2023-11-13 18:07 编辑

电路板H743+W9825G6KH,使用STM32CubeMX的6.9.2版本搭建带FreeRTOS的系统框架,初测SDRAM的读写,测试下来发现写入的数据再次读出时,部分地址的结果不正确。
W9825G6KH共32MBytes,位宽16bit,硬件片选和时钟分别连接到H743的FMC-SDNE1和FMC-SDCKE1,所以对应起始地址0xD0000000。


在查找问题原因时,由于手边工具有限,我将原本跑在480MHz的系统时钟降到了240MHz,FMC只配置了100MHz,对应SDRAM的工作时钟频率为50MHz,关于FMC的时间参数配置都按照这个进行了修改:
参见图:FMC配置

刷新频率也相应进行了修改,参见图:SDRAM初始化序列函数

测试程序的控制过程说明如下:
1)完成对FMC的初始化,然后调用函数SDRAM_Initialization_Sequence1()执行SDRAM的初始化序列;
2)对硬件定时器TIM3进行初始化,启用定时中断,在中断服务程序中向负责写SDRAM的task发送消息;
3)task接收到消息后就执行一次写SDRAM操作,地址从0xD0000000开始,每次写入32字节(16bits*16),读写函数参见图:16bit长度的SDRAM读写;
为了方便解读波形,在调用写SDRAM函数FMC_SDRAM_WriteBuffer_16()之前会将LED的管脚置HIGH,完成调用后再置LOW。

通过逻辑分析仪抓取信号进行分析,有波形附后。其中红色箭头指向的波形放大图也贴上。

对波形进行解析时发现与芯片资料的说法不一致。文档中说明的写波形逻辑见SDRAM写时序图。

疑问:我抓到的波形该如何理解呢?对外部SDRAM的写操作异常是FMC的配置存在问题吗?我该如何解决这个问题?


写SDRAM波形

写SDRAM波形

箭头处波形放大

箭头处波形放大

FMC配置

FMC配置

SDRAM初始化序列函数

SDRAM初始化序列函数

SDRAM写时序

SDRAM写时序
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2023-11-13 18:57:18 | 显示全部楼层
楼主这个是自己做的板子吗,如果是自己做的板子优先检查焊接,论坛90%的SDRAM问题都是焊接有问题导致的。所以建议楼主也优先检查下。

SDRAM的程序一般很少有人出问题的,基本都是通用配置。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2023-11-13 19:18:41 来自手机 | 显示全部楼层
是自己做的板子,我也想过是不是硬件问题,可硬件工程师出差了,我不知道怎样检查焊接问题。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2023-11-13 19:21:11 来自手机 | 显示全部楼层
上周也找人帮我把SDRAM重新焊过,不过没有改善,而且一共做了两块板子都是一样的问题,
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2023-12-5 16:27:48 | 显示全部楼层
eric2013 发表于 2023-11-13 18:57
楼主这个是自己做的板子吗,如果是自己做的板子优先检查焊接,论坛90%的SDRAM问题都是焊接有问题导致的。所 ...

还要请教,目前代码在STM32H743平台上运行FreeRTOS,FMC时钟为200MHz时单独测试SDRAM读写正常,但在多任务处理过程中定时执行外部中断检测、通过SPI的DMA方式接收AD采样数据然后写SDRAM,有5%的概率写入的数据出错,会是由于什么原因导致的呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2023-12-6 08:37:28 | 显示全部楼层
lorelia 发表于 2023-12-5 16:27
还要请教,目前代码在STM32H743平台上运行FreeRTOS,FMC时钟为200MHz时单独测试SDRAM读写正常,但在多任 ...

如果仅是数据出错,而没有异常之类的问题,注意Cache问题,Cache没处理好,会有数据错误。

回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2023-12-6 10:14:03 | 显示全部楼层
本帖最后由 lorelia 于 2023-12-6 12:18 编辑
eric2013 发表于 2023-12-6 08:37
如果仅是数据出错,而没有异常之类的问题,注意Cache问题,Cache没处理好,会有数据错误。

非常感谢你的回复。这是第一次使用Cache,DMA接收数据放置的buffer分配在AXI-SRAM,这个空间我的MPU配置为:

  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x24000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;


这样配置的话,是不是在进行写SDRAM操作时调用SCB_InvalidateDCache_by_Addr来清指定地址的DCache就可以了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2023-12-7 08:10:12 | 显示全部楼层
lorelia 发表于 2023-12-6 10:14
非常感谢你的回复。这是第一次使用Cache,DMA接收数据放置的buffer分配在AXI-SRAM,这个空间我的MPU配置 ...

1、配置为最低性能试试。
https://www.armbbs.cn/forum.php?mod=viewthread&tid=99322

2、省事些,直接使用函数
SCB_CleanInvalidateDCache
如果你配置为最低性能,可以不调用这个了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 04:53 , Processed in 0.191861 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表