[STM32]关于移植STemwin所遇到的问题记录(1)

本文详细介绍STM32平台下STemwin图形库的移植过程,包括LCD显示函数配置、显示驱动初始化及回调函数应用等关键步骤。

这几天在看原子哥的教程的时候,突然发现有个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_FLEXCOLOR, GUICC_M565, 0, 0);

则使用默认的填充接口。
注意了这个地方有个注意的点,就是GUICC_M565GUICC_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);
}

效果图

帖子太长不适合看,下篇帖子继续写第二种方法 Flexcolor
[STM32]关于移植STemwin所遇到的问题记录(2)

DSP和标准外设库: 资源编号 : STSW-STM32065 资源名称 : STM32F4 DSP and standard peripherals library 文件名 : stm32_f105-07_f2_f4_usb-host-device_lib.zip 下载地址 : http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257901# USB库: 资源编号 : STSW-STM32046 资源名称 : STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device library (UM1021) 文件名 : stm32_f105-07_f2_f4_usb-host-device_lib.zip 下载地址 : http://www.st.com/web/en/catalog/tools/PF257882 ETH以太网库: 资源编号 : STSW-STM32046 资源名称 : LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers (AN3966) 文件名 : stsw-stm32070.zip 下载地址 : http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257906 【CMSIS】 Cortex微控制器软件接口程序(Cortex Microcontroller Software Interface Standard (CMSIS). ) 版本: V4.2 发布日期: 31. July 2014 【STM32F4xx_StdPeriph_Driver】 STM32F40x系列CPU标准外设驱动程序 版本: V1.5.0 发布日期: 06-March-2015 【STM32_USB_OTG_Driver】 STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library 版本: V2.1.0 发布日期: 2012-03-19 【STM32_USB_Device_Library】 STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library 版本: V1.1.0 发布日期: 2012-03-05 【STM32_USB_HOST_Library】 STM32F105/7xx, STM32F2xx and STM32F4xx USB Host Library 版本: V2.1.0 发布日期: 2012-03-19 【STM32F4x7_ETH_Driver】 STM32F4x7 Eth Library 版本: V1.1.0 发布日期: 31-July-2013 ********************************************************************************************************* * * 版 本 : V1.0 * 说 明 : 本实验主要实现FreeRTOS+STemWin+FatFS+USB Host综合 * 实验目的: * 1. 学习FreeRTOS+STemWin+FatFS+USB Host综合 * 2. 这里的USB Host主要实现U盘相关处理,支持U盘热插拔。 * 用户可以根据需要在usb_usr.c文件中的插入检测函数: * USBH_USR_Configuration_DescAvailable或者函数USBH_USR_Init函数加入插入标志 * 拔出检测函数: * USBH_USR_DeviceDisconnected * 实验内容: * 1. 按下按键K1可以通过串口打印任务执行情况(波特率115200,数据位8,奇偶校验位无,停止位1) * ================================================= * 任务名 任务状态 优先级 剩余栈 任务序号 * vTaskUserIF R 2 272 2 * vTaskGUI R 1 657 1 * IDLE R 0 113 6 * vTaskMsgPro B 4 1957 4 * vTaskLED B 3 483 3 * vTaskStart B 5 489 5 * * * 任务名 运行计数 使用率 * vTaskUserIF 5583 1% * vTaskGUI 10782 2% * IDLE 355589 91% * vTaskLED 0 <1% * vTaskMsgPro 16770 4% * vTaskStart 17 <1% * 串口软件建议使用SecureCRT(V6光盘里面有此软件)查看打印信息。 * 各个任务实现的功能如下: * vTaskGUI 任务: emWin任务 * vTaskTaskUserIF 任务: 接口消息处理 * vTaskLED 任务: LED闪烁 * vTaskMsgPro 任务: U盘中文件处理和浏览 * vTaskStart 任务: 启动任务,也就是最高优先级任务,这里实现按键扫描和触摸检测 * 2. 任务运行状态的定义如下,跟上面串口打印字母B, R, D, S对应: * #define tskBLOCKED_CHAR ( 'B' ) 阻塞 * #define tskREADY_CHAR ( 'R' ) 就绪 * #define tskDELETED_CHAR ( 'D' ) 删除 * #define tskSUSPENDED_CHAR ( 'S' ) 挂起 * 3. 本实验的USB Host主要是对U盘的操作,通过电脑端的串口软件SecureCRT软件, * 给板子发送相关命令实现操作,具体实现在demo_fatfs文件里面。 * printf("请选择操作命令:\r\n"); * printf("1 - 显示根目录下的文件列表\r\n"); * printf("2 - 创建一个新文件armfly.txt\r\n"); * printf("3 - 读armfly.txt文件的内容\r\n"); * printf("4 - 创建目录\r\n"); * printf("5 - 删除文件和目录\r\n"); * printf("6 - 读写文件速度测试\r\n"); * printf("7 - 挂载U盘\r\n"); * printf("8 - 卸载U盘\r\n"); * 注意事项: * 1. 本实验推荐使用串口软件SecureCRT,要不串口打印效果不整齐。此软件在 * V5开发板光盘里面有。 * 2. 务必将编辑器的缩进参数和TAB设置为4来阅读本文件,要不代码显示不整齐。 * * 修改记录 : * 版本号 日期 作者 说明 * V1.0 2016-03-15 Eric2013 1. ST固件库到V1.5.0版本 * 2. BSP驱动包V1.2 * 3. FreeRTOS版本V8.2.3 * 4. STemWin版本V5.28 * 5. FatFS版本V0.11a * * Copyright (C), 2016-2020, 安富莱电子 www.armfly.com * *********************************************************************************************************
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山猫Show

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值