主要针对的是正点原子STM32实验中的屏幕驱动。 OLED类似于点阵数据,每个像素点的值只有0和1的选择,数据量不大。分辨率较小:128*64,因此可以在单片机内存里面开辟一个二维数组,这个数组就相当于屏幕在内存里面的1:1映射。然后每次更新的时候,将这个数组写入到屏幕中,就可以实现。这个写入方法有很多,一般根据屏幕的接口选择。一般有8080、SPI。IIC和串口应该用的不多,因为这两个数据总线的传输效率较低(个人想法,未经验证)。实际上,嵌入式设备只要在内存允许的情况下很多这么做的,所以才有屏幕刷新,帧率这个说法,指的就是这个数据传输的快慢,显然,屏幕越大,分辨率越高,刷新一次的时间就越长。因此为了适应大屏幕要求,所以又产生了HDMI、VGA这一类专用的视频传输协议。虽然,这种方法看起来简单易懂不高端,但是由于硬件算力足够,因此能够快速完成项目,这样在工程开发中,是具备很强优势的。 针对正点原子的TFTLCD实验,这其实是一个非常巧妙,完美的做法。这个实验里面运用到的技巧和方法都是十分值得学习的。 一句话概况:考虑到TFTLCD显存太大,无法在单片机内部建立一个等比例数组,因此使用LCD挂到FSMC当外部SRAM处理。难点在于:LCD控制器,使用的16位双向数据/命令线。FSMC的数据线和地址线是分开的,此时应该怎么连线,以及怎么控制。 在这里就不得不先介绍内存芯片的使用原理(这里的内存芯片指的是RAM,是用来存放运算数据的芯片)。内存芯片一定是由多少位的地址线和多少位的数据线来控制的的。为什么分开呢,是为了保证数据传输的高效性,数据地址分开处理,地址线上给定一个地址,然后数据线上就立马给出一个数据,这样就使得数据直接到达芯片中的指定地址处。 正点原子的做法是:将LCD的双向总线连接到FSMC的数据总线上,方便数据读写,然后用地址总线去控制16位双向数据/地址线的选择引脚RS引脚。假设RS置1是写数据 ;RS置0是写命令 具体做法是,将RS引脚接到地址总线上的一个引脚,这样对这个引脚写1的那些地址。从数据线上传出去的就是数据,对这个引脚写0的那些地址,从数据线上传出去的就是命令。为什么这里强调那些地址,因为使一个地址线某bit置1的地址有很多。举个例子,假如RS接到A0,8位地址总线其余引脚悬空,那么0000 0001 和1111 0001 的意义是一样的,因为A0都是1 ,从数据线上传输出去的都是数据。正点原子的做法是,将RS接到A6,然后通过结构体进行封装。这一块不详细介绍,具体结果就是 得到了两个地址0X6C00 007E(命令)和0X6C000080(数据)。写命令流程如下:将命令reg写入到0X6C00 007E这个地址->FSMC地址总线向外部引脚发送0X6C00 007E这个地址并将命令reg通过数据总线发出->LCD控制器通过RS了解得到的是命令->从双向数据/命令线上得到这个命令。读过程反向即可。 就这样,通过对这两个地址的读写,FSMC数据总线不停的向LCD发送数据或者命令。 可能有人发现这个里面有一个巨大漏洞,那就是,我一次只传输一个数据,那么传输一张图片时,你怎么能够保证数据的正确性。这个功能得益于,LCD控制芯片自带的扫描功能,可以自动从左到右,从上到下的扫描,这样,我们只需要不停的往这个0X6C000080(数据)地址里面丢数据,图片就自动填充了。 关键点:1、这两个地址的选取是有技巧的,需要关注结构体内变量的数据宽度。(16位,因为地址总线是16位的) 2、在于对内存机制的理解,目前理解纯属个人理解,但是应该就这样,
|