STM32F429DISC开发板SDRAM(IS42S16400J)实验—基于STM32cubeMX HAL库
Posted QWQ_DIODA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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过程
后记
给我点赞哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
以上是关于STM32F429DISC开发板SDRAM(IS42S16400J)实验—基于STM32cubeMX HAL库的主要内容,如果未能解决你的问题,请参考以下文章
STM32F429开发板用户手册第18章 STM32F429的GPIO应用之跑马灯
STM32F429开发板用户手册第19章 STM32F429的GPIO应用之按键FIFO
STM32F429开发板用户手册第21章 STM32F429的NVIC中断分组和配置(重要)
STM32F429开发板用户手册第23章 STM32F429的USART串口基础知识和HAL库API