FSMC-地址建立时间、地址保持时间、数据建立时间如何确定

2024-08-28 03:32

本文主要是介绍FSMC-地址建立时间、地址保持时间、数据建立时间如何确定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们知道FSMC包括同步和异步两种工作时序。对于异步突发访问方式, FSMC 主要设置 3 个时间参数:地址建立时间(ADDSET)、数据建立时间(DATAST)和地址保持时间(ADDHLD)。这三个参数是怎么来的呢?是因为SRAM/ ROM、 PSRAM 和 NOR Flash 产品的信号时序有这三个参数,FSMC 综合了 SRAM/ ROM、 PSRAM 和 NOR Flash 产品的信号特点,定义了 4 种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时间参数,如下表所示:

那么究竟地址建立时间(ADDSET)、数据建立时间(DATAST)和地址保持时间(ADDHLD)是什么呢?我们需要看SRAM/ ROM、 PSRAM 和 NOR Flash等芯片的时序图。这3个参数是存储芯片的数据手册中给出的,或者是通过存储芯片的数据手册其他参数计算出来的。所以想要知道这3个参数的具体值,一定要看具体存储芯片的数据手册!

我使用STM32F407作为主控芯片,选用IS62WV51216作为片外SRAM。IS62WV51216读写时序及读写参数如下图所示:

IS62WV51216读时序关键特性
IS62WV51216读时序
IS62WV51216写时序关键特性
IS62WV51216写时序

 

使用模式A,读写共用时序(共用时序时,以写时序为准),配置代码如下:

 //系统频率为168MHz,即一个HCLK周期为1/168M=6nsreadWriteTiming.FSMC_AddressSetupTime = 0x00;   //地址建立时间为0HCLK     即0nsreadWriteTiming.FSMC_AddressHoldTime = 0x00;    //地址保持时间 模式A未用到readWriteTiming.FSMC_DataSetupTime = 0x08;      //数据建立时间 为9HCLK    6*9=54ns

为什么地址建立时间是0ns呢?因为从IS62WV51216写时序关键特性中可以看到,Address Setup Time为0,所以配置时,地址建立时间要等于0。

地址保持时间模式A未用到,所以配置为0.

数据建立时间为什么是54ns呢?因为从IS62WV51216写时序关键特性中可以看到,Dataup to Write End最小值为30ns,所以配置时,数据保持时间要大于30ns。至于选择的54ns并不是严格按照手册时间来的,这需要实际调试才能确定具体值。

那为什么数据建立时间配置为8,但却是9个HCLK周期时间呢?从STM32中文参考手册的时序图中可以看到,模式A写入时序的数据建立时间为: 数据建立时间=HCLK周期+1,初始化程序时,如果设置DATAST=0,则实际数据建立周期为1,即实际数据建立周期比DATAST值多1个HCLK周期。

STM32中文参考手册模式A写时序

 

参数确定大体就是这样的思路,其他模式及不同的芯片确定参数的思路是一样的。希望能帮到大家。

最后是在帖子中看到的关于时序的讲解,挺有趣,一并放在文章中。

先搞清逻辑关系。 

这是CPU读存储器的时序。CPU索取,存储器付出。 

我有很多单元,你要读我,至少要把那个单元的门牌号告诉我吧?——这就是地址线,由CPU填写(输出); 
地址线上非1即0,你放不放地址都这样的,所以,你要告诉我什么时候是“地址”,什么时候是“垃圾”吧?——这就是OE线下降沿的作用,也要CPU填写。 
(一般来说,要在地址稳定以后,OE才发出下降沿。上面图没有给出这个差别。) 

好了,CPU该办的手续已经完了,球到了存储器一边。 

我要去这个单元找东西,总需要点时间吧?——这就是OE下降沿以后,RAM发出数据的时间间隔。 
艾玛,累死我了,你要的东西找到了,我放上去了! 

按说,数据放到总线上了,可是CPU如何才能知道数据来了呢?因为不论是数据还是垃圾,那电线上面总有1、0这些东西。 
这时出现不同解决方法了。 
一种方法,由存储器给CPU发出一个通知信号:好了,快来拿!这个信号通常叫做 Data Available,数据可得,简写 DAV,可能有人见过。CPU接到这个信号,自然会做。
另一种方法,有老大强势规定:OE下降沿之后,你丫必须在1秒钟之内把东西交出来!我只管时间到就来拿!这是多数存储器遵守的规定。 
这两种方法,由于是不同的公司提出的,经常以公司名字来命名。Motorola总线,intel总线,听说过吧? 

OK,明白这些意思,稍微想一想,应当就可以理解各种时序的时间了。以后再不用问人了。 

另外,手册里经常可以看到,这些时间一般会有最大值、最小值,有些只给出一项。 
比如上面提到,从OE下降沿到存储器交出数据的时间,在存储器手册里面,这个时间只会给出最大值。 
因为用户必须按“最长时间”操作,不能有侥幸心理。给出最小值没有实际意义。

 

这篇关于FSMC-地址建立时间、地址保持时间、数据建立时间如何确定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113608

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I