匿名
未登录
登录
丢石头百科
搜索
查看“STM32CubeMX系列教程24:STemWim移植”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
STM32CubeMX系列教程24:STemWim移植
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
<syntaxhighlight lang="python"> 摘要:本章教程带领大家移植StmemWin 5.22到STM32的LDTC接口控制的RGB接口屏幕。 (注:本章只针对STM32芯片F7,F4系列带LDTC接口控制的RGB屏幕,对F1系列通过FMC控制的带控制器的屏幕不适用) <b>一、STemWin 简介</b> emWin是segger公司出一种高效的而图形用户界面,是我们能够摆脱处理器和显示控制器而更专注于GUI的设计。uCGUI是segger公司授权Micrum公司推出的,uCOS操作系统也是这个公司出的。STemWin是SEGGER公司授权给ST的,使用ST芯片的用户可以免费使用STemWin。出于一定保护措施,STemWin的库是不能用在其他公司的处理器上,因为工程初始化STemWin前要使能CRC检验。 <b>二、新建工程</b> <b> </b>本章以上一章LCD触摸控制工程的基础上移植,<b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;">复制上一章Touch的工程,修改文件夹名。<b style="font-family: 微软雅黑;"><b style="font-size: 14px;">打开</b></b></b></b> <b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;"><b><b style="font-size: 14px;">STM32cubeMX的工程文件重新配置,开启CRC校验。</b></b></b></b> [[File:164852my8zq8yg8syisno5.png]] <b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;"> </b></b> <b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;">CRC为默认配置。</b></b> [[File:164852j7h8bolbglgxz2bg.png]] LDTC,FMC(SDRAM),DMA2D配置还是按照原来的设置,这里不再详细简介。另外注意一点堆栈的大小设置大一点,否则会程序会触发硬件错误中断(HardFault)。 <b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;"> </b></b> [[File:164852ec1cfavrr5o1co9m.png]] <b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;">生成报告以及初始化代码,编译程序。</b></b> <b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;">在ST固件库中可以找到STemWin的文件,路径:</b></b><b style="font-size: 14px; line-height: 1.5;"><b style="font-size: 14px;">STM32Cube_FW_F7_V1.3.0\Middlewares\ST\STemWin</b></b> 其目录结构如下,其中Config为配置文件和移植相关,Lib为STemWin封装库,emWin 5.22不再提供源码,Software为电脑上用到的软件,Documentation为STemWin的使用文档。 [[File:164853ev3fsaof2s25ossh.png]] 将STemWin文件夹复制到工程目录下。在下面的路径下找到Demo程序目录复制到刚才的STemWin目录 STM32Cube_FW_F7_V1.3.0\Projects\STM32756G_EVAL\Applications\STemWin\STemWin_SampleDemo 打开工程添加应用文件: [[File:164853gkpjkekkz7zh07n7.png]] 这里简单介绍一下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。 [[File:165015x6k6b9h0w0krb65o.png]] 5.LCDConf.c为LCD底层移植文件,需要用户实现。Config目录下面提供几种移植模块。 [[File:164853ko2joduheoe6cjde.png]] 本章是这个底层移植文件是复制STM32库固件STM32746G-Discovery示例程序的模板再修改。将这个路径下的LCDConf.c文件,以及Inc目录下的LCDConf.h文件复制到Config目录中并添加进工程。 STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\ Applications\STemWin\STemWin_HelloWorld\Src 6.STemWin528_CM7_Keil.lib为STemWin封装库文件,emWin 5.22不再提供源码,而是提供封装库。Lib目录下含有KEIL,IRA和GCC三个编译环境的库,而且还区分带OS和不带OS版本。本教程选择KEIL不带OS版本。 [[File:164853mjrblvg20v026b9g.png]] 7.Demo程序里面包含很多显示程序,为STemWin的示例程序,展示STemWin的各种控件的功能。直接复制固件库STM32756G_EVAL的STemWin Demo程序路径如下: STM32Cube_FW_F7_V1.3.0\Projects\STM32756G_EVAL\Applications\STemWin\STemWin_SampleDemo [[File:164854wsfzra5538wdr7si.png]] 最后要添加目录的路径到工程。 [[File:164854n17iwxa5pgq54y65.png]] <b>三、STemWin底层移植</b> 最后修改一下底层移植文件,GUI_Init初始化流程图如下(可能有些函数有改变)。 [[File:164854qod44vxhorxlj0yv.png]] 底层移植主要是GUI_X_Config()、LCD_X_Config()和LCD_X_DisplayDriver()三个函数。 打开GUIConf.c文件,找到 下面宏定义 <syntaxhighlight lang="python"> // // Define the available number of bytes available for the GUI // #define GUI_NUMBYTES (1024)*150 /********************************************************************* * * Public code * ********************************************************************** */ /********************************************************************* * * GUI_X_Config * * Purpose: * Called during the initialization process in order to set up the * available memory for the GUI. */ void GUI_X_Config(void) { // // 32 bit aligned memory area // static U32 aMemory[GUI_NUMBYTES / 4]; // // Assign memory to emWin // GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); // // Set default font // GUI_SetDefaultFont(GUI_FONT_6X8); }</syntaxhighlight> <code style="line-height: 16px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; color: gray !important;"></syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> 此处初始化GUI可用内存,宏定义GUI的内存大小改小一点,否则编译程序会提示空间不足错误。</syntaxhighlight> <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> // Define the available number of bytes available for the GUI // #define GUI_NUMBYTES (1024)*150</syntaxhighlight> <code style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; color: gray !important;"> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight></code>LCD_X_Config()和LCD_X_DisplayDriver()函数可以在LCDConf.c文件中找到,下载重点讲解一下如何修改一下LCDConf.c文件. 1.修改分辨率 #define XSIZE_PHYS 480 <syntaxhighlight lang="python"> <code style="font-family: Monaco, Consolas, Courier, 'Lucida Console', monospace;"> #define YSIZE_PHYS 272 </syntaxhighlight> </code>改为 <syntaxhighlight lang="python"> <code style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important;"> #define XSIZE_PHYS 1024 #define YSIZE_PHYS 600</syntaxhighlight> </code> <syntaxhighlight lang="python"> 2.修改图像格式,此处改为RGB565格式。程序中设置的是单层显示,故只需layer 0;</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> #define COLOR_CONVERSION_0 GUICC_M8888I #define DISPLAY_DRIVER_0 GUIDRV_LIN_32 改为 <syntaxhighlight lang="python"> #define COLOR_CONVERSION_0 GUICC_M565 #define DISPLAY_DRIVER_0 GUIDRV_LIN_16 /** * @brief Return Pixel format for a given layer * @param LayerIndex : Layer Index * @retval Status ( 0 : 0k , 1: error) */ static inline U32 LCD_LL_GetPixelformat(U32 LayerIndex) { if (LayerIndex == 0) { return LTDC_PIXEL_FORMAT_RGB565; } else { return LTDC_PIXEL_FORMAT_ARGB1555; } }</syntaxhighlight> 上面函数中也改为 <syntaxhighlight lang="python"> return</syntaxhighlight> <syntaxhighlight lang="python"> LTDC_PIXEL_FORMAT_RGB565;</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight>3.修改显存地址,Open746I-C 的SDRAM接到区域2,起始地址为0xD000 0000。 <syntaxhighlight lang="python"> /* From SDRAM */ #define LCD_LAYER0_FRAME_BUFFER ((int)0xC0200000) #define LCD_LAYER1_FRAME_BUFFER ((int)0xC0400000) /* From SDRAM */ #define LCD_LAYER0_FRAME_BUFFER ((int)0xD0200000) #define LCD_LAYER1_FRAME_BUFFER ((int)0xD0400000)</syntaxhighlight> LCD_LL_LayerInit函数中图层的地址也改为 layer_cfg.FBStartAdress = ((uint32_t)0xD0000000); 4.由于DMA2D、LTDC的初始化已经有Cube自动生成的,故不需再在LCDConf.c中初始化。故 LTDC and DMA2D BSP Routines部分的初始化函数可以注释掉。下面两个变量也注释掉 LTDC_HandleTypeDef hltdc; static DMA2D_HandleTypeDef hdma2d; 添加ltdc.h、dma2d.h头文件 <syntaxhighlight lang="python"> /* Includes ------------------------</syntaxhighlight>------------------------------------------*/ <syntaxhighlight lang="python"> #include "LCDConf.h"</syntaxhighlight> <syntaxhighlight lang="python"> #include "GUI_Private.h"</syntaxhighlight> <syntaxhighlight lang="python"> #include "ltdc.h"</syntaxhighlight> <syntaxhighlight lang="python"> #include "dma2d.h"</syntaxhighlight> 另外一下其他改动我就不详细说明了,我这里提供一个已经修改好的文件。 <a class="attach" href="portal.php?mod=attachment&id=601" target="_blank">lcdconfig.zip Demo.c总包含的main.h头文件去掉,改为 #include "stm32f7xx_hal.h" 编译程序,看程序还有错误提示。 <b>四、编辑应用程序</b> <b> </b> 在main函数中添加应用程序,程序中先初始化SDRAM,GUI以及GT811触摸控制芯片。最后调用Demo main函数展示各种酷炫效果。 <syntaxhighlight lang="python"> /* USER CODE BEGIN 2 */ /* Initializes the SDRAM device */ BSP_SDRAM_Init(); /* Init the STemWin GUI Library */ GUI_Init(); /* Initialize the GT811 */ GT811_Init(); /* Activate the use of memory device feature */ WM_SetCreateFlags(WM_CF_MEMDEV); /* Start Demo */ GUIDEMO_Main(); /* USER CODE END 2 */</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight>STemWin的触屏移植只要是通过GUI_TOUCH_StoreStateEx函数不断将当前的触摸状态更新到GUI即可。可以定时器周期性的调用这个函数,本校准是通过触摸中断函数处理,当有触摸时触发外部中断,然后掉用次函数更新坐标到GUI。在main.c文件后面添加中断服务函数。 <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> /* USER CODE BEGIN 4 */ /** * @brief Provide the GUI with current state of the touch screen * @param None * @retval None */ void BSP_Pointer_Update(void) { GUI_PID_STATE TS_State; TS_StateTypeDef ts = {0}; GT811_GetState(&ts); TS_State.Pressed = ts.touchDetected & 0x01; if(TS_State.Pressed != 0 ) { TS_State.Layer = 0; TS_State.x = ts.touchX[0]; TS_State.y = ts.touchY[0]; GUI_TOUCH_StoreStateEx(&TS_State); } } /** * @} */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_7) { BSP_Pointer_Update(); } } /* USER CODE END 4 */</syntaxhighlight> </syntaxhighlight>另外GUI需要一个时基源,本教程用SysTick作为GUI的时基源。在stm32f7xx_it.c文件中添加GUIt头文件已经声明外部变量OS_TimeMS。 <syntaxhighlight lang="python"> /* USER CODE BEGIN 0 */ #include "GUI.h" extern volatile GUI_TIMER_TIME OS_TimeMS; /* USER CODE END 0 */</syntaxhighlight> 在SysTick中断处理函数中添加语句,使OS_TimeMS加1计时。 <syntaxhighlight lang="python"> /** * @brief This function handles System tick timer. */ void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHandler(); /* USER CODE BEGIN SysTick_IRQn 1 */ OS_TimeMS++; /* USER CODE END SysTick_IRQn 1 */ }</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> 最后编译程序,并下载到开发板,如果没有错误则LCD上会显示各种酷炫吊炸天的界面。 </code>
返回至
STM32CubeMX系列教程24:STemWim移植
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志