STM32 之 SDRAM 详解

news2024/11/16 15:44:21

 

目录

 

前言

一、SDRAM 简介

二、SDRAM的组成原理 

2.1存储单元阵列

2.1.1地址译码

2.1.2存储电容

2.2控制逻辑

2.2.1时钟同步

2.2.2命令解码

2.2.3模式寄存器

2.3数据输入 / 输出缓冲

2.3.1数据总线

2.3.2数据锁存

2.4刷新电路

2.4.1自动刷新

2.4.2自刷新

三、STM32 与 SDRAM 的连接

1.硬件连接

2.时钟配置

四、应用实例

1.硬件连接

2.软件实现

3.测试程序 

五、总结

 


前言

        在嵌入式系统开发中,当需要处理大量数据或者运行复杂的程序时,STM32 内部的存储资源可能会显得不足。这时,外接 SDRAM(同步动态随机存取存储器)就成为了一种有效的解决方案。本文将详细介绍 STM32 与 SDRAM 的连接和使用方法。

一、SDRAM 简介

        SDRAM 是一种同步动态随机存取存储器,它具有容量大、速度快、价格相对较低等优点。SDRAM 需要外部时钟信号进行同步操作,并且可以进行高速的数据读写。在嵌入式系统中,SDRAM 通常被用作程序运行空间、数据存储区或者图形缓冲区等。

二、SDRAM的组成原理 

2.1存储单元阵列

SDRAM 的核心是存储单元阵列,它由大量的存储单元组成。每个存储单元可以存储一位数据(在某些类型的 SDRAM 中也可以存储多位数据)。存储单元通常以矩阵的形式排列,行和列的交叉点就是一个存储单元。

2.1.1地址译码
  • 通过行地址和列地址译码器来选择特定的存储单元。当给定一个地址时,地址译码器将其转换为行地址和列地址,分别激活相应的行线和列线,从而选中特定的存储单元。
  • 这种地址译码方式可以有效地减少地址线的数量,提高存储密度。

2.1.2存储电容
  • 每个存储单元通常由一个存储电容和一个访问晶体管组成。存储电容用于存储数据,其充电状态表示逻辑 “1”,放电状态表示逻辑 “0”。
  • 由于存储电容会逐渐漏电,因此需要定期进行刷新操作,以保持数据的有效性。

2.2控制逻辑

SDRAM 的控制逻辑负责接收外部的控制信号,并根据这些信号来控制存储单元阵列的读写操作和刷新操作。

2.2.1时钟同步
  • SDRAM 是同步存储器,它需要一个外部时钟信号来进行同步操作。所有的读写操作和刷新操作都必须与时钟信号同步,以确保数据的正确传输。
  • 时钟信号的上升沿和下降沿可以分别用于触发不同的操作,例如在上升沿进行数据读取,在下降沿进行数据写入。

2.2.2命令解码
  • 控制逻辑接收来自外部的命令信号,例如读命令、写命令、刷新命令等。这些命令信号经过解码后,控制逻辑会执行相应的操作。
  • 例如,当接收到读命令时,控制逻辑会激活相应的地址译码器,选中特定的存储单元,并将存储单元中的数据输出到数据总线上。

2.2.3模式寄存器
  • SDRAM 通常具有一个模式寄存器,用于存储一些配置参数,例如 CAS 延迟、突发长度、刷新周期等。
  • 这些参数可以通过外部的命令来设置,以满足不同的应用需求。

2.3数据输入 / 输出缓冲

SDRAM 的数据输入 / 输出缓冲用于在存储单元阵列和外部数据总线之间传输数据。

2.3.1数据总线
  • SDRAM 通常具有一个数据总线,用于传输数据。数据总线的宽度可以是 8 位、16 位、32 位等,具体取决于 SDRAM 的类型和应用需求。
  • 在进行读写操作时,数据通过数据总线在存储单元阵列和外部设备之间传输。

2.3.2数据锁存
  • 数据输入 / 输出缓冲通常具有数据锁存功能,用于在数据传输过程中保持数据的稳定性。
  • 当进行写操作时,外部数据首先被锁存在数据输入缓冲中,然后在适当的时候被写入存储单元阵列。当进行读操作时,存储单元阵列中的数据首先被读取到数据输出缓冲中,然后在适当的时候被输出到外部数据总线上。

2.4刷新电路

由于存储电容会逐渐漏电,因此 SDRAM 需要定期进行刷新操作,以保持数据的有效性。刷新电路负责产生刷新信号,并控制存储单元阵列的刷新操作。

2.4.1自动刷新
  • SDRAM 通常具有自动刷新功能,可以在一定的时间间隔内自动进行刷新操作。自动刷新可以通过外部的命令来启动,也可以由内部的定时器自动触发。
  • 在自动刷新过程中,刷新电路会依次选中存储单元阵列中的每一行,并对该行进行刷新操作。

2.4.2自刷新

SDRAM 还可以进入自刷新模式,在这种模式下,SDRAM 会停止接收外部的命令信号,并自动进行刷新操作。自刷新模式通常用于系统进入低功耗状态时,以保持数据的有效性。

三、STM32 与 SDRAM 的连接

1.硬件连接

  • STM32F429 通常通过 FMC(Flexible Memory Controller,灵活存储控制器)与 SDRAM 进行连接。FMC 可以配置为不同的存储模式,以适应不同类型的外部存储器。
  • 在连接 SDRAM 时,需要注意引脚的连接、时钟信号的提供、片选信号的控制等。通常,SDRAM 的数据线、地址线、控制线等需要与 STM32F429 的相应引脚进行连接,SDRAM信号线如下图所示:

 

2.时钟配置

SDRAM 需要外部时钟信号来进行同步操作。STM32F429 可以通过外部时钟源或者内部 PLL(锁相环)来提供 SDRAM 所需的时钟信号。在配置时钟时,需要根据 SDRAM 的规格要求来设置合适的时钟频率。

四、应用实例

以下是一个简单的应用实例,展示了如何在 STM32 上使用 SDRAM。在这个实例中,我们将使用 STM32F4 系列微控制器和一个 16MB 的 SDRAM 芯片。

1.硬件连接

  • 将 SDRAM 的数据线、地址线、控制线等与 STM32 的 FMC 引脚进行连接。具体的连接方式可以参考 STM32 的数据手册和 SDRAM 的数据手册。
  • 为 SDRAM 提供外部时钟信号。可以使用外部晶振或者其他时钟源来提供时钟信号。

2.软件实现

  • 首先,需要在 STM32 的工程中添加 FMC 的驱动库。可以从 STM32 的官方网站上下载相应的驱动库,并将其添加到工程中。
  • 然后,在代码中初始化 FMC 和 SDRAM。可以使用以下代码来初始化 FMC 和 SDRAM:
#include "stm32f4xx.h"
#include "stm32f4xx_fmc.h"

#define SDRAM_BASE_ADDR     ((uint32_t)0xC0000000)
#define SDRAM_SIZE          (16 * 1024 * 1024)

void SDRAM_Init(void)
{
    FMC_SDRAM_InitTypeDef SDRAM_InitStructure;
    FMC_SDRAM_TimingTypeDef SDRAM_Timing;

    /* 使能 FMC 时钟 */
    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);

    /* 配置 SDRAM 时序参数 */
    SDRAM_Timing.LoadToActiveDelay = 2;
    SDRAM_Timing.ExitSelfRefreshDelay = 7;
    SDRAM_Timing.SelfRefreshTime = 4;
    SDRAM_Timing.RowCycleDelay = 7;
    SDRAM_Timing.WriteRecoveryTime = 2;
    SDRAM_Timing.RPDelay = 2;
    SDRAM_Timing.RCDDelay = 2;

    /* 配置 SDRAM 初始化参数 */
    SDRAM_InitStructure.SDBank = FMC_SDRAM_Bank2;
    SDRAM_InitStructure.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
    SDRAM_InitStructure.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
    SDRAM_InitStructure.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
    SDRAM_InitStructure.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
    SDRAM_InitStructure.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
    SDRAM_InitStructure.WriteProtection = DISABLE;
    SDRAM_InitStructure.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
    SDRAM_InitStructure.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
    SDRAM_InitStructure.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;

    /* 初始化 SDRAM */
    FMC_SDRAM_Init(&SDRAM_InitStructure, &SDRAM_Timing);

    /* 使能 SDRAM */
    FMC_SDRAM_CommandSequenceEnable();
    FMC_SDRAM_RefreshRateSet(SDRAM_InitStructure.SDClockPeriod, SDRAM_InitStructure.ReadBurst, 768);
    FMC_SDRAM_CommandEnable(ENABLE);
}

在初始化完成后,就可以对 SDRAM 进行读写操作了。可以使用以下代码来对 SDRAM 进行读写操作:

void SDRAM_Write(uint32_t addr, uint16_t *data, uint32_t size)
{
    uint16_t *p = (uint16_t *)(SDRAM_BASE_ADDR + addr);
    for (uint32_t i = 0; i < size; i++)
    {
        *p++ = data[i];
    }
}

void SDRAM_Read(uint32_t addr, uint16_t *data, uint32_t size)
{
    uint16_t *p = (uint16_t *)(SDRAM_BASE_ADDR + addr);
    for (uint32_t i = 0; i < size; i++)
    {
        data[i] = *p++;
    }
}

3.测试程序 

为了验证 SDRAM 的读写操作是否正确,可以编写一个测试程序。以下是一个简单的测试程序:

int main(void)
{
    uint16_t data[] = {0x1111, 0x2222, 0x3333, 0x4444};
    uint16_t read_data[4];

    /* 初始化 SDRAM */
    SDRAM_Init();

    /* 向 SDRAM 写入数据 */
    SDRAM_Write(0, data, 4);

    /* 从 SDRAM 读取数据 */
    SDRAM_Read(0, read_data, 4);

    while (1)
    {
    }
}

在这个测试程序中,我们首先初始化了 SDRAM,然后向 SDRAM 写入了一些数据,最后从 SDRAM 读取数据并进行比较。如果读取的数据与写入的数据一致,则说明 SDRAM 的读写操作正确。

五、总结

        STM32 与 SDRAM 的连接和使用可以为嵌入式系统提供更大的存储容量和更高的运行速度。在使用 SDRAM 时,需要注意硬件连接、时钟配置、初始化、读写操作和刷新操作等方面的问题。通过合理地使用 SDRAM,可以提高嵌入式系统的性能和功能。希望本文对大家在使用 STM32 和 SDRAM 时有所帮助。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Parsec问题解决方案

Parsec目前就是被墙了&#xff0c;有解决方案但治标不治本&#xff0c;如果想稳定串流建议是更换稳定的串流软件&#xff0c;以下是一些解决方案 方案一&#xff1a;在%appdata%/Parsec/config.txt中&#xff0c;添加代理 app_proxy_address 127.0.0.1 app_proxy_scheme http…

每日OJ_牛客_乒乓球筐(字符串模拟)

目录 牛客_乒乓球筐&#xff08;简单模拟&#xff09; 解析代码 牛客_乒乓球筐&#xff08;简单模拟&#xff09; 乒乓球筐__牛客网 nowcoder有两盒&#xff08;A、B&#xff09;乒乓球&#xff0c;有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类&a…

Win10安装.net FrameWork3.5失败解决方法

win10安装.net FrameWork3.5失败解决方法 已经好久没有来投稿了,实在最近业务缠身,忙的焦头烂额(呵~多么伟大的牛马) 但最近开发使用windows11实在是拉胯的不行,升级完就后悔,所以就一怒之下,重装了win10 可是,好家伙,我重装完遇到一个问题,就是在使用.Net Framework3.5,按照Mi…

GB28181规范中broadcast和talk模式实际场景时间差别在哪里?

好多开发者对GB28181规范里面&#xff0c;broadcast和talk模式区分不清&#xff0c;今天借此机会&#xff0c;针对GB28181标准中的Broadcast&#xff08;广播&#xff09;和Talk&#xff08;对讲&#xff09;是两种不同的通信模式&#xff0c;它们在视频监控系统中扮演着不同的…

Javaweb项目实现文件导出功能

在我的项目中&#xff0c;我将模糊查询与文件导出结合使用&#xff0c;实现下载前端列表展示的数据到本地 导入maven坐标 <!--导出为表需要--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version&…

算法知识点————双指针【删除重复元素】【反转链表】

删除重复元素 题目&#xff1a;//给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数 思路&#xff1a…

CleanClip for mac(苹果电脑剪切板管理器)

CleanClip 是一款为 Mac 设计的强大剪贴板管理工具&#xff0c;它能够显著提升你的工作效率和生产力。无论是在日常办公中还是进行创意设计&#xff0c;CleanClip 都能帮助你更轻松地管理和使用剪贴板内容。让我们一起来探索一下这个功能丰富的软件吧&#xff01; 下载地址&am…

常见文档工具对比和选择

前言 文档工具的本质&#xff0c;其实都是将我们的文档内容标准化&#xff0c;在互联网环境上的文档&#xff0c;一般目前比较主流的是生成文档的 html 网页内容&#xff0c;而文档内容的作者都比较倾向于使用纯文本的 Markdown 进行书写&#xff0c;所以文档工具的核心内容主要…

蒙特卡罗方法——布丰投针实验近似计算圆周率python代码实现

布丰实验 数学原理 python代码 import random as rd import numpy as np import math import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.family] SimHei # 或者 Microsoft YaHei matplotlib.rcParams[axes.unicode_minus] False # 解决负号- …

标签的ref属性

标签的ref属性 当我们想要获取一个标签对应的 DOM 元素的时候在 JavaScript 中&#xff0c;我们通过 document.getElementById() 来借助类选择器的写法获取&#xff0c;但是在 Vue 中&#xff0c;我们的 DOM 元素是挂载在同一个网页上的&#xff0c;这些名称难免会重复&#x…

《计算机算法设计与分析》笔记

第一章 算法概述 1.1算法性质&#xff1a; 输入、输出、确定性、有限性 1.2时间复杂度 上界记号O&#xff1a;如果存在正的常数C和自然数N0&#xff0c;使得当N≧N0时有f(N)≦Cg(N)&#xff0c;则f(N)有上界函数g(N)&#xff0c;记为f(N) O(g(N))。 同阶记号θ&#xff1a;…

OpenAI 联合 SWE 发布 AI 软件工程能力测试集,Gru.ai 荣登榜首

在 9 月 3 日&#xff0c;Gru.ai 在 SWE-Bench-Verified 评估最新发布的数据中以 45.2% 的高分排名第一。SWE-Bench-Verified 是 OpenAI 联合 SWE 发布测试集&#xff0c;旨在更可靠的评估 AI 解决实际软件问题的能力。该测试集经由人工验证打标&#xff0c;被认为是评估 AI 软…

机器学习之 SVD降维:图像压缩示例

引言 在处理大规模数据集时&#xff0c;数据降维是一项非常重要的任务。通过降维&#xff0c;我们可以减少数据的存储需求、加快计算速度&#xff0c;并且在某些情况下还能提高模型的性能。SVD&#xff08;Singular Value Decomposition&#xff0c;奇异值分解&#xff09;是一…

《垃圾回收的算法与实现》-算法-摘抄

本文是书籍《垃圾回收的算法与实现》的摘抄&#xff0c;不涉及算法源码及步骤讲解模块。 预备 对象由头(header)和域(field)构成。 头&#xff1a;对象中保存对象本身信息的部分&#xff0c;主要含有以下信息&#xff1a;对象的大小和种类。 域&#xff1a;对象使用者在对象…

cocosCreator实现一个验证码弹窗验证功能

公开文章地址 在 Cocos Creator 中实现一个6位数的验证码输入弹窗功能。主要包含以下三点 1、 可以连续输入验证码 2、 可以粘贴验证码 3、 可以连续删除验证码 前言 引擎版本: Cocos Creator 2.7.2 开发语言: ts 效果图 实现思路 1、 在弹窗界面放置6个输入框的精灵,每个精…

各种无人机飞行服务技术详解

随着科技的飞速发展&#xff0c;无人机&#xff08;Unmanned Aerial Vehicles, UAVs&#xff09;技术已成为推动多个行业变革的重要力量。从军事侦察到商业应用&#xff0c;再到日常生活中的娱乐拍摄&#xff0c;无人机的身影无处不在。本文将详细解析无人机飞行服务所涉及的关…

【OpenCV-图像形态学操作】礼帽与黑帽、梯度运算、开运算与闭运算、形态学-膨胀操作、形态学-腐蚀操作

1 形态学-腐蚀操作 import cv2 img cv2.imread(./img/dige.png)cv2.imshow(img, img) cv2.waitKey(0) cv2.destroyAllWindows()# 创建一个 3x3 的结构元素&#xff08;内核&#xff09; # np.ones() 函数用于生成一个指定形状的数组&#xff0c;其中所有的元素都初始化为 1# …

服务器深度解析:五大关键问题一网打尽

在科技飞速发展的今天&#xff0c;服务器的重要性不言而喻。但对于服务器的一些关键问题&#xff0c;你真的清楚吗&#xff1f;今天&#xff0c;我们就来为大家深度解析服务器的五大关键问题&#xff0c;满满的干货知识&#xff0c;让你轻松了解服务器的奥秘。 一、“路” 与 …

NS3的3.36版本将Eclipse作IDE

1 配置Eclipse 1.1 安装JDK JDK的tar包下载传送门 下载之后&#xff0c;在当前目录解压&#xff08;以jdk1.8.0_333为例&#xff09;。 sudo mkdir /usr/lib/jvm # 在/usr/lib/jvm目录下新建目录 sudo mv jdk1.8.0_333 /usr/lib/jvm # 将解压的文件移动到我们的新建目录下…

Re-ReST: Reflection-Reinforced Self-Training for Language Agents论文学习

文章首先提到了一个推理-动作轨迹数据集的问题。这些数据集经常会包括一些需要多步推理的任务。但是&#xff0c;无论是让人去取得这些数据&#xff0c;还是让更高质量的模型代劳&#xff0c;成本都太高了。因此最好是自我监督&#xff0c;自己产生数据来学习&#xff08;self-…