打印

STM32 FSMC 驱动tft, 配置不成功(已经结贴,解决问题)

[复制链接]
11456|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eakliu|  楼主 | 2012-6-13 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eakliu 于 2012-6-15 16:11 编辑

现在我用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);
沙发
airwill| | 2012-6-13 11:43 | 只看该作者
我曾经也栽过跟斗, 最后发现, LCD 的 RESET 信号也要单独做控制.
在 LCD 初始化的时候先发个硬件 RESET 信号.
我的这个教训希望对楼主有帮助

使用特权

评论回复
板凳
eakliu|  楼主 | 2012-6-14 16:09 | 只看该作者
谢谢楼上,我现在又仔细调试一些参数, 设置成模式A, sram可以写了,量输出波形,时序也对, 就是读的时候,总会出现没有响应的情况,
当停下仿真器的时候,它就跳到一个固定地址,
反汇编的代码
1.          MOVS.W             R2, #1610612736          ;0X60000000
2.          LDRH                  R2,[R2]
3.          MOVS                 R1, R2

当运行到 第2句的时候, 系统就没反应了, 应当是fsmc总线出问题了,但不知道问什么会这样,

希望知道的给指点迷津, 1个星期了,就卡在这里,

使用特权

评论回复
地板
IJK| | 2012-6-14 17:51 | 只看该作者
谢谢楼上,我现在又仔细调试一些参数, 设置成模式A, sram可以写了,量输出波形,时序也对, 就是读的时候,总会出现没有响应的情况,
当停下仿真器的时候,它就跳到一个固定地址,
反汇编的代码
1.          MOVS.W          ...
eakliu 发表于 2012-6-14 16:09


反汇编的代码 看不出什么问题。
LZ可以用示波器 看读的时候 是否有波形发出。

使用特权

评论回复
5
IJK| | 2012-6-14 17:54 | 只看该作者
“只能配置成 psram模式, 如果配置其他模式,就会出现 fsmc总线没反应情况(当配置成sram,nor模式, 运行到 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); ,就出现没有响应”

这是不正常的症状。
LZ开了 FSMC的时钟吗?

使用特权

评论回复
6
eakliu|  楼主 | 2012-6-14 21:55 | 只看该作者
fsmc 时钟开了,我写数据没有问题, 读的时候,fsmc总线就没反应,
示波器看了,没有波形出来, 感觉 读的时候,fsmc总线在busy状态
现在不知道下一步该怎样调试,希望有经验的大虾提供一下经验

使用特权

评论回复
7
IJK| | 2012-6-15 09:56 | 只看该作者
有多个思路可以考虑。
1.看看库是不是太老了
2.不用库,而直接操作寄存器,我经常这么做。
3.FSMC用到的GPIO时钟 是否打开? 相关的引脚(特别要检查/RD或者说 /OE)设置了AF功能吗?

4.“只能配置成 psram模式, 如果配置其他模式,就会出现 fsmc总线没反应情况(当配置成sram,nor模式, 运行到 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); ,就出现没有响应”
这是不正常的症状,说明有潜在的问题。  配置成sram模式,以此为突破口,把潜在的问题解决掉。

使用特权

评论回复
8
eakliu|  楼主 | 2012-6-15 13:49 | 只看该作者
十分感谢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);  
//======================================================
结贴!

使用特权

评论回复
9
江陵龙少| | 2012-6-15 20:48 | 只看该作者
楼主,你好,你的问题给了我很好的思路,
我也遇到了与你类似的情况,我的问题是,一段冗余代码不能去掉,一旦去掉那段冗余代码,就会发生总线错误
,而且我的硬件与你的十分相似,能不能帮我看看?
https://bbs.21ic.com/viewthread.p ... p;page=1#pid2273533

使用特权

评论回复
10
eakliu|  楼主 | 2012-6-18 11:48 | 只看该作者
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;

        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;        

        FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);

这个在fsmc初始化非常重要, 不知道是编译器还是st库的问题,
如果不加上上面初始化的代码, 即使你的设定是对了,初始化的寄存器也会出错,
大家可以验证,

使用特权

评论回复
11
IJK| | 2012-6-18 14:37 | 只看该作者
很赞赏LZ对调试过程的分享。

另外,我不喜欢ST库对FSMC的初始化,太繁琐,有点杀**用牛刀的感觉。我一般直接操作寄存器,给个例子:
  // SRAM configuration -----------------------------------------//
  // SRAM configured as follow:
  //      - Data/Address MUX = Disable
  //      - Memory Type = SRAM
  //      - Data Width = 16bit
  //      - Write Operation = Enable
  //      - Extended Mode = Enable
  FSMC_Bank1->BTCR[4] = FSMC_DataAddressMux_Disable | FSMC_MemoryType_SRAM |
                        FSMC_MemoryDataWidth_16b | FSMC_WriteOperation_Enable |
                        FSMC_ExtendedMode_Enable;

使用特权

评论回复
12
b260123292| | 2012-6-22 21:20 | 只看该作者
我调T6369一直失败,希望能从这里发现点什么

使用特权

评论回复
13
逝水无反| | 2012-6-30 19:02 | 只看该作者
STM32  的RTC不能与USART同时使用吗?
用了的时候中断接收就不正确了?

使用特权

评论回复
14
amanlikethis| | 2014-10-30 21:14 | 只看该作者
很感谢楼主的启示,我的问题也解决了。
我遇到的问题是:
           通过STM32总线驱动ili9341,程序调试和刚下载的时候,显示完全正常。可是就在我掉电关机,重新启动的时候就完全崩溃了。这令我非常疑惑。
            楼主说,在使用FSMC_NORSRAMInit函数通过传入参数FSMC_NORSRAMInitStructure初始化FSMC总线之前,需要先将这个传入变量FSMC_NORSRAMInitStructure通过函数FSMC_NORSRAMStructInit函数初始化这个变量。
            为什么这么做呢?因为传入的变量是一个自动变量,进入我们的FSMC设置函数时,它的值是不确定的。假设我们没有对其初始化成默认值,直接利用这个变量。如果我们队这个变量的每一个参数都设置成我们确定的值,那么FSMC就可以按照我们设置的工作。倘若我们没有做到,只将这个变量的一部分参数进行设置,显然还有一些参数是不可预测的。导致的结果就是,我们调用库函数FSMC_NORSRAMInit初始化的时候,这些不可测的参数使我们的设置出乎我们的预料。
             由此,我也得出一个教训,在我们调用库函数的时候,要先将传入库函数的自动变量进行初始化。然后再来使用,这样最可靠。

使用特权

评论回复
15
nudthzg| | 2015-10-3 17:18 | 只看该作者
受楼上的启发,楼主的程序缺了FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
,导致这个变量是一个不可预测的值,因此出现问题。
加了 “FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);”后,给所有的参数一个默认值,FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait 也有了一个确定的值,因此问题不再出现。

使用特权

评论回复
16
pkrn| | 2015-10-3 19:54 | 只看该作者
小弟有个问题想请教一下,就是FSMC控制lcd不是地址线上就用了一个IO,那剩下的是不是可以做普通的IO还是已被FSMC占用。

使用特权

评论回复
17
734774645| | 2015-10-3 20:54 | 只看该作者
fsmc这个原理是什么?,从来没用过的

使用特权

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

本版积分规则

个人签名:为了看到后天的太阳,我要看到明天的太阳!

2

主题

15

帖子

1

粉丝