硬汉嵌入式论坛

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

[STM32H7] STM32H743驱动32bit SDRAM最高时钟是100MHz,实际测试120MHz也可以,提供个参考设置案例

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
发表于 2021-10-15 08:53:01 | 显示全部楼层 |阅读模式
H743官方手册标配说明是100MHz,超过的话属于超频,而我们配置主频为480MHz的话,需要单独配置个PLL设置到100MHz才行。

略显繁琐,这里提供个无需单独配置PLL的方法,仅需修改下面位置,让SDRAM运行在120MHz。

V7-563_emWin6.x实验_AppWizard使用emWin经典回调(RTOS).7z (36.98MB)

配置时钟到480MHz

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: SystemClock_Config
  4. *        功能说明: 初始化系统时钟
  5. *                    System Clock source            = PLL (HSE)
  6. *                    SYSCLK(Hz)                     = 480000000 (CPU Clock)
  7. *                   HCLK(Hz)                       = 240000000 (AXI and AHBs Clock)
  8. *                    AHB Prescaler                  = 2
  9. *                    D1 APB3 Prescaler              = 2 (APB3 Clock  120MHz)
  10. *                    D2 APB1 Prescaler              = 2 (APB1 Clock  120MHz)
  11. *                    D2 APB2 Prescaler              = 2 (APB2 Clock  120MHz)
  12. *                    D3 APB4 Prescaler              = 2 (APB4 Clock  120MHz)
  13. *                    HSE Frequency(Hz)              = 25000000
  14. *                   PLL_M                          = 5
  15. *                    PLL_N                          = 192
  16. *                    PLL_P                          = 2
  17. *                    PLL_Q                          = 4
  18. *                    PLL_R                          = 2
  19. *                    VDD(V)                         = 3.3
  20. *                    Flash Latency(WS)              = 4
  21. *        形    参: 无
  22. *        返 回 值: 无
  23. *********************************************************************************************************
  24. */
  25. static void SystemClock_Config(void)
  26. {
  27.         RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  28.         RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  29.         HAL_StatusTypeDef ret = HAL_OK;

  30.         HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

  31.         /*
  32.       1、芯片内部的LDO稳压器输出的电压范围,可选VOS1,VOS2和VOS3,不同范围对应不同的Flash读速度,
  33.          详情看参考手册的Table 12的表格。
  34.       2、这里选择使用VOS1,电压范围1.15V - 1.26V。
  35.     */
  36.         __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  37.         while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  38.         /* 使能HSE,并选择HSE作为PLL时钟源,如果USB使用HSI48的话,这里要开启*/
  39.         RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSE;
  40.         RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  41.         RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  42.         RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
  43.         RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  44.         RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  45.         RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  46.                
  47.         RCC_OscInitStruct.PLL.PLLM = 5;
  48.         RCC_OscInitStruct.PLL.PLLN = 192;
  49.         RCC_OscInitStruct.PLL.PLLP = 2;
  50.         RCC_OscInitStruct.PLL.PLLR = 2;
  51.         RCC_OscInitStruct.PLL.PLLQ = 4;               
  52.                
  53.         RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  54.         RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;        
  55.         ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  56.         if(ret != HAL_OK)
  57.         {
  58.         Error_Handler(__FILE__, __LINE__);
  59.         }

  60.         /*
  61.        选择PLL的输出作为系统时钟
  62.        配置RCC_CLOCKTYPE_SYSCLK系统时钟
  63.        配置RCC_CLOCKTYPE_HCLK 时钟,对应AHB1,AHB2,AHB3和AHB4总线
  64.        配置RCC_CLOCKTYPE_PCLK1时钟,对应APB1总线
  65.        配置RCC_CLOCKTYPE_PCLK2时钟,对应APB2总线
  66.        配置RCC_CLOCKTYPE_D1PCLK1时钟,对应APB3总线
  67.        配置RCC_CLOCKTYPE_D3PCLK1时钟,对应APB4总线     
  68.     */
  69.         RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
  70.                                                                  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);

  71.         RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  72.         RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  73.         RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  74.         RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
  75.         RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  76.         RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  77.         RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  78.         
  79.         /* 此函数会更新SystemCoreClock,并重新配置HAL_InitTick */
  80.         ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
  81.         if(ret != HAL_OK)
  82.         {
  83.         Error_Handler(__FILE__, __LINE__);
  84.         }

  85.     /*
  86.       使用IO的高速模式,要使能IO补偿,即调用下面三个函数
  87.       (1)使能CSI clock
  88.       (2)使能SYSCFG clock
  89.       (3)使能I/O补偿单元, 设置SYSCFG_CCCSR寄存器的bit0
  90.     */
  91.         __HAL_RCC_CSI_ENABLE() ;

  92.         __HAL_RCC_SYSCFG_CLK_ENABLE() ;

  93.         HAL_EnableCompensationCell();

  94.    /* AXI SRAM的时钟是上电自动使能的,而D2域的SRAM1,SRAM2和SRAM3要单独使能 */        
  95. #if 1
  96.         __HAL_RCC_D2SRAM1_CLK_ENABLE();
  97.         __HAL_RCC_D2SRAM2_CLK_ENABLE();
  98.         __HAL_RCC_D2SRAM3_CLK_ENABLE();
  99. #endif
  100.         
  101.         {
  102.                 /*
  103.                         USB工作需要48MHz的时钟,可以由PLL1Q,PLL3Q和HSI48提供
  104.                         PLL1Q用于给SDMMC提供时钟
  105.                     PLL3Q给LTDC提供时钟,也可以跟USB共用,不过得更USB设置相同的频率才可一起用。
  106.                     HSI48可以供USB独享,就是精度不是很高。
  107.                 */
  108.                 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
  109. #if 0
  110.                 /* PLL3-Q for USB Clock = 48M */
  111.                 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
  112.                 PeriphClkInitStruct.PLL3.PLL3M = 5;
  113.                 PeriphClkInitStruct.PLL3.PLL3N = 48;
  114.                 PeriphClkInitStruct.PLL3.PLL3P = 2;
  115.                 PeriphClkInitStruct.PLL3.PLL3Q = 5;
  116.                 PeriphClkInitStruct.PLL3.PLL3R = 2;
  117.                 PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_2;
  118.                 PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
  119.                 PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
  120.                 PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;
  121.                 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK)
  122.                 {
  123.                         Error_Handler(__FILE__, __LINE__);
  124.                 }        
  125. #else
  126.                 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
  127.                 PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
  128.                 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  129.                 {
  130.                         Error_Handler(__FILE__, __LINE__);
  131.                 }        
  132. #endif
  133.         }        
  134. }
复制代码


SDRAM仅需修改参数hsdram.Init.ReadPipeDelay  为 FMC_SDRAM_RPIPE_DELAY_1即可

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: bsp_InitExtSDRAM
  4. *        功能说明: 配置连接外部SDRAM的GPIO和FMC
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void bsp_InitExtSDRAM(void)
  10. {
  11.     SDRAM_HandleTypeDef      hsdram = {0};
  12.         FMC_SDRAM_TimingTypeDef  SDRAM_Timing = {0};
  13.         FMC_SDRAM_CommandTypeDef command = {0};

  14.    
  15.         /* FMC SDRAM所涉及到GPIO配置 */
  16.         SDRAM_GPIOConfig();

  17.         /* SDRAM配置 */
  18.         hsdram.Instance = FMC_SDRAM_DEVICE;

  19.         /*
  20.        FMC使用的HCLK3时钟,200MHz,用于SDRAM的话,至少2分频,也就是100MHz,即1个SDRAM时钟周期是10ns
  21.        下面参数单位均为10ns。
  22.     */
  23.         SDRAM_Timing.LoadToActiveDelay    = 2; /* 20ns, TMRD定义加载模式寄存器的命令与激活命令或刷新命令之间的延迟 */
  24.         SDRAM_Timing.ExitSelfRefreshDelay = 7; /* 70ns, TXSR定义从发出自刷新命令到发出激活命令之间的延迟 */
  25.         SDRAM_Timing.SelfRefreshTime      = 4; /* 50ns, TRAS定义最短的自刷新周期 */
  26.         SDRAM_Timing.RowCycleDelay        = 7; /* 70ns, TRC定义刷新命令和激活命令之间的延迟 */
  27.         SDRAM_Timing.WriteRecoveryTime    = 2; /* 20ns, TWR定义在写命令和预充电命令之间的延迟 */
  28.         SDRAM_Timing.RPDelay              = 2; /* 20ns, TRP定义预充电命令与其它命令之间的延迟 */
  29.         SDRAM_Timing.RCDDelay             = 2; /* 20ns, TRCD定义激活命令与读/写命令之间的延迟 */

  30.         hsdram.Init.SDBank             = FMC_SDRAM_BANK1;               /* 硬件设计上用的BANK1 */
  31.         hsdram.Init.ColumnBitsNumber   = FMC_SDRAM_COLUMN_BITS_NUM_9;   /* 9列 */
  32.         hsdram.Init.RowBitsNumber      = FMC_SDRAM_ROW_BITS_NUM_12;     /* 12行 */
  33.         hsdram.Init.MemoryDataWidth    = FMC_SDRAM_MEM_BUS_WIDTH_32;        /* 32位带宽 */
  34.         hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;  /* SDRAM有4个BANK */
  35.         hsdram.Init.CASLatency         = FMC_SDRAM_CAS_LATENCY_3;       /* CAS Latency可以设置Latency1,2和3,实际测试Latency3稳定 */
  36.         hsdram.Init.WriteProtection    = FMC_SDRAM_WRITE_PROTECTION_DISABLE; /* 禁止写保护 */
  37.         hsdram.Init.SDClockPeriod      = SDCLOCK_PERIOD;                /* FMC时钟200MHz,2分频后给SDRAM,即100MHz */
  38.         hsdram.Init.ReadBurst          = FMC_SDRAM_RBURST_ENABLE;       /* 使能读突发 */
  39.         hsdram.Init.ReadPipeDelay      = FMC_SDRAM_RPIPE_DELAY_1;       /* 此位定CAS延时后延后多少个SDRAM时钟周期读取数据,实际测此位可以设置无需延迟 */

  40.         /* 配置SDRAM控制器基本参数 */
  41.         if(HAL_SDRAM_Init(&hsdram, &SDRAM_Timing) != HAL_OK)
  42.         {
  43.                 /* Initialization Error */
  44.                 Error_Handler(__FILE__, __LINE__);
  45.         }

  46.         /* 完成SDRAM序列初始化 */
  47.         SDRAM_Initialization_Sequence(&hsdram, &command);
  48. }
复制代码




回复

使用道具 举报

4

主题

46

回帖

58

积分

初级会员

积分
58
发表于 2021-10-15 16:13:44 | 显示全部楼层
我们的H7主控板量产了,测试发现
回复

使用道具 举报

4

主题

46

回帖

58

积分

初级会员

积分
58
发表于 2021-10-15 16:15:48 | 显示全部楼层
我做的一款设备,H7的,前段时间将频率提升到120M之后,发现部分板卡对SDRAM自检无法通过了,改成100M就可以,应该对SDRAM芯片质量有要求,量产还是建议按照官方的来
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
 楼主| 发表于 2021-10-15 16:56:24 | 显示全部楼层
dengxiaojundink 发表于 2021-10-15 16:15
我做的一款设备,H7的,前段时间将频率提升到120M之后,发现部分板卡对SDRAM自检无法通过了,改成100M就可以,应 ...

是的,分享个例子供那些需要的用户参考。
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

天宇

积分
24
发表于 2021-10-18 16:08:58 | 显示全部楼层
dengxiaojundink 发表于 2021-10-15 16:15
我做的一款设备,H7的,前段时间将频率提升到120M之后,发现部分板卡对SDRAM自检无法通过了,改成100M就可以,应 ...

应该是IO速度不够吧,我没看FMC的IO速度 ,但LTDC的IO速度最大只能108MHz。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 05:48 , Processed in 0.154650 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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