STM32的SRAM

news2025/2/25 21:37:50

文章目录

  • SRAM的概念
    • XM8A51216介绍
      • 特点
      • 连接线原理框图
      • 硬件连接图
  • SRAM的配置
    • 使能 FSMC 时钟,并配置 FSMC 相关的 IO 及其时钟使能
    • 初始化FSMC,设置FSMC BANK1区域3
    • 使能 BANK1 区域 3
    • FSMC读写代码

SRAM的概念

SRAM的介绍
STM32F407ZGT6自带了 192K字节的 SRAM。内存要求高的场合, STM32F4自带的这些内存就不够用了。

XM8A51216介绍

XM8A51216 是深圳星忆存储科技有限公司生产的一颗(512*16,即 1M 字节)容量的 CMOS 静态内存芯片。
啥是CMOS?

特点

该芯片具有如下几个特点:
⚫ 高速。具有最高访问速度 10/12ns。
⚫ 低功耗。
⚫ TTL 电平兼容。
⚫ 全静态操作。不需要刷新和时钟电路。
⚫ 三态输出。
⚫ 字节控制功能。支持高/低字节控制。

连接线原理框图

在这里插入图片描述
A0~18 为地址线,总共 19 根地址线(即 2^19=512K,1K=1024);
DQ0~15 为数据线,总共 16 根数据线。
CEn 是芯片使能信号,低电平有效;
OEn 是输出使能信号,低电平有效;
WEn 是写使能信号,低电平有效;
BLEn 和 BHEn 分别是高字节控制和低字节控制信号;

硬件连接图

在这里插入图片描述 A[0:18]接 FMSC_A[0:18](不过顺序错乱了)
D[0:15]接 FSMC_D[0:15]
BHEn 接 FSMC_NBL1
BLEn 接 FSMC_NBL0
OEn 接 FSMC_OE
WEn 接 FSMC_WE
CEn 接 FSMC_NE3

  • XM8A51216 的 A[0:18]并不是按顺序连接 STM32F1 的 FMSC_A[0:18],不过这并不影响我们正常使用外部 SRAM,因为地址具有唯一性。

SRAM的配置

使用 FSMC的 BANK1 区域 3来控制 XM8A51216。
在这里插入图片描述PB15 控制背光?
在这里插入图片描述初始化 FSMC 主要是初始化三个寄存器 FSMC_BCRx,FSMC_BTRx,FSMC_BWTRx

使能 FSMC 时钟,并配置 FSMC 相关的 IO 及其时钟使能

要使用 FSMC,当然首先得开启其时钟。然后需要把FSMC_D015,FSMCA018 等相关IO 口,全部配置为复用输出,并使能各 IO 组的时钟。使能 FSMC 时钟的方法:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);

#include "sram.h"
#include "usart.h"
//使用 NOR/SRAM 的 Bank1.sector3,地址位 HADDR[27,26]=10
//对 IS61LV25616/IS62WV25616,地址线范围为 A0~A17
//对 IS61LV51216/IS62WV51216,地址线范围为 A0~A18
//对 XM8A51216,地址线范围为 A0~A18
#define Bank1_SRAM3_ADDR ((u32)(0x68000000))
//初始化外部 SRAM
void FSMC_SRAM_Init(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NSInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|
RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
GPIO_InitStructure.GPIO_Pin = 0xFF33; //PORTD 复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0xFF83; //PORTE 复用推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0xF03F; //PORTD 复用推挽输出
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0x043F; //PORTD 复用推挽输出
GPIO_Init(GPIOG, &GPIO_InitStructure);

初始化FSMC,设置FSMC BANK1区域3

固件库提供了 3 个 FSMC 初始化函数分别为

FSMC_NORSRAMInit()FSMC_NANDInit()FSMC_PCCARDInit()

这三个函数分别用来初始化 4 种类型存储器。
用来初始化NOR 和 SRAM 使用同一个函数 FSMC_NORSRAMInit()。
此部分包括设置区域 3 的存储器的工作模式、位宽和读写时序等。
本章我们使用模式 A、16 位宽,读写共用一个时序寄存器。使用的函数是:

void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct)

结构体指针:

typedef struct
{
uint32_t FSMC_Bank;
uint32_t FSMC_DataAddressMux;
uint32_t FSMC_MemoryType;
uint32_t FSMC_MemoryDataWidth;
uint32_t FSMC_BurstAccessMode;
uint32_t FSMC_AsynchronousWait;
uint32_t FSMC_WaitSignalPolarity;
uint32_t FSMC_WrapMode;
uint32_t FSMC_WaitSignalActive;
uint32_t FSMC_WriteOperation;
uint32_t FSMC_WaitSignal;
uint32_t FSMC_ExtendedMode;
uint32_t FSMC_WriteBurst;
FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
}FSMC_NORSRAMInitTypeDef;

前面13 个基本类型(unit32_t)的成员变量用来配置片选控制寄存器 FSMC_BCRx。
最后两个SMC_NORSRAMTimingInitTypeDef 指针类型的成员变量用来配置寄存器 FSMC_BTRx 和 FSMC_BWTRx
下面我们主要来看看模式 A下的相关配置参数:

  • FSMC_Bank
    ○ 用来设置使用到的存储块标号和区号,前面讲过
    ○ 存储块 1 区号 4,所以选择值为FSMC_Bank1_NORSRAM4。
  • FSMC_MemoryType
    用来设置存储器类型,我们这里是 SRAM,所以选择值为FSMC_MemoryType_SRAM。
  • FSMC_MemoryDataWidth
    用来设置数据宽度,可选 8 位还是 16 位,这里我们是 16 位数据宽度,所以选择值为 FSMC_MemoryDataWidth_16b。
  • FSMC_WriteOperation
    用来设置写使能,毫无疑问,我们前面讲解过我们要向 TFT 写数据,所以要写使能,这里我们选择 FSMC_WriteOperation_Enable。
  • FSMC_ExtendedMode
    是设置扩展模式使能位,也就是是否允许读写不同的时序,这里我们采取的读写不同时序,所以设置值为 FSMC_ExtendedMode_Enable。
    上面的这些参数是与模式 A 相关的
    下面我们也来稍微了解一下其他几个参数的意义吧:
  • FSMC_DataAddressMux
    用来设置地址/数据复用使能,若设置为使能,那么地址的低 16位和数据将共用数据总线,仅对 NOR 和 PSRAM 有效,所以我们设置为默认值不复用,值FSMC_DataAddressMux_Disable。

FSMC_BurstAccessMode , FSMC_AsynchronousWait , FSMC_WaitSignalPolarity ,FSMC_WaitSignalActive , FSMC_WrapMode , FSMC_WaitSignal FSMC_WriteBurst 和FSMC_WaitSignal 这些参数在成组模式同步模式才需要设置。
在这里插入图片描述

设 置 读 写 时 序 参 数 的 两 个 变 量 FSMC_ReadWriteTimingStruct 和FSMC_WriteTimingStruct,他们都是 FSMC_NORSRAMTimingInitTypeDef 结构体指针类型,这两个参数在初始化的时候分别用来初始化片选控制寄存器FSMC_BTRx和写操作时序控制寄存器 FSMC_BWTRx。
下面我们看看 FSMC_NORSRAMTimingInitTypeDef 类型的定义:

typedef struct
{
uint32_t FSMC_AddressSetupTime;
uint32_t FSMC_AddressHoldTime;
uint32_t FSMC_DataSetupTime;
uint32_t FSMC_BusTurnAroundDuration;
uint32_t FSMC_CLKDivision;
uint32_t FSMC_DataLatency;
uint32_t FSMC_AccessMode;
}FSMC_NORSRAMTimingInitTypeDef;

这个结构体有 7 个参数用来设置 FSMC 读写时序。
设计地址建立保持时间,数据建立时间等等配置等。
在这里插入图片描述

具体的设置方法请参考我们的 sarm.c 文件中的 FSMC_SRAM_Init()函数。
在这里插入图片描述
SRAM/NOR 闪存片选时序寄存器:FSMC_BTRx

readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间为 0 个 HCLK
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间模式 A 未用到
readWriteTiming.FSMC_DataSetupTime = 0x01; //数据保持时间为 1 个 HCLK
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式 A
FSMC_NSInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;// BTCR[4],[5]。
FSMC_NSInitStructure.FSMC_DataAddressMux= FSMC_DataAddressMux_Disable;
FSMC_NSInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM //SRAM
FSMC_NSInitStructure.FSMC_MemoryDataWidth= FSMC_MemoryDataWidth_16b;
//存储器数据宽度为 16bit
FSMC_NSInitStructure.FSMC_BurstAccessMode=FSMC_BurstAccessMode_Disable;
FSMC_NSInitStructure.FSMC_WaitSignalPolarity=FSMC_WaitSignalPolarity_Low;
FSMC_NSInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NSInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NSInitStructure.FSMC_WaitSignalActive=
FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NSInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
//存储器写使能
FSMC_NSInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NSInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
// 读写使用相同的时序
FSMC_NSInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NSInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
FSMC_NSInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;
FSMC_NORSRAMInit(&FSMC_NSInitStructure); //初始化 FSMC 配置


使能 BANK1 区域 3

FSMC 对不同的存储器类型同样提供了不同的使能函数:

void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState);
void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState);
void FSMC_PCCARDCmd(FunctionalState NewState);

NORSRAM函数是:
void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState);

FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);  

因为我们使用的是 BANK1 的区域 3,所以 HADDR[27:26]=10,故外部内存的首地址为0X68000000。
存储块1的地址

FSMC读写代码

//在指定地址开始,连续写入 n 个字节.
//pBuffer:字节指针
//WriteAddr:要写入的地址
//n:要写入的字节数
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)
{
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;
WriteAddr++;
pBuffer++;
}
}
//在指定地址开始,连续读出 n 个字节.
//pBuffer:字节指针
//ReadAddr:要读出的起始地址
//n:要写入的字节数
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
{
for(;n!=0;n--)
{
*pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);
ReadAddr+=1;
//址右移一位对齐.加 2 相当于加 1.
}
}

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

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

相关文章

[助人为乐]层次分析法

朋友论文需要用到层次分析法。于是回顾了一下。 相关资料推荐 层次分析法(AHP) 层次分析法(AHP)详细版本 用人话讲明白AHP层次分析法(非常详细原理简单工具实现) 层次分析法的流程图 构建层次结构模型(目标-准则-方案层) 深入…

认证服务---OAuth2.0基本介绍,微博登录整合到实际项目中【下篇】

前言 上一篇简单介绍了它的基本使用,这一篇就粗略说明一下如何在项目中实际应用 1、核心代码 1.1 认证微服务 当你进行了授权之后,跳转到一个新的地址。这个地址应该是你访问接口的地址。在这个接口中完成相应的access_token获取,以及调用…

docker-compose容器编排使用详解+示例

文章目录一、docker-compose概述1、产生的背景2、核心概念3、使用的三个步骤4、常用命令二、下载安装1、官方文档2、下载3、卸载三、使用compose1、前置知识,将一个springboot项目打包为镜像2、编写docker-compose.yml文件3、启动docker-compose4、停止一、docker-c…

[Linux]进程控制精讲,简单实现一个shell

目录 前言 进程创建 fork函数初识 写时拷贝 fork常见用法 fork调用失败的原因 进程终止 进程退出场景 进程退出码 查看进程退出码 退出码的含义 进程常见退出方法 exit VS _exit exit函数 _exit函数 二者的区别 return退出 进程等待 进程等待必要性 进程等待…

【Java文件操作】手把手教你拿捏IO 流

哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 文件操作,理解文件的概念以及,常用的操作文件的类和方法,FileInputStream 类 和 FileOutputStream , PrintWriter and Scnner, Reader and Wirter 确定不来看看…

Python机器学习:集成学习

前两天看了SVM、逻辑回归、KNN、决策树、贝叶斯分类这几个很成熟的机器学习方法,但是,今天不看方法了,来看一种思想:集成学习: 先来看一下集成学习的基本原理:通过融合多个模型,从不同的角度降…

3.4 随机变量的相互独立性

学习目标: 要学习二维随机变量的相互独立性,我会按照以下步骤进行: 学习独立性的概念:在概率论中,两个事件A和B是相互独立的,当且仅当它们的概率乘积等于它们的联合概率,即P(A∩B)P(A)P(B)。将…

【Java EE】-网络编程(二) Socket(套接字) + Udp版本客户端服务器 +Tcp版本客户端服务器

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 主要内容:传输层协议对应Socket编程,DatagramSocket,DatagramPacket,Udp版本的客户端和服务器,UdpEchoSeve…

大力出奇迹——GPT系列论文学习(GPT,GPT2,GPT3,InstructGPT)

目录说在前面1.GPT1.1 引言1.2 训练范式1.2.1 无监督预训练1.2.2 有监督微调1.3 实验2. GPT22.1 引言2.2 模型结构2.3 训练范式2.4 实验3.GPT33.1引言3.2 模型结构3.3 训练范式3.4 实验3.4.1数据集3.5 局限性4. InstructGPT4.1 引言4.2 方法4.2.1 数据收集4.2.2 各部分模型4.3 …

【轻NAS】Windows搭建可道云私有云盘,并内网穿透公网访问

文章目录1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置5. 公网访问测试6.结语1.前言 云存储作为近些年兴起的概念,成功吸引了各大互联网厂商下场&…

thingsboard ARM网关

G5501边缘计算网关 G5501是采用中高端的通用型 SOC,一款4 核 arm 架构 A55 处理器的 网关设备。标配处理器为 Cortex-A55 四核,最高主频 2GHz 的处理器, 内置 4GB DDR4 内存,32GB eMMC 存储。 集成Mali G52 2EE 图形处理器GPU&am…

matplotlib设置中文字体为微软雅黑

matplotlib无法设置任何中文字体怎么办? 如何在linux系统下让matplotlib显示中文? 下载微软雅黑字体,把它放在某个目录下。 链接: https://pan.baidu.com/s/1SCLYpH_MzY7vn0HA0wxxAw?pwdft2j 提取码:ft2j 在代码中加…

Learning C++ No.18【STL No.8】

引言: 北京时间:2023/3/18/21:47,周末,不摆烂,但是欠钱终于还是遭报应了,导致坐牢7小时(上午3.5,下午3.5),难受,充分意识到行哥是那么的和蔼可亲…

DLRover: 云上自动扩缩容 DeepRec 分布式训练作业

背景 如今,深度学习已广泛应用在搜索、广告、推荐等业务中,这类业务场景普遍有两个特点: 1)训练样本量大,需要分布式训练提升训练速度; 2)模型稀疏,即模型结构中离散特征计算逻辑占…

强训之【走方格的方案数和另类加法】

目录1.走方格的方案数1.1题目1.2思路讲解1.3代码展示2.另类加法2.1题目2.2思路讲解2.3代码展示3.选择题1.走方格的方案数 1.1题目 链接: link 描述 请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上…

第⑦讲:Ceph集群RGW对象存储核心概念及部署使用

文章目录1.RadosGW对象存储核心概念1.1.什么是RadosGW对象存储1.2.RGW对象存储架构1.3.RGW对象存储的特点1.4.对象存储中Bucket的特性1.4.不同接口类型的对象存储访问对比2.在集群中部署RadosGW对象存储组件2.1.部署RGW组件2.2.集群中部署完RGW组件后观察集群的信息状态2.3.修改…

【2023】Kubernetes之Pod与容器状态关系

目录简单创建一个podPod运行阶段:容器运行阶段简单创建一个pod apiVersion: v1 kind: pod metadata: name: nginx-pod spec:containers:- name: nginximages: nginx:1.20以上代码表示创建一个名为nginx-pod的pod资源对象。 Pod运行阶段: Pod创建后&am…

搜索引擎测试报告

文章目录一、项目背景二、项目功能三、测试目的四、测试环境五、测试计划1、功能测试2、自动化测试六、测试结果一、项目背景 java官方文档是我们在学习java语言中不可或缺的权威资料。相比于各种网站的Java资料,官方文档无论是语言表达还是组织方式都要更加全面和…

ThingsBoard开源物联网平台智慧农业实例快速部署教程(Ubuntu、CentOS适用)

ThingsBoard部署教程文档 文章目录ThingsBoard部署教程文档1. JDK环境安装2. 安装thingsBoard2.1 ThingsBoard软件包安装2.2 PostgreSQL安装2.3 PostgreSQL初始化配置3. 修改ThingsBord的配置4. 运行安装脚本测试5. 访问测试6. 导入一个仪表盘库6.1 导出仪表盘并导入自己的项目…

Spring —— Spring Boot 配置文件

JavaEE传送门JavaEE Spring —— Bean 作用域和生命周期 Spring —— Spring Boot 创建和使用 目录Spring Boot 配置文件Spring Boot 配置文件格式properties配置文件properties 基本语法properties 缺点yml 配置文件yml 基本语法yml 配置不同类型数据及 nullyml 配置对象yml…