STM32使用HAL库驱动SDRAM
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相关推荐
- STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...
- STM32 HAL库 驱动 MT6701 磁编码器
写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...
- STM32用HAL库移植LORA(SX1276)的2.1版本驱动教程
网上多数是STM32标准库LORA驱动2.0.0的例程,在此小编移植STM32的HAL库2.1.0版本LORA驱动,,但是有丢包现象需要调节参数,用的模块是安信可Ra-01 SX1278 LoRa,如 ...
- 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...
- 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...
- 【STM32】HAL库 STM32CubeMX教程十四---SPI
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...
- 【STM32】HAL库 STM32CubeMX教程十---DAC
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- 正点原子STM32(基于HAL库)3
目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...
- 【STM32】HAL库 ——DAC
前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...
最新文章
- 在GitHub上搭建GitHub Pages博客-- Jekyll
- [论文笔记] Fast Quality Driven Selection of Composite Web Services (ECOWS, 2006)
- Ecshop显示商品销售数量
- axios队列 vue_(十三 )Vue 封装axios(四种请求)及相关介绍
- mysql 5.6到percona 5.6小版本升级
- 关于64位Linux编译hadoop2
- c语言用数组实现栈的插入,用数组实现栈的功能的C语言代码?
- Animation Studio插件怎么用?Nitrozme Animation Studio Packages Mac(AE插件拓展包) 安装教程
- cf卡序列号修改工具_王者荣耀无需Root修改荣耀战区软件和方法分享 全国地区可任意修改...
- 数据库基础知识——参考数据库基本概念6版
- mysql三高教程(二):2.7 如何约束数据
- CreateThread()使用实例
- fiddler在ios10.3系统抓包https失败原因解决
- 如何设置app字体跟随系统_Android中App字体大小不随系统改变而改变
- 五十岁才考上大学的柳永,半生风流半生坎坷!
- EVE-NG 入门教程 (Mac OSX BIg Sur)
- icon php图标集合,iconfont字体图标和各种css小图标的详解
- verilog HDLBits Verilog语法
- 51单片机设计简易计算机原理,基于AT89C51单片机简易计算器的设计(DOC).docx
- C++ Primer 读书笔记04
热门文章
- 点评2009年PHP十大图书(6)
- 全网完整版Python学习路线图(超详细适合零基础自学)
- 基于卷积神经网络和SVM分类器的汽车识别-matlab
- c语言弹琴小程序,非常好玩的弹钢琴小程序.doc
- 真正的高手,都在培养系统思维
- java计算机毕业设计考勤管理系统MyBatis+系统+LW文档+源码+调试部署
- matlab设计激光腔,基于Matlab软件的激光谐振腔振荡模式.doc
- 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束
- CF538B Quasi Binary
- Error:loading data from ……