硬汉嵌入式论坛

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

[FMC] sRAM FMC时序问题

[复制链接]

3

主题

19

回帖

28

积分

新手上路

积分
28
发表于 2025-1-7 14:03:16 | 显示全部楼层 |阅读模式
大佬们STM32的FMC怎么才能发出这个波形呢
Feige图片20250107140210.png
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-7 17:12:59 | 显示全部楼层
static 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_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_PSRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_32;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_ENABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WrapMode = FMC_WRAP_MODE_DISABLE;
  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_ENABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 0;
  Timing.AddressHoldTime = 1;
  Timing.DataSetupTime = 1;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 16;
  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 */
}
uint16_t SRAM_Read(uint32_t address) {
    return *(volatile uint16_t*)(SRAM_BASE_ADDRESS + address);
}

每次调用SRAM_Read 会出来很多个clk脉冲
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-7 19:01:40 | 显示全部楼层
每次调用出现6个FMC_CLK脉冲
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-7 19:05:25 | 显示全部楼层
调用一次SRAM_Read   出现6个FMC_clk脉冲,为啥呢,怎么才能只有一个脉冲呢

调用一次SRAM_Read出现6个FMC_CLK脉冲

调用一次SRAM_Read出现6个FMC_CLK脉冲
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-8 07:46:24 | 显示全部楼层
fan123 发表于 2025-1-7 19:01
每次调用出现6个FMC_CLK脉冲

这个务必要配置FMC地址空间的MPU/Cache属性为Strongly order或者Device模式。
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-8 09:30:52 | 显示全部楼层
eric2013 发表于 2025-1-8 07:46
这个务必要配置FMC地址空间的MPU/Cache属性为Strongly order或者Device模式。

大佬,这个有具体的操作方式么,困扰我三天了,有偿。
目前我是再FMC初始化后 (STM32F429,之后再移植到stm32H7)
SCB->CCR &= ~(1<<17);
  SCB->CCR &= ~(1<<16);
  FMC_Bank1->BTCR[0] = (FMC_Bank1->BTCR[0] & ~FMC_BCR1_MWID) | FMC_BCR1_MWID_0;
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-8 16:19:38 | 显示全部楼层
我把FMC变成SRAM模式,但是FMC_CLK彻底没了,怎么才能让他出一个时钟脉冲呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-9 06:38:43 | 显示全部楼层
fan123 发表于 2025-1-8 09:30
大佬,这个有具体的操作方式么,困扰我三天了,有偿。
目前我是再FMC初始化后 (STM32F429,之后再移植 ...

把你当前的原理图接线情况截图下,我看下你的FMC地址范围多少。

然后你当前的MPU/Cache配置是什么样的,也贴下代码
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-9 13:12:09 | 显示全部楼层
eric2013 发表于 2025-1-9 06:38
把你当前的原理图接线情况截图下,我看下你的FMC地址范围多少。

然后你当前的MPU/Cache配置是什么样的 ...

这个没接线,空载发波形。直接是STM32CubeMX 生成的代码,生成的代码就是
static 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_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_32;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_ENABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WrapMode = FMC_WRAP_MODE_DISABLE;
  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_ENABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 0;
  Timing.AddressHoldTime = 1;
  Timing.DataSetupTime = 1;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 2;
  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万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-10 07:33:18 | 显示全部楼层
fan123 发表于 2025-1-9 13:12
这个没接线,空载发波形。直接是STM32CubeMX 生成的代码,生成的代码就是
static void MX_FMC_Init(void ...

你是要测试FMC的速度吧。

这种情况,你的NE1片选地址范围的MPU/Cache属性为Strongly order或者Device模式。

我早期做的测试

STM32H7的FMC做纯软件IO输出控制可以输出40MHz方波
https://forum.anfulai.cn/forum.p ... 1282&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-10 09:17:12 | 显示全部楼层
eric2013 发表于 2025-1-10 07:33
你是要测试FMC的速度吧。

这种情况,你的NE1片选地址范围的MPU/Cache属性为Strongly order或者Device ...

我是想发出一楼的那个时序,FMC能做到么
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-11 06:50:26 | 显示全部楼层
fan123 发表于 2025-1-10 09:17
我是想发出一楼的那个时序,FMC能做到么

可以试试外接PSRAM的同时模式。
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-13 09:12:09 | 显示全部楼层
试了PSRAM模式就是出现调用一次FMC 出现4个clk了(stm32f429)
回复

使用道具 举报

3

主题

19

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-16 15:52:58 | 显示全部楼层
eric2013 发表于 2025-1-11 06:50
可以试试外接PSRAM的同时模式。

大佬,这种只能IO模拟这个波形么
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-17 06:18:24 | 显示全部楼层
fan123 发表于 2025-1-16 15:52
大佬,这种只能IO模拟这个波形么

那不方便了,也许只能模拟了。

看看能不能搞个骚操作,这个时钟用PWM代替,其他继续用FMC的SRAM方式
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 03:07 , Processed in 0.064194 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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