发现 STM32 纯刷屏还是挺给力的,速度达到85每秒

2019-08-18 20:52发布

有图有真相:


如果我的代码没问题的话,应该就是这个速度了,
把原子哥提供的LCD例程进行了些改动,还没完全消化成自己的,
现在只能刷屏和填充矩形,

把一些支持其它我没见过的型号的屏的代码给删了,虽然这些对效率影响不大,

为了提高刷屏速度,我把编译器的优化开到了最大,

还有其它改动,这里简单说明,

void finline LCD_WriteData(u16 data){ WriteDataPort(data); LCD_WriteTrig(); } 原本有 CS 和 RS 的设置,但是这个函数是在刷屏的循环中的,对刷屏速度的影响至关重要,所以CS把抽出来交给用户处理,而RS默认就是高电平就行了,因为设置LCD的内部index的频率比较小。
//清屏函数 //Color:要清屏的填充 {MOD} void LCD_ClearScreen(u16 Color) { LCD_SetCursor(0x00,0x0000);//设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM for(u32 index=width*height;index;index--) { LCD_WriteData(Color); } } 这里的 for(u32 index=width*height;index;index--) 递增式循环和递减式循环的效率是不一样的,递减式循环把速度从78帧/s提升到了85帧/s

另外我还把读延时去掉了,不知会不会导致以后出现问题
不过我的LCD屏怪怪的,现在要把开始板以特殊的姿势放着才能正常显示,怀疑是接触不良,又好像是速度太快造成的。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
noip0726
1楼-- · 2019-08-18 23:09
。。。本质上

for( statement1; statement2; statement3)
 body;
就是
statement1
while(statement2)
{
body;
statement3
}

而且如果是在C++里,for的初始化语句还可以定义一个for内部的局部变量,用起来更方便省心。
Pony279
2楼-- · 2019-08-19 03:02
上面的递减式循环通常比递增式循环快是有理论凭据的,展开汇编来看就知道了。
Pony279
3楼-- · 2019-08-19 04:56
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-08-19 05:03
 

两种方式生成的代码
递减式,SUB完就可以直接跳转了

而递增式,ADD完还得来个CMP才能转


这种优化应该归为汇编指令上的优化,效果最差,意义不大。也只能说稍微懂一点汇编有点帮助罢了。

Pony279
5楼-- · 2019-08-19 06:14
RS优化后可以从28 29 升到 30 多,具体记不清楚了,然后再开挂,好像是到58左右,再优化CS就78左右,最后改成递减式循环,就是85了
Pony279
6楼-- · 2019-08-19 12:12
不错.学习了

一周热门 更多>