STM32-FSMC 问题解决方法

来源:本站
导读:目前正在解读《STM32-FSMC 问题解决方法》的相关信息,《STM32-FSMC 问题解决方法》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《STM32-FSMC 问题解决方法》的详细说明。
简介:现在我用stm32f103ve, 配置fsmc, 驱动TFT, 只能配置成 psram模式, 如果配置其他模式,就会出现 fsmc总线没反应情况(当配置成sram,nor模式, 运行到FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); ,就出现没有响应)

配置成psram模式, 读写模式B, 写数据可以, 当运行读数据时候, 就出现fsmc总线没有反应, 不知还有哪些设置影响 fsmc的配置.

可以确认,外部连线电路都正常,用i/0模拟总线方式, 可以读写,tft驱动都正常,

不知道哪位大大有解决方法,不胜感激,

tft fsmc

cs ne1(pd7)

RS A16

wr wr

rd rd

d0-d15 d0-d15

命令地址 0x60020000

数据地址 0x60000000

fsmc 配置

FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef p;/* FSMC_Bank1_NORSRAM1 timing configuration */p.FSMC_AddressSetupTime = 15; /*地址建立时间期限*/ p.FSMC_AddressHoldTime = 15; /*地址的持续时间*/p.FSMC_DataSetupTime = 100; /*设定数据时间期限*/p.FSMC_BusTurnAroundDuration = 0; /*总线转向时间*/p.FSMC_CLKDivision = 2; /*CLK时钟输出信号的HCLK周期数表示时间???*/p.FSMC_DataLatency = 1; /*指定在获得第一个数据前的时钟周期*/p.FSMC_AccessMode = FSMC_AccessMode_B;FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; /*指定的FSMC块*/FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; /*地址和数据值不复用的数据总线*/ FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM; /*外部存储器的类型*/FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; /*数据宽度*/FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; /* 禁用突发访问模式*/FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;/*指定等待信号的极性*/FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; /*Enables or disables the Wrapped burst access mode for Flash*/FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; /*启用指定的FSMC的写操作*/FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; /*扩展模式*/FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; /*禁用写突发操作*/FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /* Enable FSMC Bank1_SRAM Bank */FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);

有多个思路可以考虑。

1.看看库是不是太老了

2.不用库,而直接操作寄存器,我经常这么做。

3.FSMC用到的GPIO时钟 是否打开? 相关的引脚(特别要检查/RD或者说 /OE)设置了AF功能吗?

4.“只能配置成 psram模式, 如果配置其他模式,就会出现 fsmc总线没反应情况(当配置成sram,nor模式, 运行到FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); ,就出现没有响应”

这是不正常的症状,说明有潜在的问题。 配置成sram模式,以此为突破口,把潜在的问题解决掉。

十分感谢ijk, 现在终于读写正常了, 我把调试步骤写下来,

1. 当设置为psram模式,可以正常,其他模式不正常,经分析, 是初始化问题,具体什么问题,分析完之后,我总结

2. 设置一些参数之后, sram,nor模式正常写了,但读不正常,也是初始化问题

3. 经过楼上 ijk的提醒, 我仔细研究了一下 datasheet, 经过仿真跟踪,发现 fsmc的 faccen(bit6) 是0, datasheet表示此 bit 不用管

因为我设置为模式A, 扩展模式使能, 是模式A,不是模式1,当我手动把faccen 设置成 1, 运行下去, 奇迹出现了,发现可以读了, 一时之间感觉天地都对我在笑

困扰了我近2个星期的问题终于拨开云雾了, 我看了下库函数,发现没有设置faccen的参数第一感觉,ST库函数有bug,被我发现了,是不是可以向ST那边要些奖励(偷笑), 后来想想不对,那么多人用fsmc,为什么就我发现问题,其他人都没发现, 我的代码也是参考别人成功应用的,不应该有问题, 那么是什么问题导致FSMC不能读, 翻了库函数里面关于norsram初始化部分,看到一个函数FSMC_NORSRAMStructInit, 突然感觉来灵感了,感觉找到问题点了,因为我定义了初始化的变量,可能有部分参数没有初始化,设置参数时候,出现错误参数,按照这个思路, 我把程序增加了 FSMC_NORSRAMStructInit 调用, 定义完变量之后,就调用这个函数然后其他保持不变, 奇迹出现了, 发现一切正常了, 即使 faccen一直为0, 也能读了,我更改模式b,调节了读写时间参数, 都能正常工作,

最后的结论就是, 初始化出问题了, 虽然问题解决了, 但是我奇怪很多例程都没调用FSMC_NORSRAMStructInit也能正常工作, 不知道是什么原因.

我用的编译器 iar 6.30,

如果有类似的问题的人, 有问题了,首先从寄存器入手, 看看寄存器的数值是不是你所需要的,

非常感谢ijk给的思路, 解决了问题!

下边贴出来FSMC初始化部分

//===============================================FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef p;FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);/* FSMC_Bank1_NORSRAM1 timing configuration */p.FSMC_AddressSetupTime = 0; /*地址建立时间期限*/p.FSMC_AddressHoldTime = 0; /*地址的持续时间*/p.FSMC_DataSetupTime = 2; /*设定数据时间期限*/p.FSMC_BusTurnAroundDuration = 0; /*总线转向时间*/p.FSMC_CLKDivision = 0; /*CLK时钟输出信号的HCLK周期数表示时间???*/p.FSMC_DataLatency = 0; /*指定在获得第一个数据前的时钟周期*/p.FSMC_AccessMode = FSMC_AccessMode_A;FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; /*指定的FSMC块*/FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; /*地址和数据值不复用的数据总线*/FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; /*外部存储器的类型*/FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; /*数据宽度*/FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; /*禁用突发访问模式*/FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;/*指定等待信号的极性*/FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; /*Enables or disables the Wrapped burst access mode for Flash*/FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; /*启用指定的FSMC块的写操作*/FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; /*扩展模式*/FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; /*禁用写突发操作*/FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);/* Enable FSMC Bank1_SRAM Bank */FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);//======================================================

提醒:《STM32-FSMC 问题解决方法》最后刷新时间 2024-03-14 01:00:10,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《STM32-FSMC 问题解决方法》该内容的真实性请自行鉴别。