FSMC灵活的静态存储器控制器,是驱动外部总i线,通俗点讲就是类似51的外部总线是一样的,51单片机驱动1864液晶,如果用IO口模拟液晶的时序,需要用指令分别控制RS,WR,也类似XBYTE[ ]

FSMC翻译过bai来就是灵活的静态存储器控制器,是用来驱du动外部总zhi线的。
关于外部总dao线,你可以想象一下51的外部总线,STM32的FSMC实际上跟51的外部总线是一样的,只不过性能更好,速度更快。
至于总线的优势,可以举个51外部总线的例子,51单片机驱动1864或者1602液晶,如果用IO口模拟液晶的时序,需要用指令分别控制RS,WR,EN控制线还有数据线;但是如果用的是外部总线,从汇编指令上来讲,只需要一条MOVX指令就解决问题了。二者的速度一目了然!

也类似XBYTE[ ]

XBYTE[ ]是用来对一个外部bai的内存单元进行操作的宏,du常常用在将单片机zhi外设作为一个内存单元来访问的情形XBYTE[0x8000]=0x08的意思是对外部的内存单元0x8000写入0x80数据,而且会调用MOVX汇编指令,会产生WR/RD信号,例如你一个外设的使能端接在P2.7脚,在数据线以及WR都接好的情况下就可以给外设写入0x08数据。

XBYTE的用法和地址的含义

 (2010-12-07 21:11:22)

http://blog.sina.com.cn/s/blog_60cbc1700100mzap.html
1、The XBYTE macro accesses individual bytes in the external data memory of the 8051. You may use this macro in your programs as follows:网上找了之后有各种说法,我做如下总结,转载请注明出处:

#include <absacc.h>  
. . . 
rval = XBYTE [0x0002];
 XBYTE [0x0002] = 57;
 . . .

This example reads and writes the contents of the byte in external data memory at address 0002h.

The range of valid index values for this macro is 0-65535.

(以上为官方定义)

2、在<absacc.h>中的定义是

#define XBYTE ((unsigned char volatile xdata *) 0)

可以使用XBYTE去访问外部的RAM,也可以用XBYTE去访问扩展的I/0设备

注意:这里是利用的英特尔总线进行访问的,那么就会有时序的问题,在C语言中,这些都帮你做完了,所以无需考虑

3、关于I/O的控制如下,低字节表示的是P0端口,高字节表示的是P2端口。P2端口通常作为控制端口,而P0通常作为数据端口

eg:XBYTE[0x8800] = buz_stu;

其中用P2做控制,P0的数据就是buz_stu的状态


在一些TFT液晶的操作用经常用得到,并且非常的好用!(以一个TFT为例)
TFT的数据接口为:D0-D15或者D0-D8.
TFT的控制线有:复位信号RST,片选CS,输出使能RD(读信号),写信号WE以及RS信号。
于STM32连线为: RST->GPIO, CS->NEx, RD->NOE, WE->RW, RS->A0(或者其他任何一条地址线)
关键的一点就在于这个RS信号(我只说关键的这一点):
一般TFT的地址线只有1个RS.
以控制芯片的TFT为例.RS=0的时候一般是写命令,RS=1的时候是写数据,把TFT作为只有2个地址的存储器对待.
RS接到哪一个地址线都是可以的。假如RS接到A0,而片选为NE4,总线宽度8位.
那么可以定义
#define Bank1_SRAM4_ADDR ((u32)0x6C000000)
#define LCD_DATA_ADDR (Bank1_SRAM4_ADDR + 1)
#define LCD_CMD_ADDR (Bank1_SRAM4_ADDR + 0)
那么写命令数据就是直接往LCD_CMD_ADDR写数据:(假设cmd,data为16位,而我的TFT数据接口是8位)
LCD_WRITE_CMD(unsigned short cmd) //写命令到TFT,16位要写2次
{
*(vu8*)LCD_CMD_ADDR=(cmd>>8);
*(vu8*)LCD_CMD_ADDR=(cmd);
}
写数据就是直接往LCD_DATA_ADDR写数据:
LCD_WRITE_DATA(unsigned short Data) //写数据到TFT
{
*(vu8*)LCD_DATA_ADDR=(Data>>8);
*(vu8*)LCD_DATA_ADDR=(Data);
}
至于RD,WE,RS,CS信号都已经是FSMC控制器自动产生的,不用理会,不过当然是FSMC及GPIO初始化要正确.而RST信号还是需要通过操作GPIO来完成的.
这是最基本的2个操作。而那些什么设置X,Y,设置窗口,设置亮度,设置。。。。都是由这2个操作组合完成的。
72M HZ,320*240刷单色屏速度在 32fps左右.

猜你喜欢

转载自blog.csdn.net/qq_25814297/article/details/109235010