STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器

随言:

STemWin、emWin 与ucGUI其实都师出同门,都是是Segger 公司之手。

STemWin 是Segger 公司为ST公司定制的图形软件库;uC/GUI 是Segger 公司为Micrium 公司定制的图形软件库;

与其说是花钱定制的版本,其实都是正统emWin的别名版本,微改动。

但是在STM32芯片上面使用STemWin是免费的。当然ST公司也不会给其他芯片使用STemWin的机会,

故在库函数里使用了ST芯片内部CRC32寄存器进行校验是否为ST的芯片,若是则工作正常,否则反之。

像STemWin这个平台通用GUI库来说,就是按要求填充底层接口,然后程序调用库上层API接口。

初接触STemWin强力推荐官方手册《AN4323 应用笔记 STemWin 库入门指南》!!!

去官网搜索:AN4323 即可。

以前都是借的ST的板子,终于狠下心买一块STM32H743的板子了emmmmm....

1.STemWin:

先写好一份RGB LCD显示和支持触摸的代码(以前文章写过)。

然后打开Cube库文件安装路径,找到与硬件对应的库文件,比如我用的是STM32H743对应H7系列。

C:\Users\admin\STM32Cube\Repository\STM32Cube_FW_H7_V1.8.0\Middlewares\ST\STemWin

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第1张图片

其实各个文件夹下放的文件,只看文件夹名字大概都猜到了大概对应文件功能。


1.1Config:

包含库和LCD驱动程序的配置文件

首先显示驱动方式有两种,一种是画点,另一种是操作显存。画点是万能的,适用于所有屏幕。操作显存适用于RGB屏幕。

GUIConf.c:主要作用是分配STemWin内部缓存。

LCDConf_Lin_Template.c: 屏幕显示驱动底层填充接口,以显存方式。

LCDConf_FlexColor_Template.c:屏幕显示驱动底层填充接口,以画点方式

                                       画点有两种做法:使用自定义画点和STemWin自带画点函数(依据MCU屏幕IC)。

GUIDRV_Template.c: 里面是自定义画点填充底层函数,通过画点读点方式,适用于所有的屏幕。


1.2 Documentation:

包含emWin“用户和参考指南”英文版STemWin544.pdf用户手册,其实就是emWin544手册。

 但是网上有emWIN5.12中文手册,虽不是最新,但是够用,比看英文手册舒服。


1.3 inc:

存放STemWin库组件的头文件。

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第2张图片


1.4 Lib

存放在STemWin的静态库文件,不开源。

命名格式为STemWin_CM x _ YY_wc_ot_zzzz .a,其中

         x:CMx核心类别(CM0,CM3,CM4或CM7)
         YY:操作系统支持
         wc:  Wchar_t类型大小(wc16或wc32。根据编译器选择,先随便选一个报错再换)
         ot: 高速优化生成的二进制文件
         zzzz:支持ARGB

上面内容来源于文件夹中的Release_Notes.html。


1.5 OS

根据用户程序是否带RTOS选择哪个文件。带了RTOS就选名字带OS的。

其实带着RTOS选择使用GUI_X.c也没关系。

2.环境

我用的是STM32CubeIDE开发,硬件是STM32H743 + RGB LCD,分辨率480 x 272.

使能STM32H7的CRC寄存器。

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第3张图片

使能配置SDRAM

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第4张图片

在时钟树配置LTDC时钟。

LTDC:初始化屏幕时序,定义两个公共宏,初始化两层layer,打开中断。

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第5张图片

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第6张图片

使能DMA2D.

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第7张图片

把堆栈也改大一点。(下面是我随意改的)

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第8张图片

2.1 STemWin初始化流程图

3.LIN驱动


3.1 选择STemWin源文件

1、在生成的工程中把上面cube库中的STemWin的inc、Lib和OS复制到新建文件夹,并命名为STemWin。

2、由于我的芯片是STM32H743,故打开C:\Users\admin\STM32Cube\Repository\STM32Cube_FW_H7_V1.8.0\Projects\STM32H743I-EVAL\Applications\STemWin\STemWin_HelloWorld\STemWin

把targe和APP文件夹复制到工程的STemWin文件夹下。

3、打开工程中的STemWin文件夹中Lib,我选择使用STemWin_CM4_wc32.a,其他的文件删除。若出错就选STemWin_CM4_wc16.a,和编译器有关。

4、打开工程中的STemWin文件夹中OS,我没有带系统,删除GUI_X_OS.c。

最后的结果:

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第9张图片

3.2 设置STM32CubeIDE工程

1、右键工程属性,添加头文件。 

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第10张图片

2、添加源码文件夹

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第11张图片

3、添加静态库。需要注意的是添加静态库名字前面需要添加一个: 

STM32CubeIDE TFT-LCD移植STemWin,直接线性访问(LIN)驱动器_第12张图片

最后编译一下,就会通过。如果不通过检测一下步骤。

3.3 编程

1、修改分辨率和显示层数,外部链接hltdc和 hdma2d变量。

#define XSIZE_PHYS 480
#define YSIZE_PHYS 272

#define GUI_NUM_LAYERS 2

extern LTDC_HandleTypeDef            hltdc;
extern DMA2D_HandleTypeDef           hdma2d;

2、删除原有的LTDC和DAM2D初始化驱动,毕竟我们前面使用工具生成了初始化代码。

下面的函数都删除。

#define LCD_LAYER0_FRAME_BUFFER  ((int)0xD0000000)
#define LCD_LAYER1_FRAME_BUFFER  ((int)0xD0200000)

static void LCD_LL_Init(void);
void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);
void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);
void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);

3、main函数:

int main(void)
{
  SCB_EnableICache();
  SCB_EnableDCache();
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_LTDC_Init();
  MX_DMA2D_Init();
  MX_FMC_Init();
  MX_CRC_Init();

  SDRAM_Initialization_Sequence(&hsdram1);
  GUI_Init();
  MainTask();

  while (1)
  {

  }
}

我更换了一下字体,效果:

  全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 

你可能感兴趣的:(STM32,stm32,ide,单片机)