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


所用工具:

1、芯片: STM32H743II

2、STM32CubeMx软件V6.4.0

3、IDE: MDK-Keil5软件

4、STM3H7xxHAL库

5、W9825G6KH

知识概括:

通过本篇博客您将学到:

SDRAM+FMC的基本原理

STM32CubeMX创建FMC-SDRAM例程

HAL库FMC函数库

SDRAM初始化

SDRAM的初始化,是由其内部的一个加载模式寄存 控制的,该寄存器框图如下:


  • A0~A2: Burst Length,即突发长度(简称 BL) 也就是在同一行中相邻的存储单元连续传输多少数据
  • A3: Addressing Mode 突发访问的模式,Sequential(顺序)或 Interleave(间隔)我们读数据都是连续读,一般不需要跳着读,所以用顺序模式
  • A4~A6: CAS Latency,即列地址选通延迟(简称 CL)在发出读命令 (命令同时包含列地址) 后,需要等待几个时钟周期数据线 Data才会输出有效数据
  • A7~A8: SDRAM 的工作模式。当它被配置为“00”的时候表示工作在正常模式,其它值是测试模式或被保留的设定。实际使用时必须配置成正常模式。
  • A9: Write Mode,:设置写操作的模式,可以选择突发模式或者单次写入模式

SDRAM指令

我们把SDRAM的信号线和控制指令再写一下

我们列一些常用的控制指令

还有上一节的CubeMX配置:


然后我们再来下面那些参数的配置:

  • Load mode register to active delaytRSC 加载模式寄存器命令与行有效或刷新命令之间的延迟
  • Exit self-refresh delay:tXSR 退出自我刷新到行有效命令之间的延迟
  • Self-refresh time : tRAS 自刷新周期
  • SDRAM common row cycle delay : tRC 刷新命令和激活命令之间的延迟
  • Write recovery time : tWR 写命令和预充电命令之间的延迟
  • SDRAM common row precharge delay: tRP 义预充电命令与其它命令之间的延迟
  • Row to column delay tRCD 定义行有效命令与读/写命令之间的延迟

我们查看《W9825G6KH》数据手册,即可看到对应的参数:

在CubeMX中点击对应参数,下面会出来对应的介绍:


这些参数在手册里都有详细的说明,我们看MIN最小时间就好

以tXSR,举个例子 我们SDRAM时钟为HCLK 2分频得到,为100MHZ 那么时钟周期就是 T=1/F =1/100MHz=10ns纳秒 那么tXSR最少为72ns,也就是最小要延迟8个时钟周期 所以我们设置为8

tRSC,最小为两个时钟周期tCK 所以我们设置为2

SDRAM初始化流程

SDRAM 上电后,必须进行初始化,才可以正常使用。

我们来看下SDRAM的初始化流程


  1. 给 SDRAM 上电,并提供稳定的时钟,延时100-200us;
  2. 发送“空操作”(NOP) 预充电命令,给所有 Bank 预充电;
  3. 发送“预充电”(PRECHARGE) 命令,控制所有 Bank 进行预充电,并等待 tRC 时间,tRC 表
    示预充电与其它命令之间的延迟;
  4. 发送至少 2 次 “自动刷新”(AUTO REFRESH) 命令,, 每一个自刷新命令之间的间隔时间为 tRC
  5. 发送“加载模式寄存器”(LOAD MODE REGISTER) 命令,配置 SDRAM 的工作参数,并等
    待 tRSC 时间, tRSC 表示加载模式寄存器命令与行有行或刷新命令之间的延迟;
  6. 初始化流程完毕,可以开始读写数据

tRC、tRFC、tRSC 这些参数在上一节已经介绍了

SDRAM读操作

  1. 发送“行有效”(ACTIVE) 命令,发送命令的同时包含行地址和 Bank 地址,然后等待 tRCD
    时间,tRCD 表示行有效命令与读/写命令之间的延迟;
  2. 发送“读”(READ) 命令,在发送命令的同时发送列地址,完成对 SDRAM的寻址。

对于读操作还有一个 CL 延迟(CAS Latency),根据模式寄存器的 CL 定义,延迟 CL 个时钟周期后,SDRAM 的数据线 DQ才输出有效数据,所以需要等待给定的 CL 延迟(2 个或 3 个
CLK)后,再从 DQ 数据线上读取数据。

  1. 读/写命令都通过拉高 A10 地址线,控制自动预充电,执行“预充电”(auto precharge) 命令后,需要等待 tRP 时间,tRP 表示预充电与其它命令之间
    的延迟;
  2. 图中的标号处的 tRAS,表示自刷新周期,即在前一个“行有效”与“预充电”命令之间的时
    间;
  3. 发送第二次“行有效”(ACTIVE) 命令准备读写下一个数据,在图中的标号处的 tRC,表示
    两个行有效命令或两个刷新命令之间的延迟。

SDRAM写操作

  1. 发送“行有效”(ACTIVE) 命令,发送命令的同时包含行地址和 Bank 地址,然后等待 tRCD
    时间,tRCD 表示行有效命令与读/写命令之间的延迟;
  2. 发送“写”(WRITE) 命令,在发送命令的同时发送列地址,完成寻址的地址输入。写命令是没有 CL 延迟的,主机在发送写命令的同时就可以把要写入的数据用 DQ 输入到 SDRAM 中,这是读命令与写命令的时序最主要的区别。

图中的读/写命令都通过地址线 A10 控制自动预充电,而 SDRAM 接收到带预充电要求的读/写命令后,并不会立即预充电,而是等待 tWR 时间才开始,tWR 表示写命令与预充电之间的延迟;

  1. 读/写命令都通过拉高 A10 地址线,控制自动预充电,执行“预充电”(auto precharge) 命令后,需要等待 tRP 时间,tRP 表示预充电与其它命令之间的延迟;
  2. 图中的标号处的 tRAS,表示自刷新周期,即在前一个“行有效”与“预充电”命令之间的时
    间;
  3. 发送第二次“行有效”(ACTIVE) 命令准备读写下一个数据,在图中的标号处的 tRC,表示
    两个行有效命令或两个刷新命令之间的延迟。

完整资料可进群免费领取!!!

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取:扫码进群领资料

举报
评论 0