1、STM32CubeMX 系列教程 24:STemWim 移植 摘要:本章教程带领大家移植 StmemWin 5.22 到 STM32 的 LDTC 接口控制的 RGB 接口屏幕。 (注:本章只针对 STM32 芯片 F7,F4 系列带 LDTC 接口控制的 RGB 屏幕,对F1 系列通过 FMC 控制的带控制器的屏幕不适用) 一、 STemWin 简介 emWin 是 segger 公司出一种高效的而图形用户界面,是我们能够摆脱处理器和显示控制器而更专注于 GUI 的设计。 uCGUI 是 segger 公司授权 Micrum 公司推出的 ,uCOS 操作系统也是这个公司出的。 STemWin
2、 是 SEGGER 公司授权给 ST 的,使用 ST 芯片的用户可以免费使用 STemWin。出于一定保护措施, STemWin 的库是不能用在其他公司的处理器上,因为工程初始化 STemWin 前要使能 CRC 检验。 二、新建工程 本章以上一章 LCD 触摸控制工程的基础上移植, 复制上一章 Touch 的工程,修改文件夹名。 打开 STM32cubeMX 的工程文件重新配置,开启 CRC 校验。 CRC 为默认配置。 LDTC, FMC(SDRAM), DMA2D 配置还是按照原来的设置,这 里不再详细简介。另外注意一点堆栈的大小设置大一点,否则会程序会触发硬件 错误中断(HardFau
3、lt)。 生成报告以及初始化代码,编译程序。 在 ST 固件库中可以找到 STemWin 的文件 ,路径:STM32Cube_FW_F7_V1.3.0MiddlewaresSTSTemWin 其目录结构如下,其中 Config 为配置文件和移植相关, Lib 为 STemWin 封装库, emWin 5.22 不再提供源码, Software 为电脑上用到的软件 ,Documentation 为 STemWin 的使用文档。 将 STemWin 文件夹复制到工程目录下。在下面的路径下找到 Demo 程序目录复制到刚才的 STemWin 目录 STM32Cube_FW_F7_V1.3.0Proj
4、ectsSTM32756G_EVALApplicationsSTemWinSTemWin_SampleDemo 打开工程添加应用文件: 这里简单介绍一下 STemWin 的几个文件。 1.stm32746g_sdram.c 为 SDRAM 驱动文件,程序中使用 SDRAM 作为 LCD的显存 2.GT811.c 为触摸芯片驱动文件, TS_I2C.c 为模拟 I2C 驱动文件 3.GUIConf.c 为 STemWin 软件包中 Config 目录下的文件。 4.GUI_X.c 文件为 OS 目录下的文件,其中 GUI_X.c 为不带操作系统。 版本, GUI_X_OS.c 为带操作系统版本。
5、本实验不带 OS。 5.LCDConf.c 为 LCD 底层移植文件,需要用户实现。 Config 目录下面提供几种移植模块。 本章是这个底层移植文件是复制 STM32 库固件 STM32746G-Discovery 示例程序的模板再修改。将这个路径下的 LCDConf.c 文件,以及 Inc 目录下的 LCDConf.h 文件复制到Config 目录中并添加进工程。 STM32Cube_FW_F7_V1.3.0ProjectsSTM32746G-Discovery ApplicationsSTemWinSTemWin_HelloWorldSrc 6.STemWin528_CM7_Keil.l
6、ib 为 STemWin 封装库文件, emWin 5.22 不再提供源码,而是提供封装库。 Lib 目录下含有 KEIL,IRA 和 GCC 三个编译环境的库,而且还区分带 OS 和不带 OS 版本。本教程选择 KEIL 不带 OS 版本 。 7.Demo 程序里面包含很多显示程序,为 STemWin 的示例程序,展示STemWin 的各种控件的功能。直接复制固件库 STM32756G_EVAL 的 STemWin Demo 程序路径如下: STM32Cube_FW_F7_V1.3.0ProjectsSTM32756G_EVALApplicationsSTemWinSTemWin_Sampl
7、eDemo 最后要添加目录的路径到工程。 三、 STemWin 底层移植 最后修改一下底层移植文件, GUI_Init 初始化流程图如下(可能有些函数有改变)。 底层移植主要是 GUI_X_Config()、 LCD_X_Config()和 LCD_X_DisplayDriver()三个函数。 打开 GUIConf.c 文件,找到 下面宏定义 01 / 02 / Define the available number of bytes available for the GUI 03 / 04 #define GUI_NUMBYTES (1024)*150 05 06 /* 07 * 08 *
8、 Public code 09 * 10 * 11 */ 12 /* 13 * 14 * GUI_X_Config 15 * 16 * Purpose: 17 * Called during the initialization process in order to set up the 18 * available memory for the GUI. 19 */ 20 void GUI_X_Config(void) 21 / 22 / 32 bit aligned memory area 23 / 24 static U32 aMemoryGUI_NUMBYTES / 4; 25 /
9、26 / Assign memory to emWin 27 / 28 GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); 29 / 30 / Set default font 31 / 32 GUI_SetDefaultFont(GUI_FONT_6X8); 33 此处初始化 GUI 可用内存,宏定义 GUI 的内存大小改小一点,否则编译程序会提示空间不足错误。 1 / Define the available number of bytes available for the GUI 2 / 3 #define GUI_NUMBYTES (1024
10、)*150 LCD_X_Config()和 LCD_X_DisplayDriver()函数可以在 LCDConf.c 文件中找到,下载重点讲解一下如何修改一下 LCDConf.c 文件 . 1.修改分辨率 #define XSIZE_PHYS 480 #define YSIZE_PHYS 272 改为 #define XSIZE_PHYS 1024 #define YSIZE_PHYS 600 2.修改图像格式,此处改为 RGB565格式。程序中设置的是单层显示,故只需layer 0; #define COLOR_CONVERSION_0 GUICC_M8888I #define DISPLA
11、Y_DRIVER_0 GUIDRV_LIN_32 改为 01 #define COLOR_CONVERSION_0 GUICC_M565 02 #define DISPLAY_DRIVER_0 GUIDRV_LIN_16 03 04 /* 05 * brief Return Pixel format for a given layer 06 * param LayerIndex : Layer Index 07 * retval Status ( 0 : 0k , 1: error) 08 */ 09 static inline U32 LCD_LL_GetPixelformat(U32 La
12、yerIndex) 10 11 if (LayerIndex = 0) 12 13 return LTDC_PIXEL_FORMAT_RGB565; 14 15 else 16 17 return LTDC_PIXEL_FORMAT_ARGB1555; 18 19 上面函数中也改为 return LTDC_PIXEL_FORMAT_RGB565; 3.修改显存地址, Open746I-C 的 SDRAM 接到区域 2,起始地址为 0xD000 0000。 1 /* From SDRAM */ 2 #define LCD_LAYER0_FRAME_BUFFER (int)0xC0200000)
13、3 #define LCD_LAYER1_FRAME_BUFFER (int)0xC0400000) 4 5 /* From SDRAM */ 6 #define LCD_LAYER0_FRAME_BUFFER (int)0xD0200000) 7 #define LCD_LAYER1_FRAME_BUFFER (int)0xD0400000) LCD_LL_LayerInit 函数中图层的地址也改为 layer_cfg.FBStartAdress = (uint32_t)0xD0000000); 4.由于 DMA2D、 LTDC 的初始化已经有 Cube 自动生成的,故不需再在LCDConf
14、.c 中初始化。故 LTDC and DMA2D BSP Routines 部分的初始化函数可以注释掉。下面两个变量也注释掉 LTDC_HandleTypeDef hltdc; static DMA2D_HandleTypeDef hdma2d; 添加 ltdc.h、 dma2d.h 头文件 /* Includes -*/ #include “LCDConf.h“ #include “GUI_Private.h“ #include “ltdc.h“ #include “dma2d.h“ 另外一下其他改动我就不详细说明了,我这里提供一个已经修改好的文件。 lcdconfig.zip Demo.c
15、 总包含的 main.h 头文件去掉,改为 #include “stm32f7xx_hal.h“ 编译程序 ,看程序还有错误提示。 四、编辑应用程序 在 main 函数中添加应用程序,程序中先初始化 SDRAM, GUI 以及 GT811 触摸控制芯片。最后调用 Demo main 函数展示各种酷炫效果。 01 /* USER CODE BEGIN 2 */ 02 /* Initializes the SDRAM device */ 03 BSP_SDRAM_Init(); 04 05 /* Init the STemWin GUI Library */ 06 GUI_Init(); 07 0
16、8 /* Initialize the GT811 */ 09 GT811_Init(); 10 11 /* Activate the use of memory device feature */ 12 WM_SetCreateFlags(WM_CF_MEMDEV); 13 14 /* Start Demo */ 15 GUIDEMO_Main(); 16 /* USER CODE END 2 */ STemWin 的触屏移植只要是通过 GUI_TOUCH_StoreStateEx 函数不断将当前的触摸状态更新到 GUI 即可。可以定时器周期性的调用这个函数,本校准是通过触摸中断函数处理,当
17、有触摸时触发外部中断,然后掉用次函数更新坐标到GUI。在 main.c 文件后面添加中断服务函数。 01 /* USER CODE BEGIN 4 */ 02 /* 03 * brief Provide the GUI with current state of the touch screen 04 * param None 05 * retval None 06 */ 07 void BSP_Pointer_Update(void) 08 09 GUI_PID_STATE TS_State; 10 TS_StateTypeDef ts = 0; 11 12 GT811_GetState(
18、13 14 TS_State.Pressed = ts.touchDetected 15 if(TS_State.Pressed != 0 ) 16 17 TS_State.Layer = 0; 18 TS_State.x = ts.touchX0; 19 TS_State.y = ts.touchY0; 20 GUI_TOUCH_StoreStateEx( 21 22 23 24 /* 25 * 26 */ 27 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 28 29 if(GPIO_Pin = GPIO_PIN_7) 30 31 BSP_P
19、ointer_Update(); 32 33 34 /* USER CODE END 4 */ 另外 GUI 需要一个时基源,本教程用 SysTick 作为 GUI 的时基源。在stm32f7xx_it.c 文件中添加 GUIt 头文件已经声明外部变量 OS_TimeMS。 1 /* USER CODE BEGIN 0 */ 2 #include “GUI.h“ 3 extern volatile GUI_TIMER_TIME OS_TimeMS; 4 /* USER CODE END 0 */ 在 SysTick 中断处理函数中添加语句,使 OS_TimeMS 加 1计时。 01 /* 02
20、 * brief This function handles System tick timer. 03 */ 04 void SysTick_Handler(void) 05 06 /* USER CODE BEGIN SysTick_IRQn 0 */ 07 08 /* USER CODE END SysTick_IRQn 0 */ 09 HAL_IncTick(); 10 HAL_SYSTICK_IRQHandler(); 11 /* USER CODE BEGIN SysTick_IRQn 1 */ 12 OS_TimeMS+; 13 /* USER CODE END SysTick_
21、IRQn 1 */ 14 最后编译程序,并下载到开发板,如果没有错误则 LCD 上会显示各种酷炫吊炸天的界面。 首先说明下开发条件: 1、开发板:秉火霸道, STM32F103ZET 2、软件: Cubemx V4.23( F1 V1.60 库) UCOSIII 3.03 STemWin 5.32 FreeRTOS 9.00 移植中注意的问题: 1、裸机移植 STemWin 时, TFT 液晶屏驱动函数所在文件不能是 “LCD.C”和 “LCD.h”(不区分大小写 ),这一步比较重要,因为 STemWin 的库中有一个 “LCD.h”的头文件! 在 LCDConf_FlexColor_Temp
22、late.c 文件中的 void LCD_X_Config(void)函数里面的最后一句话为: GUIDRV_FlexColor_SetFunc(pDevice, 我们需要修改的是 GUIDRV_FLEXCOLOR_F66708这个参数。 GUIDRV_FLEXCOLOR_F66708 这个参数的修改要根据你的 TFT 屏所使用的 驱动芯片,如我的 TFT 使用的驱动芯片是 “ILI9325”,所以 GUIDRV_FLEXCOLOR_F66708。如果你的是 “ILI9341”,那么就改成 GUIDRV_FLEXCOLOR_F66709。如果是其它型号的驱动芯片则需要查询 emWin5.32 的用户手册然后进行修改。 emWin5.32 用户手册 可在 “STemWinLibrary532”文件夹中的 “STemWinLibrary532Documentation”目录下找到,该手册是一份 PDF 文档, .