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. 在GitHub上搭建GitHub Pages博客-- Jekyll
  2. [论文笔记] Fast Quality Driven Selection of Composite Web Services (ECOWS, 2006)
  3. Ecshop显示商品销售数量
  4. axios队列 vue_(十三 )Vue 封装axios(四种请求)及相关介绍
  5. mysql 5.6到percona 5.6小版本升级
  6. 关于64位Linux编译hadoop2
  7. c语言用数组实现栈的插入,用数组实现栈的功能的C语言代码?
  8. Animation Studio插件怎么用?Nitrozme Animation Studio Packages Mac(AE插件拓展包) 安装教程
  9. cf卡序列号修改工具_王者荣耀无需Root修改荣耀战区软件和方法分享 全国地区可任意修改...
  10. 数据库基础知识——参考数据库基本概念6版
  11. mysql三高教程(二):2.7 如何约束数据
  12. CreateThread()使用实例
  13. fiddler在ios10.3系统抓包https失败原因解决
  14. 如何设置app字体跟随系统_Android中App字体大小不随系统改变而改变
  15. 五十岁才考上大学的柳永,半生风流半生坎坷!
  16. EVE-NG 入门教程 (Mac OSX BIg Sur)
  17. icon php图标集合,iconfont字体图标和各种css小图标的详解
  18. verilog HDLBits Verilog语法
  19. 51单片机设计简易计算机原理,基于AT89C51单片机简易计算器的设计(DOC).docx
  20. C++ Primer 读书笔记04

热门文章

  1. 点评2009年PHP十大图书(6)
  2. 全网完整版Python学习路线图(超详细适合零基础自学)
  3. 基于卷积神经网络和SVM分类器的汽车识别-matlab
  4. c语言弹琴小程序,非常好玩的弹钢琴小程序.doc
  5. 真正的高手,都在培养系统思维
  6. java计算机毕业设计考勤管理系统MyBatis+系统+LW文档+源码+调试部署
  7. matlab设计激光腔,基于Matlab软件的激光谐振腔振荡模式.doc
  8. 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束
  9. CF538B Quasi Binary
  10. Error:loading data from ……