基于STM32的uCGUI移植和优化

2026/4/24 9:46:49

30 /* 绘制水平线函数 */ 31 } 32

33 /********************************************************************* 34 *

35 * LCD_L0_DrawVLine 36 */

37 void LCD_L0_DrawVLine(int x, int y0, int y1) { 38 /* 绘制垂直线函数 */ 39 } 40

41 /********************************************************************* 42 *

43 * LCD_L0_FillRect 44 */

45 void LCD_L0_FillRect(int x0, int y0, int x1, int y1) { 46 /* 填充矩阵函数 */ 47 } 48

49 /********************************************************************* 50 *

51 * LCD_L0_DrawBitmap 52 */

53 void LCD_L0_DrawBitmap(int x0, int y0, 54 int xsize, int ysize, 55 int BitsPerPixel, 56 int BytesPerLine,

57 const U8 GUI_UNI_PTR * pData, int Diff, 58 const LCD_PIXELINDEX* pTrans) 59 {

60 /* 画位图函数 */ 61 } 62

63 /********************************************************************* 64 *

65 * LCD_L0_SetOrg 66 */

67 void LCD_L0_SetOrg(int x, int y) { 68 /* 该函数保留 */ 69 }

70

71 /********************************************************************* 72 *

73 * LCD_On / LCD_Off 74 */

75 void LCD_On (void) { 76 /* 开启LCD */ 77 }

78 void LCD_Off(void) { 79 /* 关闭LCD */ 80 } 81

82 /********************************************************************* 83 *

84 * LCD_L0_Init 85 */

86 int LCD_L0_Init(void) { 87 /* LCD初始化 */ 88 } 89

90 /********************************************************************* 91 *

92 * LCD_L0_SetLUTEntry 93 */

94 void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) { 95 /* 修改 LCD 控制器的 LUT 的中的单个条目 */ 96 } 97 98 #else 99

100 void LCDNull_c(void);

101 void LCDNull_c(void) {} /* 请保持这个函数为空 */ 102 103 #endif 复制代码

移植讲到这边差不多就结束了,因为是凭着自己的感觉写的,所以可能很多东西讲的不是很清楚,有需要我精讲的可以联系我,我会陆续修改,接下来我们开始我们的优化之旅 补充:

优化篇

这里的优化会介绍两种模式,GPIO口模拟程序,FSMC模块模式.

FSMC模式只有在STM32大容量模式的主控才有的,优化起来效果确实很是最好的,因为当你根据液晶屏ic配置好fsmc的时候,液晶屏的寄存器和GRAM就会被映射到系统的4G内存空间的某一块区域,我们往指定地址写数据或读数据,FSMC就会自动帮你把数据送到液晶屏控制器上面了,所以这里面我们省去了对GPIO管脚和接口的操作(...这个确实很强大,因为你可以花更多的时间来进行运算,每个点都是通过指令来产生的,产生指令也是需要时间的,同样,模拟IO口时序也是需要时间的,把这部分时间剩下来,是非常可观的),至于一些人不理解FSMC其实也不是很打紧啦,你就把GRAM和液晶屏寄存器想象成一个完整的外置SRAM就可以了,因为他们的时序都是同一个原理的,而FSMC就是会自动帮你模拟各种IO口操作,我把它简单的理解成(你写的io口操作程序,他用硬件来实现了).

相信大家都有看到别人移植好的demo程序,里面最开始以来就是一个speedDEMO,这个是测试每秒钟可以通过计算可以画多少个点,里面包含了随即填充矩阵函数.

分数越高,代表着你刷频也就是越快,当然,跟着我的脚步走,可以快到把刷这个字去掉(不严格意义上);

在做优化的时候,我们得提前做好准备,因为优化更多代表着是结构性的破坏,可读性的疯狂下降,因为从最底层的函数开始一层一层封装上去,使得函数可以很容易的去理解调用,我们优化就是拆开这些函数调用,并把一些有关硬件层的驱动进行修改,对算法进行更新. 举个函数调用的例子,填充矩阵:

这个比较大家可看可不看,涉及到一些汇编的知识.略过对后面的理解没有问题.

1 void fill_Rect(int v, int h, int x, int y) 2 {

3 for (i

5 for (j

7 Darw_Point(a,b); 8 } 9 } 10 } 11

12 void Darw_Point(int x,int y) 13 {

14 Set_LCD_reg(); 15 Set_LCD_gram(); 16 } 17

18 void Set_LCD_reg() 19 {

20 /* 写入寄存器 */ 21 } 22

23 void Set_LCD_gram() 24 {

25 /* 写入显存 */ 26 } 复制代码

这是我随便写的一个函数,我们差不多都是这样子调用一个写点的函数把,通过计算可得,假设我们要绘制一个100*100的矩阵, 那么就要调用10000次

Darw_Point函数,10000次Set_LCD_reg函数,10000Set_LCD_gram()函数,而每次调用一个函数的时候,要包括如下过程: 1.把要传递的参数压入堆栈中

2.把上一层程序的返回地址压入堆栈中

3.对程序的运行指针进行偏移操作,指向调用程序的入口地址 4.执行程序时候如果有需要要进行堆栈保护

5.执行程序完毕,堆栈要进行释放,还原给调用它的函数使用 6.弹出返回地址

7.返回,并继续执行上层程序.

而真正的,我们执行程序的时候,嵌套了那么多层的调用,执行的只有一个寄存器赋值,所以系统更多时候是在疯狂的进行压栈和出栈活动, 如果我们把这些时间都去掉,

效率就是呈现几何倍数增长,这种是毋庸置疑的.

出了通过对函数进行拆解,算法和硬件的结合也是非常重要的,像你画个矩形,一个通过点来填充,通过直线来填充,甚至, 为什么你没有想到通过矩阵来填充呢?有时候想法

就是这样,这在很多IC上是可以很轻松的实现的,前提是你得通读datasheet. 具体的我通过函数来为大家进行一一讲解:

这是优化后的填充点函数:

/*********************************************************************已经最优化 *

* LCD_L0_SetPixelIndex *

* Purpose:

* Writes 1 pixel into the display. */

void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {

/* 填充x轴坐标和y轴坐标 */

*(__IO uint16_t *)(Bank4_LCD_C) = 0x0200;


基于STM32的uCGUI移植和优化.doc 将本文的Word文档下载到电脑
搜索更多关于: 基于STM32的uCGUI移植和优化 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219