当前位置: 首页 > news >正文

STM32 之 SDRAM 详解

 

目录

 

前言

一、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 时有所帮助。

 

 

 

相关文章:

STM32 之 SDRAM 详解

目录 前言 一、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自刷新 三、S…...

基于图神经网络的最大独立集问题的目标分支

文章目录 Abstract1 Introduction2 Related Work分支顶点选择图神经网络Abstract 分支归约方法结合了分支约束原则和归约规则,在处理以前无法管理的现实世界实例方面特别成功。分支策略决定下一个要在哪个顶点上进行分支。最近,最广泛使用的策略是选择最高度的顶点。 在这项…...

【Qt】事件过滤器

事件过滤器 在 Qt 中&#xff0c;⼀个对象可能经常要查看或拦截另外⼀个对象的事件&#xff0c;如对话框想要拦截按键事件&#xff0c;不让别的组件接收到&#xff0c;或者修改按键的默认值等。通过上⾯的学习&#xff0c;我们已经知道&#xff0c;Qt 创建了 QEvent事件对象之后…...

字符串转换为整数、整数转换为字符串

整数转换为字符串 sprintf()它的功能是将各种类型的数据格式化为字符串&#xff0c;并存储到一个字符数组中。 sprintf 是 C 语言标准库中的一个函数&#xff0c;用于将格式化的数据写入一个字符串中。它的用法与 printf 类似&#xff0c;但不同的是&#xff0c;printf 输出到…...

解决samba无权限创建文件问题

将我服务器利用samba工具映射到到电脑后&#xff0c;没有权限在特定的文件里写文件&#xff0c;比如在mcu这个文件夹里面没有写文件的权限。 查看mcu文件夹的用户属性&#xff0c;属于root属性。 rootzwzn2064-CVN-Z690D5-GAMING-PRO:/home/zwzn2064# ls -ll total 9714860 dr…...

Ribbon快速了解

Ribbon 一、Ribbon 介绍 Ribbon 是一个客户端负载均衡器&#xff0c;它是 Netflix 开源的一个组件&#xff0c;常与 Spring Cloud 一起使用。 二、Ribbon 的作用 客户端负载均衡 Ribbon 可以在客户端实现负载均衡&#xff0c;即在服务消费者端根据一定的算法从多个服务提供者实…...

SpringBoot闲一品交易平台

SpringBoot闲一品交易平台 #vue项目实战 #计算机项目 #java项目 SpringBoot闲一品交易平台通过运用软件工程原理和开发方法&#xff0c;借助Spring Boot框架&#xff0c;旨在实现零食交易信息的高效管理&#xff0c;提升用户的购物体验和满意度。 技术栈 开发语言&#xff1a;…...

基于SpringBoot的物流管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的物流管理系统【附源码文档】、…...

uniapp微信小程序开发踩坑日记:Pinia持久化报错Cannot read property ‘localStorage‘ of undefined

插件默认使用 localStorage 实现持久化&#xff0c;小程序端不兼容&#xff0c;需要替换持久化 API import { defineStore } from pinia export const useCommonStore defineStore(pack-store, {state: (): State > ({wwInfo: {},globalData: {},timerLock: false, //是…...

负载均衡调度器--LVS

文章目录 集群和分布式集群分布式 LVS介绍LVS特点LVS工作原理LVS集群架构 LVS集群中的术语CIPVIPRSDIPRIP LVS集群的工作模式NAT模式DR模式DR的工作原理DR的特点:DR的网络配置1.配置负载均衡器2.配置后端服务器lo接口的作用 3.测试连接&#xff1a; DR的典型应用场景 TUN模式 L…...

TinyWebSever源码逐行注释(五)_ http_conn.cpp

前言 项目源码地址 项目详细介绍 项目简介&#xff1a; Linux下C轻量级Web服务器&#xff0c;助力初学者快速实践网络编程&#xff0c;搭建属于自己的服务器. 使用 线程池 非阻塞socket epoll(ET和LT均实现) 事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机…...

windows手工杀毒-寻找可疑进程之句柄

上篇回顾&#xff1a;windows手工杀毒-寻找可疑进程之内存-CSDN博客 上篇中我们介绍了如果通过进程的内存分析进程是否是可疑进程&#xff0c;主要是通过查看是否有可写可执行的内存页。也可以通过查看内存内容&#xff0c;看是否是可疑内容&#xff0c;不过这个可能需…...

java开发后端

1.BeanUtils.toBean 方法 它是一个常见的 Java 工具方法&#xff0c;用于将一个 JavaBean 对象转换为另一个 JavaBean 对象 FlowOrderDO flowOrder BeanUtils.toBean(createReqVO, FlowOrderDO.class); 这行代码使用了 BeanUtils.toBean 方法&#xff0c;它是一个常见的 Ja…...

Redis 的标准使用规范之数据类型使用规范

数据类型使用规范 提示&#xff1a;以下是本篇文章正文内容&#xff0c;可供参考 (1)、字符文本&#xff08;STRING&#xff09; 【建议】选型为简易文本类缓存 &#xff1a;比如普通的字符、文本、Json 结构 &#xff0c;通常能起到加速读写和降低后端压力的作用。 【建议】…...

人工智能技术导论——基于产生式规则的机器推理

在引出本章的内容之前先介绍一个概念 知识 知识的概念 知识&#xff08;Knowledge&#xff09;是人们在改造客观世界的实践中形成的对客观事物&#xff08;包括自然的和人造的&#xff09;及其规律的认识&#xff0c;包括对事物的现象、本质、状态、关系、联系和运动等的认识…...

Apache Guacamole 安装及配置VNC远程桌面控制

文章目录 官网简介支持多种协议无插件浏览器访问配置和管理应用场景 Podman 部署 Apache Guacamole拉取 docker 镜像docker-compose.yml部署 PostgreSQL生成 initdb.sql 脚本部署 guacamole Guacamole 基本用法配置 VNC 连接 Mac 电脑开启自带的 VNC 服务 官网 https://guacam…...

在Linux中从视频流截取图片帧(ffmpeg )

Linux依赖说明: 说明: 使用到的 依赖包 1. ffmpegsudo apt update sudo apt-get install ffmpeg2. imagemagick (选装) (检测图像边缘信息推断清晰度,如果是简单截取但个图像帧>用不到<)sudo apt-get install imagemagick备注: 指令及相关参数说明核心指令: (作用: 执…...

使用脚手架来创建 express 项目

使用脚手架&#xff08;scaffold&#xff09;可以快速搭建Express应用程序的基本结构。Express自身提供了一个官方脚手架工具叫做express-generator&#xff0c;它可以帮助你快速地生成一个包含基本文件结构的Express项目。 安装Express Generator 首先&#xff0c;你需要全局…...

单片机常用的软件架构

参考 9种单片机常用的软件架构...

服务器模型 Reactor 和 Proactor

Proactor 具体流程如下&#xff1a; 处理器发起异步操作&#xff0c;并关注 IO 完成事件&#xff1b;事件分离器等待操作完成事件&#xff1b;分离器等待过程中&#xff0c;内核并行执行实际的 IO 操作&#xff0c;并将结果存储入用户自定义的缓冲区&#xff0c;最后通知事件分…...

使用 Grype 检查 .jar 包中的漏洞

在开发和部署 Java 应用时&#xff0c;确保依赖库和项目文件中的安全性至关重要。Grype 是一款强大的开源工具&#xff0c;用于扫描项目文件&#xff08;如 .jar 包&#xff09;中的已知漏洞。本篇博客将介绍如何手动安装 Grype 并使用它检测 .jar 包中的安全漏洞。 一、手动安…...

IDEA 常用插件推荐,美观又实用!

1、 TONGYl Lingma - Your Al Coding Assistant. Type less, Code more. 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&…...

浮点数精度问题

为什么会产生精度问题&#xff1f; 我们带着这个问题去探寻浮点数二进制的存储原理 浮点数是怎么存在计算机中的&#xff1f; 浮点数在计算机中的表示通常遵循IEEE 754标准。其基本概念如下&#xff1a; 结构&#xff1a;浮点数由三部分组成&#xff1a; 符号位&#xff08;…...

RK3576芯片在智能家居里中型智慧屏产品的应用方案分析

智能家居在近年来得到了快速发展&#xff0c;AI技术不断发展&#xff0c;人机交互十分成熟&#xff0c;各种家电也都迎来了智能化浪潮&#xff0c;智能家居为人们提供了优秀的产品体验&#xff0c;受到主流消费者的青睐&#xff0c;智能家居里的中型智慧屏产品也随之兴起。 瑞芯…...

什么是生成式 AI?

人工智能 (AI) 通过使用机器学习与环境交互并执行任务来模仿人类行为&#xff0c;而无需明确指示要输出的内容。 生成式 AI 描述 AI 中用于创建原创内容的一类功能。 人员通常与聊天应用程序中内置的生成式 AI 交互。 此类应用程序的一个常见示例是 Microsoft Copilot&#xf…...

计算机网络期末试题及答案

一、选择题(每空2分&#xff0c;共20分) 1、下列关于常用交换技术的描述不正确的是&#xff08; &#xff09;。 A、电路交换是面向连接可靠的&#xff0c;适合大量的、连续的数据传输。 B、分组交换采用存储转发方式&#xff0c;以较小的固定长度的分组作为数据传输单…...

MySQL中DML操作(一)

添加数据&#xff08;INSERT&#xff09; 1.选择插入 INSERT INTO 表名(列名1 , 列名2 , 列名3......) VALUES(值1 , 值2 , 值3......); 示例&#xff1a; 向departments表中添加一条数据&#xff0c;部门名称为market&#xff0c;工作地点ID为1。 insert into department…...

Django 模板继承

Django 模板继承的语法主要涉及两个关键标签&#xff1a;{% extends %} 和 {% block %}。 语法详解 {% extends %}&#xff1a; 用于指定当前模板继承自哪个父模板。语法&#xff1a;{% extends "父模板的路径" %} {% extends "base.html" %}{% block %}&…...

黑马点评17——多级缓存-Lua语法

文章目录 Lua语法初始Lua变量和循环条件控制、函数 变量和循环函数和条件控制 Lua语法 初始Lua https://www.lua.org/ 魔兽的一些插件就是用lua开发的。 centOs已经装好了lua&#xff0c;直接用~ 变量和循环 条件控制、函数 变量和循环 函数和条件控制...

如何在Linux 上运行 SciChart WPF图表控件?

SciChart – 一个跨平台图表库&#xff0c;可实现 Windows Presentation Foundation (WPF)、JavaScript 以及原生 iOS (Swift/Objective-C) 和 Android (Java/Kotlin)&#xff0c;基于代号为 Visual Xccelerator 的专有 C 渲染引擎。这提供了 SciChart 众所周知的速度和性能&am…...