硬汉嵌入式论坛

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

[FMC] 紧急 !怎么缩短STM32H743 FMC 连续两次读PSRAM的时间间隔?

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2025-7-6 19:49:04 | 显示全部楼层 |阅读模式
STM32H743 通过FMC 与FPGA通讯。设计成PSRAM,地址数据复用模式,16bit宽度。连续两次读操作时间间隔最小约130ns,与地址建立时间,地址保持时间,数据保持时间无关。而连续两次写操作时间间隔最小约10ns。请问怎么缩小两次读操作的时间间隔?
另外如果用DMA,如何初始化DMA?

程序如下:
DMA_HandleTypeDef hdma;
void DMA_Config() {
  // 使能DMA时钟
  __HAL_RCC_DMA1_CLK_ENABLE();

  // 配置DMA
  hdma.Instance = DMA1_Stream0;
//  hdma.Init.Channel = DMA_CHANNEL_0;
  hdma.Init.Direction = DMA_MEMORY_TO_MEMORY;
  hdma.Init.PeriphInc = DMA_PINC_ENABLE;
  hdma.Init.MemInc = DMA_MINC_ENABLE;
  hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  hdma.Init.MemDataAlignment = DMA_PDATAALIGN_HALFWORD;
  hdma.Init.Mode = DMA_NORMAL;
  hdma.Init.Priority = DMA_PRIORITY_HIGH;
  HAL_DMA_Init(&hdma);
}

void DMA_Transfer(uint32_t srcAddr, uint32_t destAddr, uint32_t dataSize) {
  // 启动DMA传输
  HAL_DMA_Start(&hdma, srcAddr, destAddr, dataSize);
}
void MX_FMC_Init(void)
{

  /* USER CODE BEGIN FMC_Init 0 */

  /* USER CODE END FMC_Init 0 */

  FMC_NORSRAM_TimingTypeDef Timing = {0};

  /* USER CODE BEGIN FMC_Init 1 */

  /* USER CODE END FMC_Init 1 */

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_ENABLE;
  hsram1.Init.MemoryType =         FMC_MEMORY_TYPE_NOR;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_32;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.WriteFifo = FMC_WRITE_FIFO_DISABLE;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 4;        /* 地址建立时间  范围0 -15个FMC时钟周期个数*/
  Timing.AddressHoldTime = 2;                /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
  Timing.DataSetupTime = 44;                        /* 数据保持时间,范围1 -255个时钟周期个数 */
  Timing.BusTurnAroundDuration = 1;       
  Timing.CLKDivision = 1;
  Timing.DataLatency = 2;
  Timing.AccessMode = FMC_ACCESS_MODE_A;       
  /* ExtTiming */

  if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  {
    Error_Handler( );
  }

  /* USER CODE BEGIN FMC_Init 2 */

  /* USER CODE END FMC_Init 2 */
}
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-6 19:50:08 | 显示全部楼层
不用DMA,直接对地址读写,输出时序正常。如果用DMA操作,时序没有输出。
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-7-7 08:43:10 | 显示全部楼层
本帖最后由 dukelec 于 2025-7-7 09:51 编辑

你首先要做的不是降低时间间隔,反而是加大写时间间隔
看一下 psram 手册,一般会有这样的时序要求:“tCPH 连续突发操作之间 CE# 高电平的时间 >= 50ns”
需要有多一点空闲时间供 psram 内部 dram 自刷新
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-7 10:56:12 | 显示全部楼层
dukelec 发表于 2025-7-7 08:43
你首先要做的不是降低时间间隔,反而是加大写时间间隔
看一下 psram 手册,一般会有这样的时序要求:“tCP ...

我那边的设备是FPGA。而且不是BURST操作。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-8 08:55:53 | 显示全部楼层
这个帖子楼主位末尾带的例子是FMC DMA

STM32H7视频教程第16期:DMA双缓冲实现32路脉冲并行同步控制(2022-05-26)
https://forum.anfulai.cn/forum.p ... 2560&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-11 08:45:44 | 显示全部楼层
eric2013 发表于 2025-7-8 08:55
这个帖子楼主位末尾带的例子是FMC DMA

STM32H7视频教程第16期:DMA双缓冲实现32路脉冲并行同步控制(202 ...

感谢答复! 正在学习中......
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-11 09:01:50 | 显示全部楼层
eric2013 发表于 2025-7-8 08:55
这个帖子楼主位末尾带的例子是FMC DMA

STM32H7视频教程第16期:DMA双缓冲实现32路脉冲并行同步控制(202 ...

请问DMA必须有一个事件触发吗?我上面的源代码时直接启动DMA,监测状态位,应该是启动了。但是永远没法执行完。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-12 16:17:55 | 显示全部楼层
eric2013 发表于 2025-7-8 08:55
这个帖子楼主位末尾带的例子是FMC DMA

STM32H7视频教程第16期:DMA双缓冲实现32路脉冲并行同步控制(202 ...

硬汉老师,您好!我用这个例程,用示波器测量NE1管脚,看不到NE1的电平变化,这是为什么呢?
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-12 17:11:51 | 显示全部楼层
根据硬汉老师提供的例程,我实现了DMA读操作。目前两次读之间的时间间隔约70ns。怎么也快不了了。不知道这是不是FMC的读的极限速度,即约10MHz?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-14 08:56:59 | 显示全部楼层
david2077 发表于 2025-7-12 17:11
根据硬汉老师提供的例程,我实现了DMA读操作。目前两次读之间的时间间隔约70ns。怎么也快不了了。不知道这 ...

先不用DMA方式,优化下你的FPGA端实现,FMC搞到30-40MHz是没问题的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 00:07 , Processed in 0.046412 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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