打印
[STM32F4]

STM32F4的FSMC接口数据保持时间不能设置

[复制链接]
1721|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zslw|  楼主 | 2018-3-20 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在手上有个并口的芯片,异步intel模式,看到手册上写数据时,要求建立时间和保持时间都大于10ns;但是查了下STM32的手册,数据访问阶段,只能设置数据建立时间,数据保持时间无法设置。照这个意思,就是只能降频使用吗?真受不了,不知道当初设计芯片的人怎么想的!!
沙发
mmuuss586| | 2018-3-20 15:35 | 只看该作者
好好看下FSMC的中文资料呗,都支持的

使用特权

评论回复
板凳
dongliushui| | 2018-3-20 23:25 | 只看该作者
FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。

使用特权

评论回复
地板
小灵通2018| | 2018-3-21 10:23 | 只看该作者
readWriteTiming.FSMC_DataSetupTime = 60; //数据保持时间为60个HCLK =6*60=360ns

使用特权

评论回复
5
小灵通2018| | 2018-3-21 10:24 | 只看该作者
在STM32F407编写ILI9331显示驱动时碰到这样的问题。
两块相同电路设计的硬件板,一块是所有走线没有复用,暂称A板。另外一块是将所有的STM32管脚引出来作为可外接复用IO口,暂称B板。除此之外,AB板的电路设计完全一样。
整个硬件搭载contiki2.7系统,程序是有两个页面转换的显示,并且有实时数据的更新显示。其中,A板的显示切换完全正常,数据更新正常。将在A板上能正常显示的程序烧写到B板中,整个LCD屏幕花掉,能显示页面的一部分,不能切换,数据更新时数据重叠。但是,另外单独烧写LCD显示例程(没有刷屏,只是简单的字体图形显示),B板可以正常显示。
经硬件工程师建议,修改刷屏的速率看是否有改善。

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_14 | GPIO_Pin_15 |
GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10| GPIO_Pin_7; //选中相应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //输出速度
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //无上下拉
GPIO_Init(GPIOD, &GPIO_InitStructure); //按上述参数初始化(PD)
在fsmc配置时,会有输出速率的配置, “GPIO_InitStructure.GPIO_Speed”修改至50M之后有明显改善,B板在烧写之前的程序之后可以显示出单页的完整页面了,但是切换还是会出现花屏。

//写配置
readWriteTiming.FSMC_AddressSetupTime = 0XF; //地址建立时间为16个HCLK 1/168M=6ns*16=96ns
readWriteTiming.FSMC_AddressHoldTime = 0; //地址保持时间 模式A未用到
readWriteTiming.FSMC_DataSetupTime = 60; //数据保持时间为60个HCLK =6*60=360ns
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A

之后,直接去修改fsmc的读写速率,其中readWriteTiming.FSMC_AddressSetupTime在库文件中定义如下
uint32_t FSMC_AddressSetupTime; /* !< Defines the number of HCLK cycles to configure the duration of the address setup time. This parameter can be a value between 0 and 0xF.@NOTE This parameter is not used with synchronous NOR Flash memories. */
明显可以看出该参数是用来设置fsmc地址建立时间的。
然后继续修改参数FSMC_DataSetupTime:
uint32_t FSMC_DataSetupTime; /* !< Defines the number of HCLK cycles to configure the duration of the data setup time.This parameter can be a value between 0 and 0xFF.@note This parameter is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */
该参数是用来设置写入数据的建立时间的。
按照A板上不正常的现象猜测需要减小地址建立时间,在试着减小地址建立时间并且增大数据建立时间之后发现屏幕显示的效果比原来好多了。但是在长时间的运行之后还是会出现花屏,并且明显会发现屏幕上字体会有毛刺。

//读配置
writeTiming.FSMC_AddressSetupTime =15; //地址建立时间为9个HCLK =54ns
writeTiming.FSMC_AddressHoldTime = 0; //地址保持时间
writeTiming.FSMC_DataSetupTime = 15; //数据保持时间为6ns*9个HCLK=54ns
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
随后又继续设置读配置。
这次和写配置一样,减小地址建立时间,但是减到最低之后会不正常,最后设置在0x5。
然后增加数据建立时间,设置在60之后整个系统的显示完全没有任何问题了,数据更新,包括自动手动切换页面都完全和在A板上一样。为了验证兼容性,将此程序烧写到A板中,现象依然正常。故最终将fsmc的配置程序修改成如下:
//写配置
readWriteTiming.FSMC_AddressSetupTime = 0x1; //地址建立时间为16个HCLK 1/168M=6ns*16=96ns
readWriteTiming.FSMC_AddressHoldTime = 0; //地址保持时间 模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0xFF; //数据保持时间为60个HCLK =6*60=360ns
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
//读配置
writeTiming.FSMC_AddressSetupTime = 0x5; //地址建立时间为9个HCLK =54ns
writeTiming.FSMC_AddressHoldTime = 0; //地址保持时间
writeTiming.FSMC_DataSetupTime = 60; //数据保持时间为6ns*9个HCLK=54ns
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

48

帖子

0

粉丝