查看: 5254|回复: 7

【魔方团】STM32之FSMC驱动LCD学习

[复制链接]
  • TA的每日心情
    奋斗
    2013-8-15 09:52
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2013-8-19 20:32:04 | 显示全部楼层 |阅读模式
    分享到:
    ——————什么是FSMC,为什么要用FSMC:
              FSMC(Flexible Static Memory Controller,可变静态存储控制器),能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度。FSMC的一端通过内部高速总线AHB连接到内核Cortex-M3,另一端则是面向扩展存储器外部总线。内核对外部存储器的访问信号发送到AHB总线后,经过FSMC转换为符合外部存储器通信规约的信号,送到外部存储器的相应引脚,实现内核与外部存储器之间的数据交互,即通过对FSMC的寄存器配置由硬件自动生成符合外部存储器操作时序的信号。相比直接用IO口模拟操作时序,速度更快。


    ——————FSMC映射地址空间:见STM32手册。


    ——————FSMC扩展NOR Flash配置(以驱动TFT为例):
    把TFT作为只有2个地址的存储器对待. TFT的控制线有:复位信号RST,片选CS,输出使能RD(读信号),写信号WE以及RS信号。 于STM32连线为: RST->GPIO, CS->FSMC_NEx(N表示低电平有效), RD->FSMC_NOE, FSMC_NEW->WR, RS(Register Select)->A0(或者其他任何一条地址线),关键在于RS信号,在操作时序中RS=0一般是写命令,RS=1写数据,当我们把TFT的RS信号接到FSMC_A(0~25)中的随便一条时就可确定读写数据的地址LCD_DATA_ADDR ,再确定写命令的地址LCD_CMD_ADDR就相当于RS信号线了。如要往TFT写命令只要写入地址LCD_CMD_ADDR,写数据写入地址LCD_DATA_ADDR。        

    1.确定映射地址空间即LCD_CMD_ADDR:

    NOR Flash只能选用BANK1中的4个子BANK ,总地址范围为0X60000000~0X6FFFFFFF由TFT中的CS引脚连到FSMC_NEi(i=1...4)来对应子BANK,由此可以确定寄存器的基地址,如用FSMC_NE1,那么LCD_CMD_ADDR地址就为0X60000000 ,用FSMC_NE3就是0X68000000.这里我们用FSMC_NE1即0X60000000   
         
    2.确定 LCD_DATA_ADDR,当我们选择上文所提到的FSMC_A16时,LCD_DATA_ADDR=0X60000000+2^16*2=0X60020000.同理选择FSMC_A0时候就是LCD_DATA_ADDR=0X60000000+2^0*2=0X60000002.


    那么写命令就是直接往LCD_CMD_ADDR写
    LCD_WRITE_CMD(u16 cmd)     //写命令到TFT,16位要写2次
    {
    *(vu16*)LCD_CMD_ADDR=cmd;
    }
    写数据就是直接往LCD_DATA_ADDR写
    LCD_WRITE_DATA(u16 Data) //写数据到TFT
    {
    *(vu8*)LCD_DATA_ADDR=Data;
    }      
    至于RD,WE,RS,CS信号都已经是FSMC控制器自动产生的,不用理会
    —————— 配置FSMC时序参数 :见STM32数据手册和TFT手册(不是很懂·····)


    #define LCD_DATA_ADDR    ((u32)0x60020000)       //Disp Data ADDR
    #define LCD_CMD_ADDR    ((u32)0x60000000)           //Disp Reg ADDR
    #define LCD_WR_CMD(cmd)    ((*(__IO u16 *) ( LCD_CMD_ADDR )) = ((u16)cmd))
    #define LCD_WR_Data(data)       ((*(__IO u16 *) (LCD_DATA_ADDR )) = ((u16)(data)))

    void LCD_FSMC_Config(void)
    {
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  p;

        p.FSMC_AddressSetupTime = 0x02;         //地址建立时间
        p.FSMC_AddressHoldTime = 0x00;         //地址保持时间
        p.FSMC_DataSetupTime = 0x05;                 //数据建立时间
        p.FSMC_BusTurnAroundDuration = 0x00;
        p.FSMC_CLKDivision = 0x00;
        p.FSMC_DataLatency = 0x00;
        p.FSMC_AccessMode = FSMC_AccessMode_B;         // 一般使用模式B来控制LCD

        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
        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;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
        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);

        /* 使能 FSMC Bank1_SRAM Bank */
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  
    }

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-3 18:51
  • 签到天数: 772 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-8-19 21:32:55 | 显示全部楼层
    魔方团,才听说,又有这么一个团
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-8-15 09:52
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2013-8-19 22:01:34 | 显示全部楼层
    ddllxxrr 发表于 2013-8-19 21:32
    魔方团,才听说,又有这么一个团

    我们是一个团队
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2014-8-19 06:31
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-8-27 18:40:33 | 显示全部楼层
    dsgthlr 发表于 2013-8-19 22:01
    我们是一个团队

    玩魔方的?-------------------------
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-6-21 12:41
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-8-30 15:14:39 | 显示全部楼层
    补充一下,f4的gpio复用都是要建立复用连接的,而且一个pin一个函数。pin参数不能“或”
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-3 16:03
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-8-30 20:09:07 | 显示全部楼层
    今天研究了一整天啊,刚刚很神奇的就行了,现在都在研究这个究竟改了什么,唉~~~~程序真是神奇的东西啊!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-9-1 22:24
  • 签到天数: 497 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-10-29 18:25:59 | 显示全部楼层
    看了一下觉得描述得不对....是不是笔误?也只是一个新手 感觉和其他资料有些不符
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-8 08:20
  • 签到天数: 116 天

    连续签到: 2 天

    [LV.6]常住居民II

    发表于 2016-7-11 22:14:51 | 显示全部楼层
    看不懂,先收藏吧。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-30 21:07 , Processed in 0.188833 second(s), 29 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.