STM32F429DISC开发板SDRAM(IS42S16400J)实验—基于STM32cubeMX HAL库

前言

就在几天由于受到了一点小刺激,狠下心就把F429DISC的开发板给买了,让后就变成穷13了。

但是既然买了,就得发挥他的作用,刚好STM32F103已经学完了,拿这个新外设练练手~~~~


工具与平台

  • keil5 MDK
  • STM32cubeMX
  • STM32F429I discovery开发板
  • discovery开发板 电路图
  • IS42S16400J技术手册
  • STM32F429 手册

查阅资料很重要!!!

参考原理图 技术手册 利用cubeMX初始化

F429的基本时钟配置和debug配置这里不做介绍

众所周知,SDRAM需要用到STM32的FMC外设
所以我们打开cubeMX的FMC界面

选择SDRAM1
在这里插入图片描述

在这里插入图片描述
Clock and chip enable选项

我们看原理图
在这里插入图片描述
在这里插入图片描述
PB5对应NE1,PB6对应CKE1
查询手册可知,PB5和PB6复用模式由SDNE1和SDCKE1
所以我们配置为:
在这里插入图片描述

在这里插入图片描述
这些数据我们可以查询IS42S16400J的技术手册
在这里插入图片描述
这里有十二位地址线

在这里插入图片描述
这张图我们知道数据宽度位16,bank数为4

上面配置完了,我们配置下面
在这里插入图片描述

SDRAM时序:
在这里插入图片描述
特征
在这里插入图片描述

最后记得设置PG13和PG14的LED,这里不做演示

初始化SDRAM

由图中HAL库红框的部分得知,FMC初始化后SDRAM还需要初始化
在这里插入图片描述
篮筐的部分得知,可以用初始化函数HAL_SDRAM_SendCommand()和初始化结构体FMC_SDRAM_CommandTypeDef来初始化
于是我们再查看IS42S16400J的手册

搜索初始化英文Initialization
发现
在这里插入图片描述
这里有初始化步骤
翻译一下

  • 上电
  • 初始化时钟延迟至少100us
  • 在一个无效命令或空操作后执行执行预充电延迟至少100us,所有bank都需要被预充电
  • 执行两个自动刷新周期
  • 配置模式寄存器

上电不用多说插上电源就行
详细说一下结构体
在这里插入图片描述
上代码

//初始化时钟
	FMC_SDRAM_CommandTypeDef Command;
	Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
	Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
	Command.AutoRefreshNumber = 1;
	Command.ModeRegisterDefinition = 0;
	HAL_SDRAM_SendCommand( &hsdram1,  &Command,  0xffff);
	HAL_Delay(1);
	
	//在一个无效命令或空操作后执行执行预充电
	Command.CommandMode = FMC_SDRAM_CMD_PALL;
	Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
	Command.AutoRefreshNumber = 1;
	Command.ModeRegisterDefinition = 0;
	HAL_SDRAM_SendCommand( &hsdram1,  &Command,  0xffff);
	HAL_Delay(1);
	
	//执行两个自动刷新周期
	Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
	Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK12;
	Command.AutoRefreshNumber = 2;
	Command.ModeRegisterDefinition = 0;
	HAL_SDRAM_SendCommand( &hsdram1,  &Command,  0xffff);
	HAL_Delay(1);

//配置模式寄存器
	Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
	Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
	Command.AutoRefreshNumber = 1;
	Command.ModeRegisterDefinition = 0x230;
	HAL_SDRAM_SendCommand( &hsdram1,  &Command,  0xffff);
	HAL_Delay(1);

这里说一下模式寄存器
在这里插入图片描述
A[2-0]:突发模式读取数,F429的SDRAM不支持突发模式,所以一次读一个,设置为000
A3 :1为间隔模式即每次读取4个字节会延迟一会儿,0为连续模式,我们选择连续模式,设置为0
A[6-4]:相当于CAS,我配置的数和cubeMX一样,设置为011
A[8-7]:没用,不管
A9:突发模式写,关了,设置1
配置模式寄存器为0b10 0011 0000 即0x230

配置IS42S16400J刷新率

通过F4的手册我们可以知道,初始化完成FMC和IS42S16400J之后还得配置IS42S16400J的刷新率
在这里插入图片描述

根据提示在手册中找到FMC_SDRTR寄存器
在这里插入图片描述
F429频率为180Mhz,经过cubeMX在这里的二分频,得到90Mhz就是SDRAM时钟频率。在这里插入图片描述
IS42S16400J刷新周期和行数可以在IS42S16400J得手册中查找:
在这里插入图片描述
4096行,刷新率64ms

所以我们可以得到Refresh Rate为1407
让后

HAL_SDRAM_ProgramRefreshRate(&hsdram1 , 1407);

将数据存入SDRAM

初始化一个于内存大小相同的数组并将该数组存放位置改变到SDRAM中

uint32_t pbuf[(1024*1024*64)/32] __attribute__((at(0xD0000000)));
/*******************************************
解释
int x __attribute__((at(ADDR)));
可以将x存放在指定的地址ADDR中
********************************************/

验证是否正确

设置PG13和PG14的LED来表示读取错误与否
在这里插入图片描述
测试结果在这里插入图片描述

设置断点使用DEBUG功能验证
在这里插入图片描述

全速运行至断点
在这里插入图片描述

让后查看DEBUG过程
在这里插入图片描述

后记

给我点赞哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值