你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

移植STemwin的好贴子(转)

[复制链接]
ddllxxrr 发布时间:2018-5-6 10:34
本帖最后由 ddllxxrr 于 2018-5-6 10:56 编辑

我按照网上的移植贴子移了一天也没有成功,总显示乱字符,今天看了这个贴子,一下子成功了,给后来者来个方便转一下:L


原贴网址:
http://blog.csdn.net/wangyijieonline/article/details/76795084


这几天在看原子哥的教程的时候,突然发现有个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接口。
如果设置为

GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0);
  • GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0);

则使用的是我们自己的接口
如果是

GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, 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函数也要屏蔽一些东西,如下

  1. void LCD_X_Config(void) {
  2.     //
  3.   // Set display driver and color conversion
  4.   //
  5.   GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0);
  6.   //
  7.   // Display driver configuration, required for Lin-driver
  8.   //
  9.   LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
  10.   LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
  11.   //
  12.   // Orientation
  13.   //
  14. //  Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
  15. //  GUIDRV_FlexColor_Config(pDevice, &Config);
  16. //  //
  17. //  // Set controller and operation mode
  18. //  //
  19. //  PortAPI.pfWrite16_A0  = LcdWriteReg;
  20. //  PortAPI.pfWrite16_A1  = LcdWriteData;
  21. //  PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
  22. //  PortAPI.pfReadM16_A1  = LcdReadDataMultiple;
  23. //  GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);
  24. }
复制代码

屏蔽掉的是引用的函数,只留下三行。

下面还有个函数 LCD_X_DisplayDriver ,这个函数的作用,如官方所说

  这是显示驱动的回调函数。显示驱动在多个任务中要调用该函数。将一个命令和一个指向某个数据结构的指针传给回调程序。该命令告诉回调函数需要做什么。如果命令需要参数,则通过数据指针pData 传送。
  • 这是显示驱动的回调函数。显示驱动在多个任务中要调用该函数。将一个命令和一个指向某个数据结构的指针传给回调程序。该命令告诉回调函数需要做什么。如果命令需要参数,则通过数据指针pData 传送。

我们用这个函数来做初始化的工作,在return 0前面写上你的LCDTFT_Init(),注意最好不要把你的函数写成LCDTFT_Init() ,因为STemwin自带了一个lcd.c lcd.h 预防冲突。

第二步,打开GUIDRV_Template.c 找到_SetPixelIndex 函数,在注释下面加上我们的打点函数

  1. GUI_USE_PARA(PixelIndex);
  2. {
  3.       //
  4.       // Write into hardware ... Adapt to your system
  5.       //
  6.             LCD_DrawPoint(x,y,PixelIndex);
  7. }
复制代码

再往下看_GetPixelIndex ,在注释下面加上读点函数

  1. GUI_USE_PARA(y);
  2. {
  3.   //
  4.   // Write into hardware ... Adapt to your system
  5.   //
  6.   PixelIndex = LCD_ReadPoint(x,y);
  7.   PixelIndex = 0;
  8. }
复制代码

再往下看_FillRect 函数,把else部分改成LCD_Fill,不然清屏太慢了

  1. else {
  2. //    for (; y0 <= y1; y0++) {
  3. //      for (x = x0; x <= x1; x++) {
  4. //        _SetPixelIndex(pDevice, x, y0, PixelIndex);
  5. //      }
  6. //    }
  7.     LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);
  8.   }
复制代码

到此为止,第三步也结束了,也没有很难对不对。


更正:经实测发现这个清屏函数改了以后虽然刷屏速度上来了,但是会出现显示花屏的情况,所以说这个函数大家根据自己的情况修改。


第四步:打开 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 改为如下

  1. extern __IO int32_t OS_TimeMS;

  2. void SysTick_Handler(void)
  3. {
  4.     OS_TimeMS++;
  5.     if(OS_TimeMS%100 == 0)
  6.     {
  7.         LED1 = !LED1;//加个LED指示一下
  8.     }
  9. }
复制代码

到这里移植就算是完成了,剩下的就是,写个mian函数测试一下了

  1. #include "Global.h"
  2. #include "lcd.h"
  3. #include "WM.h"
  4. #include "GUI.h"
  5. #include "led.h"
  6. #include "usart.h"
  7. #include "delay.h"
  8. #include "lcd9341.h"

  9. int main(void)
  10. {
  11.     LED_Init();
  12.     USART1_init();

  13.     SysTick_Config(SystemCoreClock / 1000);//要加上这句话,开启Systick中断

  14.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE); //要加上这句话,打开CRC时钟
  15.     WM_SetCreateFlags(WM_CF_MEMDEV);//要加上这句话,允许存储器
  16.     GUI_Init();//要加上这句话,Init
  17.     GUI_Clear();
  18.     GUI_DispStringAt("Hello World!",30,120);

  19.     while(1);
  20. }
复制代码

20170806221143340.png

帖子太长不适合看,下篇帖子继续写第二种方法





收藏 4 评论2 发布时间:2018-5-6 10:34

举报

2个回答
迎风飘扬 回答时间:2018-11-29 16:27:41
正在学习中
Kevin201707 回答时间:2019-5-18 11:43:43
正在学习

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版