为STemWin写LCD驱动成功了

2020-01-10 19:37发布

发一个视频
http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=120106287_2408901642_Ohq8TCM6WTHK+l1lHz2stqlF+6xCpv2xhGiwu1qtJQ9fUQ6YJMXNb9wF4CjWBs1K9noLHcwydPwm1h0raqJf/s.swf

用STM32F103VET6,驱动HX8352C的TFT(来自fq1888的福利http://www.amobbs.com/forum.php? ... &extra=page%3D2)
软件使用了ST官方的STemWin(就是emWin 5.22),自己写了驱动程序。

原本想用FSMC,后来考虑成本想换RBT6,于是改用GPIO驱动。目前RBT6核心板在路上,先用VET6的GPIO测试。

目前正在整理代码,加注释。即将开源请关注。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
66条回答
bart
1楼-- · 2020-01-12 13:56
本帖最后由 bart 于 2013-11-25 13:28 编辑
kalo425 发表于 2013-11-25 08:58
请问,这个91FPS,也不是很慢了···弄动画,放个视频啥的,大概需要多少?40FPS?  图中,你自己刷的  ...


用单 {MOD}刷屏,只要把颜 {MOD}写到databus上,然后不断翻转WR就可以了。F1的端口翻转最大18Mhz,一个周期55ns, 小于LCD要求的100ns写周期,所以瓶颈在LCD上, CPU要加延时。
但是要显示位图就不同了,这个牵涉到从flash或者内存读数据,写databus, 然后再翻转WR,我目前能做到的从ram读然后写LCD一个写周期200ns左右。所以如果内存够,每帧图像能够及时载入内存,达到40fps也是可能的。

如果要括ram, 就应该考虑fsmc了。我此作的目的是给没有fsmc的芯片驱动lcd找个办法

fq1888
2楼-- · 2020-01-12 18:34
 精彩回答 2  元偷偷看……
snoopyzz
3楼-- · 2020-01-12 23:50
bart 发表于 2013-11-24 14:08
内行,说的对。为此关键部分我用汇编写。这个屏的写最小周期是100ns,我的写速度为111ns,还是加了延时的 ...

不需要汇编...KEIL MDK,stm32f103c8t6  驱动SSD1289的240*320 @16bit GPIO模拟8080时序 TFT,
O3级别优化,  
测试我写的代码 (含颜 {MOD}配置, 窗口设置等代码)
Lcd_BackColor(RGB(255,0,0));
Lcd_Clear();
耗时是 4.80701ms,即 208fps

理论最高速度, 不算颜 {MOD}配置, 窗口配置这些的话是
240*320/18MHz = 4.2667ms

即 234 fps(理论最高而已, 事实上达不到)


我用的纯C代码, 已经很接近理论上限了...
TFT屏本身显示都根不上了...三 {MOD}混一起条纹滚动显示...
汇编不是必须的...关键在于 BSRR/BSRR的使用, 以及达夫设备

=================================================
;;;226    void Lcd_WriteGRAM(COLOR color, s32 size)
000000  b5f0              PUSH     {r4-r7,lr}
;;;227    {
;;;228        LCD_SEND_CMD(0x22);     // Prepare to write GRAM
000002  4d18              LDR      r5,|L11.100|
000004  f44f4600          MOV      r6,#0x8000
000008  616e              STR      r6,[r5,#0x14]
00000a  f44f4c80          MOV      r12,#0x4000
00000e  f8c5c014          STR      r12,[r5,#0x14]
000012  4b15              LDR      r3,|L11.104|
000014  14ea              ASRS     r2,r5,#19
000016  601a              STR      r2,[r3,#0]
000018  4f14              LDR      r7,|L11.108|
00001a  2422              MOVS     r4,#0x22
00001c  603c              STR      r4,[r7,#0]
00001e  1f1c              SUBS     r4,r3,#4
000020  6022              STR      r2,[r4,#0]
;;;229        LCD_RS_OUT(1);
000022  612e              STR      r6,[r5,#0x10]
;;;230        LCD_DAT_OUT(color);
000024  6038              STR      r0,[r7,#0]
;;;231        switch(size&7)
000026  f0010007          AND      r0,r1,#7
00002a  2808              CMP      r0,#8
00002c  d215              BCS      |L11.90|
00002e  e8dff000          TBB      [pc,r0]
000032  1412              DCB      0x14,0x12
000034  100e0c0a          DCB      0x10,0x0e,0x0c,0x0a
000038  0806              DCB      0x08,0x06
                  |L11.58|
;;;232        {
;;;233            default:
;;;234                while((size-=8)>=0)
;;;235                {
;;;236                    LCD_WR_OUT(0);  LCD_WR_OUT(1);
00003a  601a              STR      r2,[r3,#0]
00003c  6022              STR      r2,[r4,#0]
;;;237            case 7: LCD_WR_OUT(0);  LCD_WR_OUT(1);
00003e  601a              STR      r2,[r3,#0]
000040  6022              STR      r2,[r4,#0]
;;;238            case 6: LCD_WR_OUT(0);  LCD_WR_OUT(1);
000042  601a              STR      r2,[r3,#0]
000044  6022              STR      r2,[r4,#0]
;;;239            case 5: LCD_WR_OUT(0);  LCD_WR_OUT(1);
000046  601a              STR      r2,[r3,#0]
000048  6022              STR      r2,[r4,#0]
;;;240            case 4: LCD_WR_OUT(0);  LCD_WR_OUT(1);
00004a  601a              STR      r2,[r3,#0]
00004c  6022              STR      r2,[r4,#0]
;;;241            case 3: LCD_WR_OUT(0);  LCD_WR_OUT(1);
00004e  601a              STR      r2,[r3,#0]
000050  6022              STR      r2,[r4,#0]
;;;242            case 2: LCD_WR_OUT(0);  LCD_WR_OUT(1);
000052  601a              STR      r2,[r3,#0]
000054  6022              STR      r2,[r4,#0]
;;;243            case 1: LCD_WR_OUT(0);  LCD_WR_OUT(1);
000056  601a              STR      r2,[r3,#0]
000058  6022              STR      r2,[r4,#0]
                  |L11.90|
00005a  3908              SUBS     r1,r1,#8              ;234
00005c  d5ed              BPL      |L11.58|
;;;244                }

;;;245        }
;;;246        LCD_CS_OUT(1);
00005e  f8c5c010          STR      r12,[r5,#0x10]
;;;247    }
000062  bdf0              POP      {r4-r7,pc}
;;;248   
                          ENDP





fangying712
4楼-- · 2020-01-13 05:11
刷屏速度够快吗?我之前用IO刷屏,速度跟不上
bart
5楼-- · 2020-01-13 05:15
snoopyzz 发表于 2013-11-26 23:12
不需要汇编...KEIL MDK,stm32f103c8t6  驱动SSD1289的240*320 @16bit GPIO模拟8080时序 TFT,
O3级别优化, ...

憋了一天邮件验证,终于又可以发言了。说不了话果然比说不出话难过。
说的不错。这段优化的代码的确效率很高。
从你的 4.80701ms看,每个象素的写周期62.59ns,这个已经小过我的HX8352C的最小写周期要求了。SSD1289应该本身就比较快
之所以用汇编,是因为汇编不受编译器优化等级影响。这样程序的其他部分可以-O0编译,方便调试,而LCD驱动部分仍旧用最快速度运行。
我先贴一段汇编部分的代码,其实我的汇编学习经历只有1天。大家砸砖。
LCDPort_GPIO16.zip (3.47 KB, 下载次数: 113) 2013-11-28 08:49 上传 点击文件名下载附件
驱动部分汇编
xyz2008
6楼-- · 2020-01-13 09:05
1024,

一周热门 更多>