[STM32]--关于移植STemwin所遇到的问题记录(1)
2017-08-06 22:12
357 查看
这几天在看原子哥的教程的时候,突然发现有个STemwin的教程,然后就想来捣鼓捣鼓,但没想到,原本以为很简单的移植却遇到困难重重,特立下此帖警示后人!!!
首先下载源码,构建工程什么的假设已经完成了,而且也已经有了一个可以正常显示的Demo,这是最基本的,如果这些都还没做好,那就需要先准备一下了。
然后有了一个正常显示的demo还不够,还必须要准备好这么几个函数,后面要用到。
1,LCD_DrawPoint(x,y,PixelIndex); //画点函数,注意有三个参数
2,LCD_ReadPoint(x,y);//读点的颜色,两个参数
3,LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);//清屏函数,不能用自带的,太慢了
其实这几个函数应该很好准备,如果你的LCD已经正常显示了,那么说明LCD_DrawPoint和LCD_Fill最起码已经可用,或者修改一下可用,readpoint需要着重的准备下。
正题开始了,理论上来说,移植STemwin应该是有两种方法,第一种是完全不用STemwin的接口,使用我们自己的,这就是上面准备的几个函数的用途,第二种方法是直接填充STemwin的画点等相关函数,当然这两种方法也可以同时移植但是最后用哪种方法是怎么选择呢,答案就是LCDConf_FlexColor_Template.c 中的LCD_X_Config函数中的GUI_DEVICE_CreateAndLink接口。
如果设置为
则使用的是我们自己的接口
如果是
则使用默认的填充接口。
注意了这个地方有个注意的点,就是GUICC_M565 和 GUICC_565 ,这两兄弟看起来很像,其实他们所表示的颜色是完全反相的。
我们先来说第一种移植方法(使用自己的接口):
第一步:新建一个LCD_Conf.h文件,空文件即可,里面不需要有内容
第二步:打开LCDConf_FlexColor_Template.c 屏蔽掉LCD_X_Config函数前面的四个函数,对了,这四个函数就是第二种方法需要填充的,这里先把话说清楚为什么不要了。而 LCD_X_Config函数也要屏蔽一些东西,如下
屏蔽掉的是引用的函数,只留下三行。
下面还有个函数 LCD_X_DisplayDriver ,这个函数的作用,如官方所说
我们用这个函数来做初始化的工作,在return 0前面写上你的LCDTFT_Init(),注意最好不要把你的函数写成LCDTFT_Init() ,因为STemwin自带了一个lcd.c lcd.h 预防冲突。
第二步,打开GUIDRV_Template.c 找到_SetPixelIndex 函数,在注释下面加上我们的打点函数
再往下看_GetPixelIndex ,在注释下面加上读点函数
再往下看_FillRect 函数,把else部分改成LCD_Fill,不然清屏太慢了
到此为止,第三步也结束了,也没有很难对不对。
更正:经实测发现这个清屏函数改了以后虽然刷屏速度上来了,但是会出现显示花屏的情况,所以说这个函数大家根据自己的情况修改。
第四步:打开 GUIConf.c 文件,找到GUI_NUMBYTES ,改成
这个是定义的Emwin所占的内存空间,如果太大的话,就会出现
类似的错误。
第六步:打开stm32f4xx_it.c 找到SysTick_Handler 改为如下
到这里移植就算是完成了,剩下的就是,写个mian函数测试一下了
帖子太长不适合看,下篇帖子继续写第二种方法
首先下载源码,构建工程什么的假设已经完成了,而且也已经有了一个可以正常显示的Demo,这是最基本的,如果这些都还没做好,那就需要先准备一下了。
然后有了一个正常显示的demo还不够,还必须要准备好这么几个函数,后面要用到。
1,LCD_DrawPoint(x,y,PixelIndex); //画点函数,注意有三个参数
2,LCD_ReadPoint(x,y);//读点的颜色,两个参数
3,LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);//清屏函数,不能用自带的,太慢了
其实这几个函数应该很好准备,如果你的LCD已经正常显示了,那么说明LCD_DrawPoint和LCD_Fill最起码已经可用,或者修改一下可用,readpoint需要着重的准备下。
正题开始了,理论上来说,移植STemwin应该是有两种方法,第一种是完全不用STemwin的接口,使用我们自己的,这就是上面准备的几个函数的用途,第二种方法是直接填充STemwin的画点等相关函数,当然这两种方法也可以同时移植但是最后用哪种方法是怎么选择呢,答案就是LCDConf_FlexColor_Template.c 中的LCD_X_Config函数中的GUI_DEVICE_CreateAndLink接口。
如果设置为
GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0);
则使用的是我们自己的接口
如果是
GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0);
则使用默认的填充接口。
注意了这个地方有个注意的点,就是GUICC_M565 和 GUICC_565 ,这两兄弟看起来很像,其实他们所表示的颜色是完全反相的。
我们先来说第一种移植方法(使用自己的接口):
第一步:新建一个LCD_Conf.h文件,空文件即可,里面不需要有内容
第二步:打开LCDConf_FlexColor_Template.c 屏蔽掉LCD_X_Config函数前面的四个函数,对了,这四个函数就是第二种方法需要填充的,这里先把话说清楚为什么不要了。而 LCD_X_Config函数也要屏蔽一些东西,如下
void LCD_X_Config(void) { // // Set display driver and color conversion // GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0); // // Display driver configuration, required for Lin-driver // LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS); LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS); // // Orientation // // Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y; // GUIDRV_FlexColor_Config(pDevice, &Config); // // // // Set controller and operation mode // // // PortAPI.pfWrite16_A0 = LcdWriteReg; // PortAPI.pfWrite16_A1 = LcdWriteData; // PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple; // PortAPI.pfReadM16_A1 = LcdReadDataMultiple; // GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16); }
屏蔽掉的是引用的函数,只留下三行。
下面还有个函数 LCD_X_DisplayDriver ,这个函数的作用,如官方所说
这是显示驱动的回调函数。显示驱动在多个任务中要调用该函数。将一个命令和一个指向某个数据结构的指针传给回调程序。该命令告诉回调函数需要做什么。如果命令需要参数,则通过数据指针pData 传送。
我们用这个函数来做初始化的工作,在return 0前面写上你的LCDTFT_Init(),注意最好不要把你的函数写成LCDTFT_Init() ,因为STemwin自带了一个lcd.c lcd.h 预防冲突。
第二步,打开GUIDRV_Template.c 找到_SetPixelIndex 函数,在注释下面加上我们的打点函数
GUI_USE_PARA(PixelIndex); { // // Write into hardware ... Adapt to your system // LCD_DrawPoint(x,y,PixelIndex); }
再往下看_GetPixelIndex ,在注释下面加上读点函数
GUI_USE_PARA(y); { // // Write into hardware ... Adapt to your system // PixelIndex = LCD_ReadPoint(x,y); PixelIndex = 0; }
再往下看_FillRect 函数,把else部分改成LCD_Fill,不然清屏太慢了
else { // for (; y0 <= y1; y0++) { // for (x = x0; x <= x1; x++) { // _SetPixelIndex(pDevice, x, y0, PixelIndex); // } // } LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX); }
到此为止,第三步也结束了,也没有很难对不对。
更正:经实测发现这个清屏函数改了以后虽然刷屏速度上来了,但是会出现显示花屏的情况,所以说这个函数大家根据自己的情况修改。
第四步:打开 GUIConf.c 文件,找到GUI_NUMBYTES ,改成
#define GUI_NUMBYTES 1024 *40
这个是定义的Emwin所占的内存空间,如果太大的话,就会出现
Error: L6406E: No space in execution regions with .ANY selector matching lcd.o(.data).
类似的错误。
第六步:打开stm32f4xx_it.c 找到SysTick_Handler 改为如下
extern __IO int32_t OS_TimeMS; void SysTick_Handler(void) { OS_TimeMS++; if(OS_TimeMS%100 == 0) { LED1 = !LED1;//加个LED指示一下 } }
到这里移植就算是完成了,剩下的就是,写个mian函数测试一下了
#include "Global.h" #include "lcd.h" #include "WM.h" #include "GUI.h" #include "led.h" #include "usart.h" #include "delay.h" #include "lcd9341.h" int main(void) { LED_Init(); USART1_init(); SysTick_Config(SystemCoreClock / 1000);//要加上这句话,开启Systick中断 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE); //要加上这句话,打开CRC时钟 WM_SetCreateFlags(WM_CF_MEMDEV);//要加上这句话,允许存储器 GUI_Init();//要加上这句话,Init GUI_Clear(); GUI_DispStringAt("Hello World!",30,120); while(1); }
帖子太长不适合看,下篇帖子继续写第二种方法
相关文章推荐
- [STM32]--关于移植STemwin所遇到的问题记录(2)
- [OpenGL]移植OpenGL项目遇到的问题记录
- 关于.ocx和.dll控件注册遇到的问题记录
- stm32移植lwip时遇到的问题。
- 关于调试项目遇到的问题记录
- 关于LWIP_1.4.1在STM32平台移植后大数据包ping不通问题
- 关于tornado的国际化遇到的问题记录
- 关于游戏制作过程中遇到的几个问题记录
- 关于在2440上移植rtl8192和rtl8188cus linux驱动遇到的问题及解决方法!!!
- 关于P2P打洞中遇到问题的记录
- 关于jquery全选和取消全选遇到的只能选一次问题记录
- STM32调试过程中遇到BIN文件生成问题记录
- STM32之STemwin移植及调试问题总结
- 关于AudioManager在项目中遇到的一些问题的记录
- WIN10环境下关于如何卸载SQLServer2008及遇到的问题记录
- [STM32]--关于Keil5移植SDIO不成功的问题
- 关于这周工作中遇到的关于缓存问题的记录
- stm32移植过程中遇到的问题
- 记录IIS7上配置.Net2010的mvc2遇到的jQuery关于ie的Ajax小问题..
- 关于项目中WebView遇到的问题记录