2020-01-10 19:37发布
kalo425 发表于 2013-11-25 08:58 请问,这个91FPS,也不是很慢了···弄动画,放个视频啥的,大概需要多少?40FPS? 图中,你自己刷的 ...
bart 发表于 2013-11-24 14:08 内行,说的对。为此关键部分我用汇编写。这个屏的写最小周期是100ns,我的写速度为111ns,还是加了延时的 ...
snoopyzz 发表于 2013-11-26 23:12 不需要汇编...KEIL MDK,stm32f103c8t6 驱动SSD1289的240*320 @16bit GPIO模拟8080时序 TFT, O3级别优化, ...
最多设置5个标签!
用单 {MOD}刷屏,只要把颜 {MOD}写到databus上,然后不断翻转WR就可以了。F1的端口翻转最大18Mhz,一个周期55ns, 小于LCD要求的100ns写周期,所以瓶颈在LCD上, CPU要加延时。
但是要显示位图就不同了,这个牵涉到从flash或者内存读数据,写databus, 然后再翻转WR,我目前能做到的从ram读然后写LCD一个写周期200ns左右。所以如果内存够,每帧图像能够及时载入内存,达到40fps也是可能的。
如果要括ram, 就应该考虑fsmc了。我此作的目的是给没有fsmc的芯片驱动lcd找个办法
不需要汇编...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
憋了一天邮件验证,终于又可以发言了。说不了话果然比说不出话难过。
说的不错。这段优化的代码的确效率很高。
从你的 4.80701ms看,每个象素的写周期62.59ns,这个已经小过我的HX8352C的最小写周期要求了。SSD1289应该本身就比较快
之所以用汇编,是因为汇编不受编译器优化等级影响。这样程序的其他部分可以-O0编译,方便调试,而LCD驱动部分仍旧用最快速度运行。
我先贴一段汇编部分的代码,其实我的汇编学习经历只有1天。大家砸砖。
驱动部分汇编
一周热门 更多>