事情还要从我上淘宝捡便宜买了一块ST7789主控的LCD开始说起(不是广告),然后折腾半天才发现这玩意需要用SPI进行初始化QAQ。。(以下省略N字)
在翻F1C100s手册的时候偶然间看到TCON的数据源中写到了“DMA565”,然后再一次在偶然间翻DMA的手册时发现F1C100有个叫DDMA的东西可以用DRQ的形式向TCON发送数据,来实现类似于Framebuffer的功能,于是我开始尝试调试这个玩意。这个DMA方式的Framebuffer是我自己几乎从零开始慢慢摸索,断断续续整了几个月弄出来的(其实绝大部分时间都花在了TCON的调试上)。
DMA方式的特点在于代码小,避开了图像引擎那资料极少、难以理解、操作还极其繁琐的初始化过程,这样一来增强了可移植性,而且顺便避开了图像引擎工作带来的工作耗电量。而且我还发现使用图像引擎方式屏幕上的像素点会有一定抖动,但DMA方式则完全不会抖动。要说缺点的话,其一是只能使用RGB565,其二是不能使用图像引擎的硬件混色和图层叠加啥的,其三是会一定程度上占用AHB总线。但这些在大部分情况下影响都不大,毕竟代码量只有5KB这个大优势是一直都在的。
裸机BootLoader使用了我前段时间在论坛里开源过的BootLoader,并修复了一些小Bug(代码大小的判断出错)。目前试了三种交叉编译链都能正常编译运行。
软件部分秉承我的一贯风格,使用了我自己写的外设寄存器结构体(这段时间摸索出来了一种极其方便的利用Excel处理手册的方法)。程序里存进去了一张数组形式的图片用于测试。开发环境用的是VSCode,但其它环境应该也没问题。
硬件部分是荔枝派NANO+官方4.3寸屏或者通过转接板连接我上面蓝字那款ST7789的屏(这坑人玩意还涨价了)。其中转接板我用了一种极其鬼畜的方式复用了LCD的引脚来进行软件模拟SPI通讯,居然成功了,AD工程附在文件里。
正所谓前人种树后人乘凉,希望我开源这个东西可以帮到以后入坑的同好。这个DMA-TCON方式实在是有太多坑了,我在程序里基本都详细地一一注释了,有些手册写的不清楚的地方我也根据自己的推断写了注释。
离线
感谢楼主分享
离线
感谢分享,留个记录,方便回看
离线
感谢分享,留个爪印,过几天研究下
离线
这种方式双buffer切换好实现吗?
离线
优秀 楼主有心了备注
离线
这种方式双buffer切换好实现吗?
理论上来讲,只要更改DDMA的源地址寄存器就行了
离线
哥们,通过参考你的裸机驱动,我把我的屏也显示了,就是,不能控制显示方向,我需要横屏显示,通过改36寄存器。发现无效,无论改成任何值,都是竖屏。
你的屏能用F1C100S 显示成横屏吗?
离线
最后,参考linux驱动,搞定了。
离线
优秀,看来要恶补一下
离线
试试看,不知道速速度能增加多少
离线
离线
这裸机是keil工程的吗,优秀,我看看怎么实现的
离线
DMA是个好办法!
离线
这么厉害,这么小代码就驱动起来了啊
离线
可玩性很高嘛
离线
通吃各种小屏了
离线
有没有dma官方的例程可以参考?
离线
你好,18位的lcd接口是怎么初始化的?
离线
膜拜楼主,感觉这个是解决屏幕撕裂的好方法
离线
我想知道FPS增加了什么
离线
F1C1002 TCON0 用DMA还是比较简洁,可以直接跳过DE。
离线
但是F1C100S资料并没有说明LCDC DMA的地址是哪里。
离线
离线
按照上面这张图,LCDC DMA的地址应该是FIFO1。
离线
按照上面这张图,LCDC DMA的地址应该是FIFO1。
时间有点久了,我记得f1c的tcon的dma是比较特殊的dma,内部应该有硬件连接,没有目标地址,直接设置目标类型就行。具体你还是看代码吧。
那个fifo1是tcon的硬件实现,程序好像不用管
离线
准备把F1C100S当单片机那样使用,纯裸机运行,不知道楼主这个是否可以,我先下载下来研究研究。谢谢楼主
离线
按照上面这张图,LCDC DMA的地址应该是FIFO1。
--DMA地址在此处,可以定义为LCD显存的起始地址
离线
@f_Endman
请问楼主,这个工程文件,在vscode环境下如何编译?我在window系统下安装了vscode,但不知道如何编译。。。
我是初学者,对编译环境很陌生,不知道从何下手
我也安装了keil MDK软件,不知道如何移植到keil下,群里有没有移植成功的朋友?
离线
原来是在linux环境下编译的,转移到linux下就可以成功编译了。
编译前需要把原来生成的bin和elf文件删除、Tool文件夹下生成的AddCheckSum文件也删除。然后再在主目录下执行make。
离线
使用图像引擎方式有参考代码吗
离线
是不是写linux驱动也是一样的,申请出framebuff结构体,在proble函数中初始化这个tcon,然后填数据就好了?
离线
de方式 LCD要用中断吗
离线
想知道FPS增加了什么
离线
666这样就和单片机一样炒作了,比跑linux方便,启动速度还快
离线
IM012不是设置好那种模式,为什么还要用SPI配置
离线
IM012不是设置好那种模式,为什么还要用SPI配置
RGB模式需要SPI初始化,因为分辨率和gamma等通过spi配置
离线
大佬,出现撕裂效果应该怎么整?
离线
这裸机是keil工程的吗
离线
f1cxxx虽然有性价比,但资料真的是不给啊
离线
这种dma的方式可以用在lvgl的disp_flush中使用吗
离线
f1cxxx资料真的是不给,任何配置都需要猜测.
离线
最后,参考linux驱动,搞定了。
请问,最后是通过软件方式实现的横竖屏显示吗?
离线
要是在裸机运行lvgl上,能否再开DMA?
离线
最后,参考linux驱动,搞定了。
大佬,怎么搞定的,我现在也碰到这个竖屏转横屏的问题了
离线
请问TCON中的TCON_INT_REG0中断怎么跟TCON_INTERRUPT建立连接关系的?
离线
挖个坟,现在正在找spi初始化RGB屏幕的方法。
离线