1、驱动平台

开发板使用的是野火的STM32H750,需要驱动核心板上的SDRAM(2片装),SDRAM使用的是W9825G6KH-6,32MB@,组合一起成为64M。驱动方式使用STM32H750XB上的FMC进行驱动。通过使用HAL库上的stm32h7xx_hal_sdram.c里面的API进行配置。

2、SDRAM配置方式

1、初始化FMC对应的GPIO

1、开启FMC对应的GPIO时钟
2、将GPIO复用成FMC模式
3、使用HAL库初始化
代码如下:

  GPIO_InitStructure.Mode      = GPIO_MODE_AF_PP;//配置为复用功能GPIO_InitStructure.Pull      = GPIO_PULLUP;GPIO_InitStructure.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStructure.Alternate = GPIO_AF12_FMC;GPIO_InitStructure.Pin = FMC_A0_GPIO_PIN; HAL_GPIO_Init(FMC_A0_GPIO_PORT, &GPIO_InitStructure);.....

因为管脚太多了,就不一一列举了。

2、初始化SDRAM的时钟源

通过PLL分频,可以获得SDRAM的控制时钟,具体配置代码如下:

  RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FMC;RCC_PeriphClkInit.PLL2.PLL2M = 5;RCC_PeriphClkInit.PLL2.PLL2N = 144;RCC_PeriphClkInit.PLL2.PLL2P = 2;RCC_PeriphClkInit.PLL2.PLL2Q = 2;RCC_PeriphClkInit.PLL2.PLL2R = 3;RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;RCC_PeriphClkInit.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2;

3 、使能FMC时钟,并配置FMC的控制参数,写入SDRAM的时序参数

代码如下:

  __FMC_CLK_ENABLE();                             //使能FMC时钟hsdram1.Instance = FMC_SDRAM_DEVICE;/* hsdram1结构体初始化*/hsdram1.Init.SDBank = FMC_SDRAM_BANK2;hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;//SDRAM列数hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;//SDRAM行数hsdram1.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH;//总线数据宽度为32位hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;//4个扇区hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;//列地址选通信延时hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;//禁止写保护hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;//SDRAM时钟120MHzhsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;     //使能突发传输模式hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; //读通道延时/* SDRAM时序 */SdramTiming.LoadToActiveDelay = 2;//加载模式寄存器命令与行有效或刷新命令之间的延迟SdramTiming.ExitSelfRefreshDelay = 8;//退出自我刷新到行有效命令之间的延迟SdramTiming.SelfRefreshTime = 5;//行有效与预充电命令之间的延迟SdramTiming.RowCycleDelay = 8;//两个刷新命令或两个行有效命令之间的延迟SdramTiming.WriteRecoveryTime = 2;//写入命令到预充电命令之间的延迟SdramTiming.RPDelay = 2;//预充电与行有效命令之间的延迟SdramTiming.RCDDelay = 2;//行有效与列读写命令之间的延迟HAL_SDRAM_Init(&hsdram1, &SdramTiming);

4、初始化SDRAM,并进行预充电等处理

代码如下:

    uint32_t tmpr = 0;/* 配置命令:开启提供给SDRAM的时钟 */Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;Command.CommandTarget = FMC_COMMAND_TARGET_BANK;Command.AutoRefreshNumber = 1;Command.ModeRegisterDefinition = 0;/* 发送配置命令 */HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);/* Step 2: 延时100us */ SDRAM_delay(1);/* 配置命令:对所有的bank预充电 */ Command.CommandMode = FMC_SDRAM_CMD_PALL;Command.CommandTarget = FMC_COMMAND_TARGET_BANK;Command.AutoRefreshNumber = 1;Command.ModeRegisterDefinition = 0;/* 发送配置命令 */HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);   /* 配置命令:自动刷新 */   Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;Command.CommandTarget = FMC_COMMAND_TARGET_BANK;Command.AutoRefreshNumber = 8;Command.ModeRegisterDefinition = 0;/* 发送配置命令 */HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);/* 设置sdram寄存器配置 */tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |SDRAM_MODEREG_CAS_LATENCY_3           |SDRAM_MODEREG_OPERATING_MODE_STANDARD |SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;/* 配置命令:设置SDRAM寄存器 */Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;Command.CommandTarget = FMC_COMMAND_TARGET_BANK;Command.AutoRefreshNumber = 1;Command.ModeRegisterDefinition = tmpr;/* 发送配置命令 */HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);/* 设置刷新计数器 *//* 刷新周期=64ms/8192行=7.8125us *//* COUNT=(7.8125us x Freq) - 20 *//* 设置自刷新速率 */HAL_SDRAM_ProgramRefreshRate(&sdramHandle, 824);

配置参数来自于芯片手册,并通过自己配置的时钟进行计算得到的,注释上有些写。

完成后基本上SDRAM的初始化就完成了,剩下就是自行配置SDRAM相关的接口函数,比如:

SDRAM_ReadBuffer();
SDRAM_WriteBuffer();

等等、看个人需求。

5、遇坑提醒

在没有使用STM32CubeMX配置的工程中,很多人都会将stm32h7xx_ll_xxx.c等文件去掉,我在移植使用的时候,编译时出现了这么几个错误:

Error[Li005]: no definition for "FMC_SDRAM_ProgramRefreshRate" [referenced from
Error[Li005]: no definition for "FMC_SDRAM_SendCommand" [referenced from
Error[Li005]: no definition for "FMC_SDRAM_Init" [referenced from
Error[Li005]: no definition for "FMC_SDRAM_Timing_Init" [referenced from

出现这问题就是源于没有将stm32h7xx_ll_fmc.c这个文件包含进来,因为这个文件包含了FMC的底层驱动,而stm32h7xx_hal_sdram.c是依赖stm32h7xx_ll_fmc.c里面的底层驱动来编写的。

STM32使用HAL库驱动SDRAM相关推荐

  1. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  2. STM32 HAL库 驱动 MT6701 磁编码器

    写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...

  3. STM32用HAL库移植LORA(SX1276)的2.1版本驱动教程

    网上多数是STM32标准库LORA驱动2.0.0的例程,在此小编移植STM32的HAL库2.1.0版本LORA驱动,,但是有丢包现象需要调节参数,用的模块是安信可Ra-01 SX1278 LoRa,如 ...

  4. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...

  5. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  6. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  7. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  8. 正点原子STM32(基于HAL库)3

    目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...

  9. 【STM32】HAL库 ——DAC

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...

最新文章

  1. 计算机类公务员如何提升自己,大学毕业才发现:所学专业对考公务员如此重要,4类专业上岸率高...
  2. Linux系统日常维护命令
  3. Grafana展示DNS解析延时
  4. @loj - 2483@「CEOI2017」Building Bridges
  5. butterfly配置 hexo_Hexo博客之butterfly主题优雅魔改系列(持续更新)
  6. Delphi中对Jpeg格式文件的处理
  7. CSDN写博客添加代码两种方法
  8. delphi 18位身份证号码的校验
  9. windows任务栏黑屏不响应?
  10. 三角形面积的两种计算方法
  11. Vue.js入门 0x2 内置指令(1)
  12. ENVI标准格式文件转换为.tif文件——基于ENVI库函数
  13. 网络存储技术Windows server 2012 (项目五 存储服务器的数据快照计划与故障还原)
  14. 蓝牙控制esp-32单片机(四)
  15. python 3.10不支持torch,因而无法安装和使用cnocr
  16. IDEA中出现module not specified异常如何jiejue
  17. java 延时发送邮件_基于SpringBoot实现定时发送邮件过程解析
  18. 苹果手机丢了如何通过定位找回?iPhone手机丢失定位找回方法
  19. Oracle-实现Boolean类型字段
  20. vs+qt 在改完ui界面后在程序中出现找不到成员变量或者ui界面不更新。

热门文章

  1. 快看漫画升级为快看,用漫剧推动行业进入视频时代
  2. 中式红木装修,传统与艺术的碰撞
  3. MySQL数据库之基本语法
  4. PostgreSQL体系结构
  5. 判断请假时间去除周末及节假日
  6. ssm毕设项目校园快递代取系统20f19(java+VUE+Mybatis+Maven+Mysql+sprnig)
  7. 基于MySQL的电商零售订单数据分析
  8. 使用Nokia Software Updater升级诺基亚手机操作系统
  9. MATLAB 实现DES加解密
  10. php接口视频,56.com视频采集接口程序(PHP)