STM32之HAL开发——FSMC—扩展外部SRAM

news2024/10/2 1:23:49

SRAM读写时序

对SRAM进行读写数据时,它各个信号线的时序流程如下图
在这里插入图片描述
(图一)SRAM的读时序

在这里插入图片描述
(图二)SRAM的写时序

流程解释
  • 主机使用地址信号线发出要访问的存储器目标地址;
  • 控制片选信号CS1#及CS2#使能存储器芯片;
  • 若是要进行读操作,则控制读使能信号OE#表示要读数据,若进行写操作则控制写使能信号WE#表示要写数据;
  • 使用掩码信号B#与UB#指示要访问目标地址的高、低字节部分;
  • 若是读取过程,存储器会通过数据线向主机输出目标数据,若是写入过程,主要使用数据线向存储器传输目标数据。
参数介绍

在读写时序中,有几个比较重要的时间参数,在使用STM32 控制的时候需要参考,它们的介绍见下表。
在这里插入图片描述

SRAM时序结构体

控制FSMC使用SRAM存储器时主要是配置时序寄存器以及控制寄存器,利用HAL库的SRAM时序结构体以及初始化结构体可以很方便地写入参数。

typedef struct
{
   uint32_t FSMC_AddressSetupTime;       /*地址建立时间,0-0xF个HCLK周期*/
   uint32_t FSMC_AddressHoldTime;        /*地址保持时间,0-0xF个HCLK周期*/
   uint32_t FSMC_DataSetupTime;           /*地址建立时间,0-0xF个HCLK周期*/
   uint32_t FSMC_BusTurnAroundDuration;/*总线转换周期,0-0xF个HCLK周期,在NOR FLASH */
   uint32_t FSMC_CLKDivision;/*时钟分频因子,1-0xF,若控制异步存储器,本参数无效 */
   uint32_t FSMC_DataLatency;    /*数据延迟时间,若控制异步存储器,本参数无效 */
   uint32_t FSMC_AccessMode;             /*设置访问模式 */
}FSMC_NORSRAMTimingInitTypeDef;

这个结构体成员定义的都是SRAM读写时序中的各项时间参数,这些成员的的参数都与FSMC_BRT及FSMC_BWTR寄存器配置对应,各个成员介绍如下:

  1. FSMC_AddressSetupTime
    本成员设置地址建立时间,即FSMC读写时序中的ADDSET值,它可以被设置为0-0xF个HCLK周期数,按STM32HAL库的默认配置,HCLK的时钟频率为168MHz,即一个HCLK周期为1/168微秒。
  2. FSMC_AddressHoldTime
    3本成员设置地址保持时间,它可以被设置为0-0xF个HCLK周期数。
  3. FSMC_DataSetupTime
    本成员设置数据建立时间,即FSMC读写时序 图26_10 中的DATAST值,它可以被设置为0-0xF个HCLK周期数。
  4. FSMC_BusTurnAroundDuration
    本成员设置总线转换周期,在NOR FLASH存储器中,地址线与数据线可以分时复用,总线转换周期就是指总线在这两种状态间切换需要的延时, 防止冲突。控制其它存储器时这个参数无效,配置为0即可。
  5. FSMC_CLKDivision
    本成员用于设置时钟分频,它以HCLK时钟作为输入,经过FSMC_CLKDivision分频后输出到FSMC_CLK引脚作为通讯使用的同步时钟。控制其它异步通讯的存储器时这个参数无效,配置为0即可。
  6. FSMC_DataLatency
    本成员设置数据保持时间,它表示在读取第一个数据之前要等待的周期数,该周期指同步时钟的周期,本参数仅用于同步NOR FLASH类型的存储器,控制其它类型的存储器时,本参数无效。
  7. FSMC_AccessMode
    本成员设置存储器访问模式,不同的模式下FSMC访问存储器地址时引脚输出的时序不一样,可选FSMC_ACCESS_MODE_A/B/C/D模式。一般来说控制SRAM时使用A模式。

这个FSMC_NORSRAM_TimingTypeDef时序结构体配置的延时参数,将作为下一节的FSMC SRAM初始化结构体的一个成员。

FSMC控制SRAM的时序

FSMC外设支持输出多种不同的时序以便于控制不同的存储器,它具有ABCD四种模式,下面我们仅针对控制SRAM使用的模式A进行讲解。
在这里插入图片描述
(图三)FSMC模式A的读时序
在这里插入图片描述
(图四)FSMC模式A的写时序

流程解释
  • 当内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器,上图中的是访问外部SRAM时FSMC外设的读写时序。
  • 以读时序为例,该图表示一个存储器操作周期由地址建立周期(ADDSET)、数据建立周期(DATAST)以及2个HCLK周期组成。在地址建立周期中,地址线发出要访问的地址,数据掩码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;地址建立周期结束后读使能信号线发出读使能信号,接着存储器通过数据信号线把目标数据传输给FSMC,FSMC把它交给内核。
  • 写时序类似,区别是它的一个存储器操作周期仅由地址建立周期(ADDSET)和数据建立周期(DATAST)组成,且在数据建立周期期间写使能信号线发出写信号,接着FSMC把数据通过数据线传输到存储器中。

FSMC-SRAM初始化结构体

/**
 1. @brief  FSMC NOR/SRAM Init structure definition
*/
typedef struct
{
   uint32_t NSBank;                /*设置要控制的Bank区域 */
   uint32_t DataAddressMux;        /*设置地址总线与数据总线是否复用 */
   uint32_t MemoryType;          /*设置存储器的类型 */
   uint32_t MemoryDataWidth;     /*设置存储器的数据宽度*/
   uint32_t BurstAccessMode;        /*设置是否支持突发访问模式,只支持同步类型的存储器 */
   uint32_t WaitSignalPolarity;  /*设置等待信号的极性*/
   uint32_t WrapMode;            /*设置是否支持对齐的突发模式 */
   uint32_t WaitSignalActive;    /*配置等待信号在等待前有效还是等待期间有效 */
   uint32_t WriteOperation;      /*设置是否写使能 */
   uint32_t WaitSignal;          /*设置是否使能等待状态插入 */
   uint32_t ExtendedMode;        /*设置是否使能扩展模式 */
   uint32_t WriteBurst;          /*设置是否使能写突发操作*/
   uint32_t AsynchronousWait;    /*设置是否使能等待信号*/
   uint32_t ContinuousClock;     /*设置是否使能FMC时钟输出到外部存储设备*/
   uint32_t WriteFifo;           /*设置是否使能FIFO*/
   uint32_t PageSize;            /*指定页的大小*/
   /*当不使用扩展模式时,本参数用于配置读写时序,否则用于配置读时序*/
   FSMC_NORSRAM_TimingTypeDef* FSMC_ReadWriteTimingStruct;
   /*当使用扩展模式时,本参数用于配置写时序*/
   FSMC_NORSRAM_TimingTypeDef * FSMC_WriteTimingStruct;
} FSMC_NORSRAM_InitTypeDef;

这个结构体,除最后两个成员是上一小节讲解的时序配置外,其它结构体成员的配置都对应到FSMC_BCR中的寄存器位。各个成员意义介绍如下,括号中的是STM32HAL库定义的宏:

  1. NSBank
    本成员用于选择FSMC映射的存储区域,它的可选参数以及相应的内核地址映射范围见表 在这里插入图片描述

  2. DataAddressMux
    本成员用于设置地址总线与数据总线是否复用(FSMC_DATA_ADDRESS_MUX_DISABLE/DISABLE),在控制NOR FLASH时,可以地址总线与数据总线可以分时复用,以减少使用STM32信号线的数量。

  3. MemoryType
    本成员用于设置要控制的存储器类型,它支持控制的存储器类型为SRAM、PSRAM以及NOR FLASH(FSMC_MEMORY_TYPE_SRAM/PSRAM/NOR)。

  4. MemoryDataWidth
    本成员用于设置要控制的存储器的数据宽度,可选择设置成8或16位(FSMC_NORSRAM_MEM_BUS_WIDTH_8/16/32)。

  5. BurstAccessMode
    本成员用于设置是否使用突发访问模式(FSMC_BURST_ACCESS_MODE_DISABLE /DISABLE),突发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式。

  6. AsynchronousWait
    本成员用于设置是否使能在同步传输时使用的等待信号(FSMC_ASYNCHRONOUS_WAIT_DISABLE /DISABLE),在控制同步类型的NOR或PSRAM时,存储器可以使用FSMC_NWAIT引脚通知STM32需要等待。

  7. WaitSignalPolarity
    本成员用于设置等待信号的有效极性,即要求等待时,使用高电平还是低电平(FSMC_WAIT_SIGNAL_POLARITY_LOW /HIGH)。

  8. FSMC_WrapMode
    本成员用于设置是否支持把非对齐的AHB突发操作分割成2次线性操作(FSMC_WRAP_MODE_DISABLE /ENABLE),该配置仅在突发模式下有效。

  9. WaitSignalActive
    本成员用于配置在突发传输模式时,决定存储器是在等待状态之前的一个数据周期有效还是在等待状态期间有效(FSMC_WAIT_TIMING_BEFORE_WS / FSMC_WAIT_TIMING_DURING_WS)。

  10. WriteOperation
    这个成员用于设置是否写使能(FSMC_WRITE_OPERATION_DISABLE /ENABLE),禁止写使能的话FSMC只能从存储器中读取数据,不能写入。

  11. WaitSignal
    本成员用于设置当存储器处于突发传输模式时,是否允许通过NWAIT信号插入等待状态(FSMC_WAIT_SIGNAL_ENABLE /DISABLE)。

  12. ExtendedMode
    本成员用于设置是否使用扩展模式(FSMC_EXTENDED_MODE_ENABLE /DISABLE),在非扩展模式下,对存储器读写的时序都只使用FSMC_BCR寄存器中的配置,即下面的FSMC_ReadWriteTimingStruct结构体成员;在扩展模式下,对存储器的读写时序可以分开配置,读时序使用FSMC_BCR寄存器,写时序使用FSMC_BWTR寄存器的配置,即下面的FSMC_WriteTimingStruct结构体。

对本结构体赋值完成后,调用FSMC_NORSRAMInit库函数即可把配置参数写入到FSMC_BCR及FSMC_BTR/BWTR寄存器中。

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

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

相关文章

力扣HOT100 - 25. K 个一组翻转链表

解题思路&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dum new ListNode(0, head);ListNode pre dum;ListNode end dum;while (end.next ! null) {for (int i 0; i < k && end ! null; i) {end end.next;}if …

生成式AI产品图谱全览:投资人、产品经理必备指南

以下是生成式AI产品图谱的核心要点&#xff0c;供投资人、产品经理等关注生成性AI领域的专业人士参考&#xff1a; 技术领域细分&#xff1a;依据AI技术所处理的媒介类型进行划分&#xff0c;包括文本处理、代码生成、图像处理、语音识别、视频分析、3D模型构建、音乐创作和游戏…

深度学习项目设置超参数 parser or dictionary

见惯了parser 有的人却是用字典读的&#xff1a; 将配置文件config.yaml读取到一个dictionary类型的变量cfg中&#xff0c; 后面出现了这样的语句&#xff1a;cfg["trainer"].get("sup_only_epoch", 1): 意思是&#xff1a;在config.yaml文件里key为trai…

Java客户端如何直接调用es的API

Java客户端如何直接调用es的API 一. 问题二. withJson 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 问题 今天做项目的时候&#xff0c;想要直接通过java客户端调用es的api…

PHP反序列化漏洞原理(附带pikachu靶场演示)

1.反序列化概念 序列化:是将变量转换为可保存或传输的字符串的过程;实现函数是serialize()反序列化:就是在适当的时候把这个字符串再转化成原来的变量使用&#xff0c;就是序列化的逆过程。实现函数是unserialize() 直白一点就是&#xff1a;序列化是把对象转换成字节流&#…

基于java+springboot+vue实现的图书借还管理系统小程序(文末源码+Lw+ppt)23-1

摘 要 随着社会的发展&#xff0c;图书借还的管理形势越来越严峻。越来越多的借阅者利用互联网获得信息&#xff0c;但图书借还信息量大。为了方便借阅者更好的获得本图书借还信息&#xff0c;因此&#xff0c;设计一种安全高效的“共享书角”图书借还管理系统极为重要。 为…

python安装pytorch@FreeBSD

先上结论&#xff0c;最后在conda下安装成功了&#xff01; PyTorch是一个开源的人工智能深度学习框架&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&#xff09;基于Torch库开发并维护。PyTorch提供了一个高效、灵活且易于使用的工具集&#xff0c;用于构建和训练深…

Matlab进阶绘图第51期—带填充等高线的三维特征渲染散点图

带填充等高线的三维特征渲染散点图是填充等高线图与特征渲染三维散点图的组合。 其中&#xff0c;填充等高线图与特征渲染的三维散点图的颜色用于表示同一个特征。 由于填充等高线图无遮挡但不直观&#xff0c;特征渲染的三维散点图直观但有遮挡&#xff0c;而将二者组合&…

【MySQL探索之旅】多表查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

快速排序题目SelectK问题(力扣75.颜色分类、力扣215.数组中的第K个最大元素、面试题17.14最小K个数)

力扣75.颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sor…

使用Nexus搭建npm私服库

优质博文&#xff1a;IT-BLOG-CN 【1】下载nexus http://www.sonatype.com/download-oss-sonatype解压到本地即可&#xff1b; 【2】打开nexus-3.2.0-01-win64\nexus-3.2.0-01\bin&#xff1b;打开cmd&#xff08;必须使用cmd&#xff09; 执行nexus.exe /run&#xff1b;需要使…

贪吃蛇的简单实现(c语言)

前言&#xff1a;学完了C语言的基础语法&#xff0c;和一点数据结构的知识&#xff0c;拿贪吃蛇来练练手&#xff0c;并熟悉以前的知识。写完之后&#xff0c;有一种成就感&#xff0c;为以后的学习饱满激情。 注意这里的讲解是由部分到整体的思路。 目录 控制台不能是终端&am…

OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 需求说明 一般用到FFT&#xff0c;就涉及到复数的计算&#xff0c;为了便于调用&#xff0c;我自行封装了一个简单的复数矩阵点乘…

《从零开始的Java世界》08集合框架

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

YOLO世界:实时开放词汇对象检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;YOLO世界&#xff1a;实时开放词汇对象检测1、研究背景2、提出方法3、相关技术3.1、Re-parameterizable Vision-Language Path Ag…

react09 hooks(useState)

react-09 hooks&#xff08;useState&#xff09; hooks组件&#xff08;函数组件动态化&#xff09; 其本质就是函数组件&#xff0c;引用一些hooks方法&#xff0c;用来在函数组件中进行例如状态管理&#xff0c;模拟类组件的生命周期等&#xff0c;只能运用到函数组件中 ho…

Linux的UDEV机制

udev 机制引入&#xff1a; 手机接入Linux热拔插相关 a. 把手机接入开发板 b. 安装adb工具&#xff0c;在终端输入adb安装指令&#xff1a; sudo apt-get install adb c. dmeg能查看到手机接入的信息&#xff0c;但是输入adb devices会出现提醒 dinsufficient permissions for …

酷开会员 | 酷开系统带你足不出户获得同电影院一般的观影体验

在繁忙、混乱的快节奏工作中&#xff0c;人们总是渴望在下班后&#xff0c;逃离工作的桎梏找到一丝慰藉&#xff0c;看电影&#xff0c;则成为了很多人宣泄情感、放松心情的一种方式。但是&#xff0c;电影院的时间和地点总是那么不受控制&#xff0c;要么地点太远、要么场次不…

k8s安装,linux-ubuntu上面kubernetes详细安装过程

官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/ 环境配置 该部分每个主机都要执行 如果你确定不需要某个特定设置&#xff0c;则可以跳过它。 设置root登录 sudo passwd root sudo vim /etc/ssh/sshd_config Perm…

密码学 | 数字证书:应用

&#x1f951;原文&#xff1a;数字签名和数字证书的原理解读 - 知乎 &#x1f951;前文&#xff1a;密码学 | 数字签名 数字证书 - CSDN &#x1f951;提示&#xff1a;把客户端想成 Alice&#xff0c;服务器端想成 Bob 即可。客户端实际上指的是客户端浏览器。 下面&#…