Stm32+STemWin+LCD
手里有块STM32F4Discovery的板子,最近拿出来玩玩,移植了STemWin配上4.6寸触摸屏,效果还是不错的。
简介
STemWin、emWin& ucGui都差不多,可以当作一个东西,STemWin是ST官方的,使用stm32当然用这个。具体LCD驱动及emWin移植网络资源很多,这里不贴了,只记录使用过程中遇到的问题及解决办法。
效果图:
(1)用GUIBuilder生成界面
(2)表盘界面参考Demo的automotive,但是Demo直接用了bitmap画表盘,这样只能两个一样而且无法修改,这里使用画弧形的方法画出来
QA
(1)LCD驱动移植问题
Ans:这个LCD是4.6寸480*272分辨率的,使用控制IC为ILI9486,使用stm32f407的FSMC接口控制。开始初始化后打开背光一片白屏,和别人给的初始化代码比较都是一样的,百思不得其解;后来仔细看了stm32f407的datasheet才发现,stm32f407的GPIO都是通过选择器连接到复用的模块,所以必须要连接到FSMC模块才能输出信号..
/*GPIO Alternate functions configuration function*/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
(2)STemWin移植
Ans:emWin的移植比较简单,包含STemWin522_CM4_Keil.lib库(据说STemWin使用了FPU所以还要加入DSP库arm_cortexM4lf_math.lib),然后自己添加LCD驱动,自带的LCD驱动所有绘图都用打点的方式,效率太低,屏幕方向、大小的改变也很麻烦。而用自己写的驱动,可以指定要写入的窗口直接用Memory Write (2Ch) command一起写入,很是方便;另外、驱动层也可以指定屏幕方向、分辨率变化,总之对于emWin看来这个LCD就是从(0,0)到(480,272)大小的屏幕,没有坐标翻转偏移的问题。
(1)驱动移植可以参考emWin的文档(GUIDRV_Template - Template for a new driver)这一节介绍了如何实现自己的驱动,完成画点画矩形的函数即可(_SetPixelIndex等),或者参考链接http://www.ba0sh1.com/write-a-display-driver-for-emwin/
(2) 屏幕方向在驱动实现,比较方便,Memory Access Control (36h)和Display Function Control (B6h)寄存器控制,而且可以在运行中动态修改
(3)触摸屏驱动触点会跳问题
Ans:常规的驱动都是取几次数据排序去掉最大和最小值,然后做平均,但是这样很容易出现触摸点跳动的问题,这里的做法是取两次平均的值,当两次值的差小于5的时候才有效。另外一个问题是emWin需要定时调用GUI_TOUCH_Exec()更新触摸值,我把他放在了systick的中断处理函数里,但是本来好好的systick突然就不动了,后来查看code发现是因为delay是用systick实现的,而在触摸驱动又用了systick这样就死循环了,改为for循环做delay。
static void Delay(__IO uint32_t Count)
{
for(; Count != 0; Count--);
}
(4)emWin在模拟器调试
Ans:emWin可以在PC上通过模拟器调试,调好了之后放到stm32就可以直接运行,这里的问题是调试的时候跑到断点模拟器的界面就出不来了,这个问题就要用到emWin的另外一个工具emWinView,调试之前打开emWinView在断点的时候可以通过它观察输出。