您的位置 首页 FPGA

stm32 fsmc 功用解说

LCD有如下控制线:CS:ChipSelect片选,低电平有效RS:RegisterSelect寄存器选择WR:Write写信号,低电平有效RD:Read读信号,

LCD有如下操控线:

CS:Chip Select 片选,低电平有用
RS:Register Select 寄存器挑选
WR:Write 写信号,低电平有用
RD:Read 读信号,低电平有用
RESET:重启信号,低电平有用
DB0-DB15:数据线

假设这些线,悉数用一般IO口操控。依据LCD操控芯片手册(大部分操控芯片时序差不多):
假设状况如下:
DB0-DB15的IO悉数为1(表明数据0xff),也可认为其他恣意值,这儿以0xff为例。
CS为0(表明选上芯片,CS拉低时,芯片对传入的数据才会有用)
RS为1(表明DB0-15上传递的是要被写到寄存器的值),假设为0,表明传递的是数据。
WR为0,RD为1(表明是写动作),反过来便是读动作。
RESET一向为高,假设RESET为低,会导致芯片重启。
这种状况,会导致一个值0xff被传入芯片,被LCD操控芯片当作写寄存器值去解析。LCD操控芯片收到DB0-15上的值之后,依据其他操控线的状况,它得出结论,这个0xff是用来设置寄存器的。一般状况下,LCD操控芯片会把传入的寄存器值的高8位作为寄存器地址(由于芯片内部必定不止一个寄存器),低8位作为真实的要赋给对应寄存器值。这样,就完结了一个写LCD操控芯片内部寄存器的时序。

假设上述状况不变,只将RS置低,那么得到的状况如下:LCD操控芯片会把DB0-15上的数据作为单纯的数据值来处理。那么假设LCD处在画图状况,这个传入的值0xff,就会被显现到对应的点上,0xffff就表明白色,那么对应的点便是白色。在这个数据值传递过来之前,程序必定会经过设置寄存器值,告知LCD操控芯片要写的点的方位在哪里。

假设上述两种状况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片需求去读DB0-15的值,而LCD操控芯片就会去设置DB0-15的值,然后完结读数据的时序。

读寄存器的时序费事一点。榜首步,先要将WR和RD都置低,主控芯片经过DB0-15传入寄存器地址。第二步就和前面读数据相同,将WR置高,RD置低,读出DB0-15的值即可。在这整个的过程中,RS一向为低。

好了,上面便是IO直接操控LCD的办法。假设放到STM32里边,用IO直接操控显得功率很低。STM32有FSMC(其实其他芯片根本都有相似的总线功用),FSMC的优点便是你一旦设置好之后,WR、RD、DB0-DB15这些操控线和数据线,都是FSMC主动操控的。打个比方,当你在程序中写到:
*(volatile unsigned short int *)(0x60000000)=val;
那么FSMC就会主动履行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会出现出写的时序出来(即WE=0,RD=1),数据val的值也会经过DB0-15主动出现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被出现在数据线上(即A0-A25=0,地址线的对应最费事,要依据具体状况来,好好看看FSMC手册)。
那么在硬件上面,咱们需求做的,仅仅是MCU和LCD操控芯片的衔接联系:
WE-WR,均为低电平有用
RD-RD,均为低电平有用
FSMC-D0-15接LCD DB0-15
衔接好之后,读写时序都会被FSMC主动完结。可是还有一个很要害的问题,便是RS没有接,CS没有接。由于在FSMC里边,根本就没有对应RS和CS的脚。怎样办呢?这个时分,有一个好办法,便是用某一根地址线来接RS。比方咱们挑选了A16这根地址线来接,那么当咱们要写寄存器的时分,咱们需求RS,也便是A16置高。软件中怎样做呢?也便是将FSMC要写的地址改成0x60020000,如下:
*(volatile unsigned short int *)(0x60020000)=val;
这个时分,A16在履行其他FSMC的一起会被拉高,由于A0-A18要出现出地址0x60020000。0x60020000里边的Bit17=1,就会导致A16为1。
当要读数据时,地址由0x60020000改为了0x60000000,这个时分A16就为0了。

那么有朋友就会有疑问,榜首,为什么地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎样接;第三,为什么Bit17对应A16?
先来看前两个问题,咱们找到STM32的FSMC手册,在FSMC手册里边,咱们很简单找到,FSMC将0x60000000-0x6fffffff的地址用作NOR/PRAM(共256M地址规模)。而这个存储块,又被分成了四部分,每部分64M地址规模。当对其间某个存储块进行读写时,对应的NEx就会置低。这儿,就处理了咱们两个问题,榜首,LCD的操作时序,和NOR/PRAM是相同的(为什么相同自己找找NOR/PRAM的时序看看),所以咱们挑选0x6xxxxxxx这个地址规模(挑选这个地址规模,操作这个地址时,FSMC就会出现出NOR/PRAM的时序)。第二,咱们能够将NEx衔接到LCD的CS,只需咱们操作的地址是榜首个存储块内即可(即0-0x3ffffff地址规模)。

第三个问题再来看一看FSMC手册关于存储器字宽的描绘,咱们发现,当外部存储器是16位时,硬件管脚A0-A24表明的是地址线A1-A25的值,所以咱们要位移一下,Bit17的值,实践会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑问,当你触摸了多NOR/PRAM这样的器材后,你会发现,许多芯片的总线,都是这样规划的,为的是节约地址线。

那么上面就彻底处理了LCD驱动怎么接FSMC的问题,假设读者没懂,主张将上述文字抄上一遍,FSMC手册对应NOR/PRAM的章节抄一遍。还没懂,就持续抄一遍,抄到懂停止。
尽管上述仅仅针对LCD讲解了FSMC,可是其实对NOR和外部RAM的操作也是相似的,只不过多了些地址线来寻址罢了。–By YuanYin.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/259765.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部