10396|13

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32通过FSMC控制LCD的问题 [复制链接]

最近做点小东西时用到了压箱底N久的一块屏(SED1335控制器,320×240单色),我将其挂在FSMC总线上,然后配置FSMC总线时用到如下子程序:

=========================我是分割线=========================
    void FSMC_Configuration(void)
    {
        GPIO_InitTypeDef                GPIO_InitStructure;
        FSMC_NORSRAMTimingInitTypeDef   FSMC_NORSRAMTimingInitStructure;
        FSMC_NORSRAMInitTypeDef         FSMC_NORSRAMInitStructure;
    RCC_APB2PeriphClockCmd(          RCC_APB2Periph_GPIOD
                                     | RCC_APB2Periph_GPIOE
          | RCC_APB2Periph_GPIOF
          | RCC_APB2Periph_GPIOG, ENABLE);
        GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_0            // PD.0     →  D2
                                        | GPIO_Pin_1            // PD.1     →  D3
                                        | GPIO_Pin_4            // PD.4     →  NOE
                                        | GPIO_Pin_5            // PD.5     →  NWE
                                        | GPIO_Pin_14           // PD.14    →  D0
                                        | GPIO_Pin_15;          // PD.15    →  D1
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_7            // PE.7     → D4
                                        | GPIO_Pin_8            // PE.8     →  D5
                                        | GPIO_Pin_9            // PE.9     →  D6
                                        | GPIO_Pin_10;          // PE.10    →  D7
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_0;           // PF.0     →   A0
        GPIO_Init(GPIOF, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_12;          // PG.12    →   NE4
        GPIO_Init(GPIOG, &GPIO_InitStructure);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
        // Set the BANK and the chip select signal
        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;   
        // Set whether the data bus and address bus time-multiplexing
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
        // Set the type of memory
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
        // Data width settings
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
        // Set whether to use burst mode access
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        // Set up "WAIT" an effective signal level
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        // Set whether to use loop-back mode
        FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
        // Set "WAIT" signal the effective time
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
        // Set whether to "write" operation
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
        // Set whether or not to use "WAIT" signal
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
        // Set whether or not to use an independent "write" timing
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
        // Set whether to use burst mode to write
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        // Set up "reading" & "write" timing
  FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime       = 0;       // ADDSET
        FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime        = 0;       // ADDHOLD
        FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime          = 7;      // DATAST
        FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration  = 0;      // BUSTURN
        FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision            = 0;      // CLKDIV
        FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency            = 0;      // DATLAT
        FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;    // ACCMOD
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
    }
=========================我是分割线=========================
    然后向LCD总线读写时要搞成这样才正确(拿写命令的子程序举例):

    __inline void LCD_Write_Control_Byte(UINT32 DATA)
    {   
        UINT32 i;
  i = 7; while(i--);    // 这个延时如果不加,那显示就出错
  *((volatile UINT8 * )0x6C000001) = DATA;
    }
=========================我是分割线=========================
    现在有一点没搞明白...我看人家的例程都是直接读写丝毫不见延时痕迹的,而我的却要用i = 7; while(i--);这样的延时才能显示正常,这是怎么回事呢?屏的关系么?还是FSMC总线写入需要时间,上一个操作还没完成我下一个数据又送过去了?另外这句延时是否和上面FSMC配置中FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime          = 7;      // DATAST
有所关联??
此帖出自stm32/stm8论坛

最新回复

没用过这个屏...话说一年的帖子怎么又扒出来了....  详情 回复 发表于 2011-5-26 22:51
点赞 关注
 

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 自己顶..
此帖出自stm32/stm8论坛
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 这个肯定会用到,希望版主支持一下...
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 要看你那个SED1335控制器的时序才能知道问题在哪里。
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
版主说得对,需要看时序图,上面对各个信号的长短有要求。
也可以试着修改FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime参数,先改个大一点儿的值比如说10,再慢慢往下减。我以前连过,没太大问题。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime这个参数...我修改成0是因为这时候屏照样能工作....
各位非常抱歉,本人语言表达能力实在有限,现在把问题换成如下形式:

    首先假设在FSMC上向外部设备读、写数据各需要10个周期(根据时序图配置好了FSMC),
    然后假设从绝对地址处(这里的绝对地址位于SRAM上)读、写数据各需要1个周期,
    那么在程序中是不加任何延时的从绝对地址(这里的绝对地址是外设地址了)取出一个数据,然后再写回去是2个周期还是要20个周期??
    用程序表达就是如下两段:
====================第一段====================
*((volatile UINT8 * )0x6C000001) = W_DATA;
R_DATA = *((volatile UINT8 * )0x6C000001) ;
====================第二段====================
*((volatile UINT8 * )0x6C000001) = W_DATA;
死等9个周期的语句;     
R_DATA = *((volatile UINT8 * )0x6C000001) ;
死等9个周期的语句;

============================================
之所以这么问是因为我怀疑情况如第二段程序这样,写完一个数据要延时死等FSMC直到收/发完才能继续收/发下一个数据。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

纯净的硅(中级)

7
 
                                 继续顶!
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 继续顶! !
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 顶
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 遇到过类似情况,SED1335芯片太慢,2次命令之间必须等待,最快的方式是检测1335的BUSY信号
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 得检查 busy,等待他忙
此帖出自stm32/stm8论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 我认为是1335的busy信号的问题!
此帖出自stm32/stm8论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

13
 

STM32总线方式操作LCD320240

STM32总线方式操作320240的速度怎么样,以前玩过ATmega128的总线方式操作,总线操作刷屏速度还是很快的啊

此帖出自stm32/stm8论坛
 
 
 

回复

1059

帖子

0

TA的资源

纯净的硅(高级)

14
 
没用过这个屏...话说一年的帖子怎么又扒出来了....
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表