在做项目的过程中遇到了这个问题,感觉文章写得不错,同享给对FSMC的运用怀有疑问的伙伴们!
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这样的器材后,你会发现,许多芯片的总线,都是这样规划的,为的是节约地址线。