当前位置:首页 > 技术 > Cortex-M3 > 正文内容

STM32CubeMX系列教程24:STemWim移植

watrt6年前 (2017-12-17)Cortex-M327530

摘要:本章教程带领大家移植StmemWin 5.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封装库,emWin 5.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.STemWin528_CM7_Keil.lib为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.0\Projects\STM32756G_EVAL\Applications\STemWin\STemWin_SampleDemo

最后要添加目录的路径到工程。

三、STemWin底层移植最后修改一下底层移植文件,GUI_Init初始化流程图如下(可能有些函数有改变)。

底层移植主要是GUI_X_Config()、LCD_X_Config()和LCD_X_DisplayDriver()三个函数。打开GUIConf.c文件,找到 下面宏定义

//
// 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);
}

此处初始化GUI可用内存,宏定义GUI的内存大小改小一点,否则编译程序会提示空间不足错误。

// Define the available number of bytes available for the GUI
//
#define GUI_NUMBYTES  (1024)*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 DISPLAY_DRIVER_0   GUIDRV_LIN_32改为

#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;
  } 
}

上面函数中也改为
return LTDC_PIXEL_FORMAT_RGB565;
3.修改显存地址,Open746I-C 的SDRAM接到区域2,起始地址为0xD000 0000。

/* 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)

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头文件

/* Includes ------------------------------------------------------------------*/

#include "LCDConf.h"

#include "GUI_Private.h"

#include "ltdc.h"

#include "dma2d.h"

另外一下其他改动我就不详细说明了,我这里提供一个已经修改好的文件。

lcdconfig.zip

Demo.c总包含的main.h头文件去掉,改为#include "stm32f7xx_hal.h"
编译程序,看程序还有错误提示。
四、编辑应用程序
在main函数中添加应用程序,程序中先初始化SDRAM,GUI以及GT811触摸控制芯片。最后调用Demo main函数展示各种酷炫效果。

/* 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 */

STemWin的触屏移植只要是通过GUI_TOUCH_StoreStateEx函数不断将当前的触摸状态更新到GUI即可。可以定时器周期性的调用这个函数,本校准是通过触摸中断函数处理,当有触摸时触发外部中断,然后掉用次函数更新坐标到GUI。在main.c文件后面添加中断服务函数。

/* 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 */

另外GUI需要一个时基源,本教程用SysTick作为GUI的时基源。在stm32f7xx_it.c文件中添加GUIt头文件已经声明外部变量OS_TimeMS。

/* USER CODE BEGIN 0 */
#include "GUI.h"
extern volatile GUI_TIMER_TIME OS_TimeMS;
/* USER CODE END 0 */

在SysTick中断处理函数中添加语句,使OS_TimeMS加1计时。

/**
* @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 */
}

最后编译程序,并下载到开发板,如果没有错误则LCD上会显示各种酷炫吊炸天的界面。


分享给朋友:

相关文章

STM32CubeMX系列教程4:PWM

STM32CubeMX系列教程4:PWM

1.PWM简介       脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调试。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。例如上图中,图b)是微处理输出的数字信号,实际上他接到电机等功率设备上时,效果相当于图a)。这就是PWM调制。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相...

STM32CubeMX系列教程14:电源控制器(PWR)

STM32CubeMX系列教程14:电源控制器(PWR)

一.低功耗模式介绍        系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳平衡。        当系统断电时,仍然可以通过电池供电保留备份域的数据。备份域中包含RTC实时时钟,4KB备份SRAM以及调压器,调压器为备份域和待机电路以外...

STM32CubeMX系列教程21:SDRAM

STM32CubeMX系列教程21:SDRAM

在看下面教程之前,如果你之前没有使用过SDRAM,建议先看以下文档,以对SDRAM的原理和控制有一定的了解。高手进阶,终极内存技术指南——完整.doc一、SDRAM简介SDRAM(Synchronous Dynamic Random Access Memory)同步动态随机存取存储器·同步是指存储器工作需要同步时钟,内部命令的发送与数据传输都以它为基准·动态是指存储阵列需要不断的刷新来保证数据不丢失·随机存取是指存储器的内容可以以任意顺序访问,而不管前一次访问的是哪一个位置开发板使用的SDRAM...

STM32CubeMX系列教程22:LCD-TFT控制器(LDTC)

STM32CubeMX系列教程22:LCD-TFT控制器(LDTC)

一、LTDC简介        LCD-TFT(液晶显示器 —— 薄膜晶体管)显示器控制器提供并行数字 RGB(红色、绿色、蓝色)以及水平同步、垂直同步、像素时钟和数据使能信号,这些信号直接输出到不同 LCD和 TFT 面板的接口。本章通过Open746I-C开发板控制微雪7inch Capacitive Touch LCD (F)型LCD。其原理图如下:(注:本章介绍的是通过LDTC控制RGB接...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。