实现将STemWin图形库移植到STM32F103ZET中,记录简单的操作步骤,以便自己后续查阅。
2/ 解压后,在路径STemWin_Library_V1.2.0\Libraries\STemWinLibrary532下可以找到库文件。
3/ 移植前的准备工作,创建一个完整的工程,并实现对lcd驱动的显示函数(需要用到画点和读点两个基础函数)。另外需要实现一个定时中断(可以用系统SysTick实现)。
4/ 将STemWin库路径STemWin_Library_V1.2.0\Libraries\STemWinLibrary532下的Config、inc、Lib、OS文件夹拷贝到工程目录中(可以新建一个专门的文件夹存放)。
5/ 将拷贝过来文件其中的5个文件添加到keil工程中。
Config\GUIConf.c
Config\GUIDRV_Template.c
Config\LCDConf_FlexColor_Template.c(特殊LCD驱动器改成LCDConf_Lin_Template.c)
Lib\STemWin532_CM3_Keil.lib(该文件根据工程实际需求确定的)
OS\GUI_X.c(如果采用操作系统则添加GUI_X_OS.c)
6/ 修改GUIConf.c
1 #define GUI_NUMBYTES 1024*30
7/ 修改GUIDRV_Template.c
包含lcd驱动库的显示头文件,#include "my_lcd.h"
函数_SetPixelIndex()中,在大括号中间,实现显示器画点操作。
函数_GetPixelIndex()中,在大括号中间,实现显示器读点操作。
8/ 修改LCDConf_FlexColor_Template.c
包含lcd驱动库的显示头文件,#include "my_lcd.h"
根据显示器尺寸修改两个参数:XSIZE_PHYS和YSIZE_PHYS
实现读写lcd寄存器的四个函数:LcdWriteReg、LcdWriteData、LcdWriteDataMultiple、LcdReadDataMultiple
1 /********************************************************************* 2 * 3 * Local functions 4 * 5 ********************************************************************** 6 */ 7 /******************************************************************** 8 * 9 * LcdWriteReg 10 * 11 * Function description: 12 * Sets display register 13 */ 14 static void LcdWriteReg(U16 Data) { 15 // ... TBD by user 16 LCD->LCD_REG = Data; 17 } 18 19 /******************************************************************** 20 * 21 * LcdWriteData 22 * 23 * Function description: 24 * Writes a value to a display register 25 */ 26 static void LcdWriteData(U16 Data) { 27 // ... TBD by user 28 LCD->LCD_RAM = Data;//写入数据 29 } 30 31 /******************************************************************** 32 * 33 * LcdWriteDataMultiple 34 * 35 * Function description: 36 * Writes multiple values to a display register. 37 */ 38 static void LcdWriteDataMultiple(U16 * pData, int NumItems) { 39 while (NumItems--) { 40 // ... TBD by user 41 LCD->LCD_RAM = *pData++;//写入数据 42 } 43 } 44 45 /******************************************************************** 46 * 47 * LcdReadDataMultiple 48 * 49 * Function description: 50 * Reads multiple values from a display register. 51 */ 52 static void LcdReadDataMultiple(U16 * pData, int NumItems) { 53 while (NumItems--) { 54 // ... TBD by user 55 *pData++ = LCD->LCD_RAM; 56 } 57 }
LCD_X_Config函数中,根据实际LCD显示器的驱动芯片,修改GUIDRV_FlexColor_SetFunc函数的具体参数,驱动芯片对应的参数可详查手册。
LCD_X_DisplayDriver函数,case LCD_X_INITCONTROLLER部分中添加调用LCD显示器的初始化函数。
9/ 根据项目实际情况,修改头文件GUIConf.h
#ifndef GUICONF_H #define GUICONF_H/********************************************************************* * * Multi layer/display support */ #define GUI_NUM_LAYERS 2 // Maximum number of available layers/********************************************************************* * * Multi tasking support */ #ifdef OS_SUPPORT#define GUI_OS (1) // Compile with multitasking support #else#define GUI_OS (0) #endif/********************************************************************* * * Configuration of touch support */ #ifndef GUI_SUPPORT_TOUCH#define GUI_SUPPORT_TOUCH (0) // Support touchscreen #endif/********************************************************************* * * Default font */ #define GUI_DEFAULT_FONT &GUI_Font6x8/********************************************************************* * * Configuration of available packages */ #define GUI_SUPPORT_MOUSE (1) /* Support a mouse */ #define GUI_WINSUPPORT (1) /* Use window manager */ #define GUI_SUPPORT_MEMDEV (1) /* Memory device package available */ #define GUI_SUPPORT_DEVICES (1) /* Enable use of device pointers */#endif /* Avoid multiple inclusion */
10/ 主函数中初始化硬件相关后,编写测试代码,并在while(1)循环中调用函数GUI_Delay(10):
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); GUI_Init(); GUI_SetBkColor(GUI_BLUE); //设置背景颜色GUI_SetColor(GUI_YELLOW); //设置颜色GUI_Clear(); //清屏GUI_SetFont(&GUI_Font24_ASCII); //设置字体GUI_DispStringAt("HELLO WORD!", 0, 0);GUI_DispStringAt("123456789", 0, 100);