stmcubemx系列教程stemwim移植.docx
《stmcubemx系列教程stemwim移植.docx》由会员分享,可在线阅读,更多相关《stmcubemx系列教程stemwim移植.docx(14页珍藏版)》请在冰豆网上搜索。
stmcubemx系列教程stemwim移植
STM32CubeMX系列教程24:
STemWim移
植
摘要:
本章教程率领大伙儿移植StmemWin5.22到STM32的LDTC接口操纵的RGB接口屏幕。
(注:
本章只针对STM32芯片F7,F4系列带LDTC接口操纵的RGB屏幕,对
F1系列通过FMC操纵的带操纵器的屏幕不适用)
一、STemWin简介
emWin是segger公司出一种高效的而图形用户界面,是咱们能够摆脱处置器
和显示操纵器而更专注于GUI的设计。
uCGUI是segger公司授权Micrum公司推出的,uCOS操作系统也是那个公司出的。
STemWin是SEGGER公司授权给ST的,使
用ST芯片的用户能够免费利用STemWin。
出于必然爱惜方法,STemWin的库是不能用在其他公司的处置器上,因为工程初始化STemWin前要使能CRC查验。
二、新建工程
本章以上一章LCD触摸操纵工程的基础上移植,复制上一章Touch的工程,修
改文件夹名。
打开
STM32cubeMX的工程文件从头配置,开启CRC校验。
CRC为默许配置。
LDTC,FMC(SDRAM),DMA2D配置仍是依照原先的设置,那个地址再也不详细简
介。
另外注意一点堆栈的大小设置大一点,不然会程序会触发硬件错误中断
(HardFault)。
生成报告和初始化代码,编译程序。
在ST固件库中能够找到STemWin的文件,途径:
STM32Cube_FW_F7_V1.3.0\Middlewares\ST\STemWin
其目录结构如下,其中Config为配置文件和移植相关,Lib为STemWin封装库,emWin5.22再也不提供源码,Software为电脑上用到的软件,Documentation为STemWin的利用文档。
将STemWin文件夹复制到工程目录下。
在下面的途径下找到Demo程序目录复制到适才的STemWin目录
STM32Cube_FW_F7_V1.3.0\Projects\STM32756G_EVAL\Applications\STemWin\STemWin_
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为带操作系统版本。
本实验不带OS。
5.LCDConf.c为LCD底层移植文件,需要用户实现。
Config目录下面提供几种移植模块。
本章是那个底层移植文件是复制STM32库固件STM32746G-Discovery例如程序的模
板再修改。
将那个途径下的LCDConf.c文件,和Inc目录下的LCDConf.h文件复制到
Config目录中并添加进工程。
STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\
Applications\STemWin\STemWin_HelloWorld\Src
6.为STemWin封装库文件,emWin5.22再也不提供源码,而是提供封装库。
Lib目录下含有KEIL,IRA和GCC三个编译环境的库,而且还区分带OS和不带OS版本。
本教程选择KEIL不带OS版本。
7.Demo程序里面包括很多显示程序,为STemWin的例如程序,展现
STemWin的各类控件的功能。
直接复制固件库STM32756G_EVAL的STemWin
Demo程序途径如下:
STM32Cube_FW_F7_V1.3.0\Projects\STM32756G_EVAL\Applications\STemWin\STemWin_SampleDemo
最后要添加目录的途径到工程。
三、STemWin底层移植
最后修改一下底层移植文件,GUI_Init初始化流程图如下(可能有些函数有改
变)。
底层移植主若是GUI_X_Config()、LCD_X_Config()和LCD_X_DisplayDriver()
三个函数。
打开GUIConf.c文件,找到下面宏概念
01//
02//DefinetheavailablenumberofbytesavailablefortheGUI
03//
04#defineGUI_NUMBYTES
(1024)*150
05
0/*****************************************************************
6****
07*
08*Publiccode
09*
1******************************************************************
1****
11*/
1/*****************************************************************
2****
13*
14*
GUI_X_Config
15*
16*Purpose:
*
Calledduringtheinitializationprocessinordertosetup
17the
18*
availablememoryfortheGUI.
19*/
20voidGUI_X_Config(void){
21//
22//32bitalignedmemoryarea
23//
24staticU32aMemory[GUI_NUMBYTES/4];
25//
26//AssignmemorytoemWin
27//
28GUI_ALLOC_AssignMemory(aMemory,GUI_NUMBYTES);
29//
30//Setdefaultfont
31//
32GUI_SetDefaultFont(GUI_FONT_6X8);
33}
此处初始化GUI可用内存,宏概念GUI的内存大小改小一点,不然编译程序会提示空
间不足错误。
1//DefinetheavailablenumberofbytesavailablefortheGUI
2//
3#defineGUI_NUMBYTES
(1024)*150
LCD_X_Config()和LCD_X_DisplayDriver()函数能够在LCDConf.c文件中找到,下载
重点讲解一下如何修改一下LCDConf.c文件.
#defineXSIZE_PHYS480#defineYSIZE_PHYS272
改成
#defineXSIZE_PHYS1024#defineYSIZE_PHYS600
2.修改图像格式,此处改成RGB565格式。
程序中设置的是单层显示,故只需
layer0;
#defineCOLOR_CONVERSION_0GUICC_M8888I
#defineDISPLAY_DRIVER_0GUIDRV_LIN_32
改成
01
#defineCOLOR_CONVERSION_0
GUICC_M565
02
#defineDISPLAY_DRIVER_0
GUIDRV_LIN_16
03
04
/**
05
*@brief
ReturnPixelformatforagivenlayer
06
*@param
LayerIndex:
LayerIndex
07
*@retvalStatus(0:
0k,1:
error)
08
*/
09staticinlineU32LCD_LL_GetPixelformat(U32LayerIndex)10{
11if(LayerIndex==0)
12{
13returnLTDC_PIXEL_FORMAT_RGB565;
14}
15else
16{
17returnLTDC_PIXEL_FORMAT_ARGB1555;
18}
19}
上面函数中也改成
returnLTDC_PIXEL_FORMAT_RGB565;
3.修改显存地址,Open746I-C的SDRAM接到区域2,起始地址为0xD000
0000。
1
/*FromSDRAM*/
2
#defineLCD_LAYER0_FRAME_BUFFER
((int)0xC0200000)
3
#defineLCD_LAYER1_FRAME_BUFFER
((int)0xC0400000)
4
5
/*FromSDRAM*/
6
#defineLCD_LAYER0_FRAME_BUFFER
((int)0xD0200000)
7
#defineLCD_LAYER1_FRAME_BUFFER
((int)0xD0400000)
LCD_LL_LayerInit函数中图层的地址也改成
layer_cfg.FBStartAdress=((uint32_t)0xD0000000);
4.由于DMA2D、LTDC的初始化已经有Cube自动生成的,故不需再在
LCDConf.c中初始化。
故
LTDCandDMA2DBSPRoutines部份的初始化函数能够注释掉。
下面两个变量也注
释掉
LTDC_HandleTypeDefhltdc;
staticDMA2D_HandleTypeDefhdma2d;
添加ltdc.h、dma2d.h头文件
/*Includes----------------------------------------------------------
--------*/
#include"LCDConf.h"#include"GUI_Private.h"#include"ltdc.h"#include"dma2d.h"
另外一下其他改动我就不详细说明了,我那个地址提供一个已经修改好的文件。
Dem总包括的头文件去掉,改成
#include"stm32f7xx_hal.h"
编译程序,看程序还有错误提示。
四、编辑应用程序
在main函数中添加应用程序,程序中先初始化SDRAM,GUI和GT811触摸
操纵芯片。
最后挪用Demomain函数展现各类酷炫成效。
01
/*USERCODEBEGIN2*/
02
/*InitializestheSDRAMdevice*/
03
BSP_SDRAM_Init();
04
05
/*InittheSTemWinGUILibrary*/
06
GUI_Init();
07
08
/*InitializetheGT811*/
09
GT811_Init();
10
11
/*Activatetheuseofmemorydevicefeature*/
12
WM_SetCreateFlags(WM_CF_MEMDEV);
13
14/*StartDemo*/
15GUIDEMO_Main();
16/*USERCODEEND2*/
STemWin的触屏移植只若是通过GUI_TOUCH_StoreStateEx函数不断将当前的触摸状态更新到GUI即可。
能够按时器周期性的挪用那个函数,本校准是通过触摸中断函数处置,当有触摸时触发外部中断,然后掉用次函数更新坐标到
GUI。
在main.c文件后面添加中断效劳函数。
01
/*USERCODEBEGIN4*/
02
/**
*@brief
ProvidetheGUIwithcurrentstateofthetouch
03screen
04
*@param
None
05
*@retvalNone
06
*/
07voidBSP_Pointer_Update(void)
08
{
09
GUI_PID_STATETS_State;
10
TS_StateTypeDef
ts={0};
11
12
GT811_GetState(&ts);
13
14TS_State.Pressed=ts.touchDetected&0x01;
15if(TS_State.Pressed!
=0)
16{
17
TS_State.Layer=0;
18
=
ts.touchX[0];
19
=
ts.touchY[0];
20
GUI_TOUCH_StoreStateEx(&TS_State);
21}
22}
23
24/**
25*@}
26*/
27voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin)
28{
29if(GPIO_Pin==GPIO_PIN_7)
30{
31BSP_Pointer_Update();
32}
33}
34/*USERCODEEND4*/
另外GUI需要一个时基源,本教程用SysTick作为GUI的时基源。
在
stm32f7xx_it.c文件中添加GUIt头文件已经声明外部变量OS_TimeMS。
1
/*USERCODEBEGIN0*/
2
#include"GUI.h"
3externvolatileGUI_TIMER_TIMEOS_TimeMS;4/*USERCODEEND0*/
在SysTick中断处置函数中添加语句,使OS_TimeMS加1计时。
01/**
02*@briefThisfunctionhandlesSystemticktimer.
03*/
04voidSysTick_Handler(void)
05{
06/*USERCODEBEGINSysTick_IRQn0*/07
08/*USERCODEENDSysTick_IRQn0*/
9HAL_IncTick();
10HAL_SYSTICK_IRQHandler();
11/*USERCODEBEGINSysTick_IRQn1*/
12OS_TimeMS++;
13/*USERCODEENDSysTick_IRQn1*/
14}
最后编译程序,并下载到开发板,若是没有错误那么LCD上会显示各类酷炫吊炸天的界面。
第一说明下开发条件:
1、开发板:
秉火霸道,STM32F103ZET
2、软件:
(F1V1.60库)
移植中注意的问题:
1、裸机移植STemWin时,TFT液晶屏驱动函数所在文件不能是“LCD.C”和“LCD.h”(不区分大小写),这一步比较重要,因为STemWin的库中有一个“LCD.h”的头文件!
在文件中的voidLCD_X_Config(void)函数里面的最后一句话为:
GUIDRV_FlexColor_SetFunc(pDevice,&PortAPI,GUIDRV_FLEXCOLOR_F66708,
GUIDRV_FLEXCOLOR_M16C0B16);
咱们需要修改的是GUIDRV_FLEXCOLOR_F66708那个参数。
GUIDRV_FLEXCOLOR_F66708
那个参数的修改要依照你的TFT屏所利用的
驱动芯片,如我的TFT利用的驱动芯片是“ILI9325”,因此GUIDRV_FLEXCOLOR_F66708。
若是你的是“ILI9341”,那么就改成GUIDRV_FLEXCOLOR_F66709。
若是是其它型号的驱动芯片那么需要查询的用户手册然后进行修改。
用户手册
可在“STemWinLibrary532”文件夹中的“STemWinLibrary532\Documentation”目录下找到,
该手册是一份PDF文档,...