emWin笔记

2021/10/30 One-minute read

序章

很早就想整理一下之前学到的东西了,一直没什么时间,也不知道从哪里开始,就简单的谈谈emWin吧。

emWin是什么

emWin是Segger针对嵌入式平台开发的适用于图形LCD的操作应用,其实这种非人类式语言很难让人理解。说人话就是基于STM系列芯片在开发你能在显示屏上看到的应用界面。由于接触到的是医疗行业,所以举个例子吧:医院里的监护仪(血氧仪)上的各种图像界面,以及触控按键操作,都是可以通过emWin设计完成。

相关准备

GUI Builder(作为入门了解,实际开发不用), emWin(自带很多官方示例,很有参考价值) , VisulStudio(主要开发工具),编程语言为C语言。

安富莱参考手册:有能力的可以直接看英文参考手册,安富莱的手册相对而言更适合刚接触的人。

浅谈emWin

为什么叫浅谈呢?因为21年5月份之后就没用啦,没有当时用的时候那么清楚啦。

官网下载的emWin工具包里有字体,图片转换工具。主要作用就是将字体,图片转换为C语言代码。

字体这里就不得不提一下,转换的时候,记得开抗锯齿,记得开抗锯齿,记得开抗锯齿。重要的事情说三遍,如果在VS上调试的时候看见有字体有毛刺一定要注意,当烧录到硬件上时候可能会更明显,所以要开抗锯齿。关于字体版权的问题也要注意一下,如果你们公司不在意,那当我没说啦。有些字体不支持抗锯齿,尽量选用较为主流的字体。字体这里还要注意的是,按需原则,芯片的内存一般是有限的,如果你把整个字体转换为c语言代码,加入到工程中会很大,我可以很明确的说如果你是自己弄着玩的请随意,毕竟没有真机给你调试,VS上怎么折腾都没关系。实际上把用到的字转c代码即可,不必全部转。

图片的话因为格式很多,我记得有一种格式是最优解,不过时间久远,记不清了,哈哈,埋下一个小坑。

关于Button的问题:如果需要改皮肤颜色必须设置为经典皮肤,这个地方可以说是折腾死人,毕竟品牌设计给的样子,咱们实现起来有困难,宝宝心里苦哇。

定时器:这也是我在项目中遇到的问题。emwin GUI自带的定时器无法进入,具体的原因不清楚,解决方法就是:

hTimer = WM_CreateTimer(hWin, 0, 1000, 0); 修改为 hTimer =WM_CreateTimer(WM_GetClientWindow(hWin),0,1000,0);后我们就会惊喜的发现定时器能正常工作了

自定义消息无法接收到的问题:emWin对话框接收不到自定义消息。解决方案:https://blog.csdn.net/Quartu_flag/article/details/79435971

两个概念的问题:背景和窗口,先看下代码吧:

刚开始学emWin,肯定会想用背景色填充整个屏幕,发现怎么填都是黑的(灰的,大概就这个颜色),这个颜色是系统默认的,我用一个系统API显示的,跟这个颜色一样,假如我想让背景色为蓝色,应该怎么写呢,我只改了MainTask函数,其余的全部没动,看如下代码:
	1. void MainTask(void) {
	2. 
	3.  GUI_Init();
	4.  //GUI_GetDefaultColor();
	5.  GUI_SetBkColor(COLOR_BLUE);
	6.  GUI_Clear();
	7. 
	8.  while (1) {
	9.    GUI_Delay(50);
	10.  }
	11. 
	12. }
这样在运行,整个屏幕就都是蓝色的了
必须加上GUI_Clear();你可以去掉看看显示结果。

背景可以理解为是整个LCD屏幕,窗口把他理解为对话框吧免得混淆。我们就是要在显示屏上创建一个个对话框,来完成我们的功能。

为什么要区分这两个概念呢?因为会让你写代码不困惑。emWin里有些API操作的是对桌面进行的,而如果你创建了一个窗口铺满了整个屏幕,那个时候你使劲操作发现没有效果的时候就可以回过头来重新理解一下,因为被坑过,哈哈。

核心

这里我只想说,emWin的核心就是回调函数,第二个点就是理解:重绘机制。我们在屏幕上看到的所有场景都是不断地在刷新的,速度很快以至于肉眼分辨不出罢了。这个重绘真的是在写代码的时候搞得脑壳疼呐。

代码偷懒必看

每一个界面都包含很多个控件,而所有的控件的位置都是需要你一个一个去设置的。开发中吃过的亏,第一次接触,傻乎乎的一个一个调。本来调好了之后开开心心,结果UI重新设计,哦吼,一首凉凉走起,当晚就和月亮星星一起睡了。

使用宏定义的方式定义长度宽度边距,控件基于宏定义去设计,不管怎么搞,调一下宏定义的值就好啦。

emWin之外

事实上当你开始弄emWin,我有理由相信,你一定要接触硬件。如果你能面对换芯片调整代码的痛苦,如果你能面对看着原理图调试代码的惨淡人生,如果你能面对SPI Flash数据存储逻辑的难关,那么恭喜你,你已经是一名大师级别的人物了。可以奖励自己一朵小红花。

终章

所有的坑都要你自己去踩一遍,然后我们就会有共鸣了,难道不是吗?