打印
[STM32L5]

【STM32L562E-DK试用】使用官方库驱动LCD屏幕

[复制链接]
52|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 傅沈骁 于 2025-3-1 12:21 编辑

感谢@yuyy1989 分享的文章 https://bbs.21ic.com/icview-3429636-1-1.html,向我们介绍了分别使用自定义驱动和使用官方库函数驱动STM32L562E-DK的屏幕。
这里介绍如何使用官方BSP库中的相关驱动和API完成屏幕显示。
在STM32CubeMX中以开发板新建工程,并默认初始化所有引脚。

板载LCD屏幕采用FMC接口,屏幕大小1.54英寸,240*240像素

对应原理图结构如下

ST7789H2时序逻辑如下

根据时序要求,在STM32CubeMX中设置FMC的NOR/PSRAM如下

设置完成后生成代码,根据官方库函数中的BSP文件夹导入下列相关文件
其中Inc文件夹中需要加入fonts.h,lcd.h,st7789h2_reg.h,st7789h2.h,stm32_lcd.h,stm32l562e_discovery_conf.h,stm32l562e_discovery_errno.h,stm32l562e_discovery_lcd.h

Src文件夹中需要加入font12.c,font16.c,font20.c,font24.c,font8.c,st7789h2_reg.c,st7789h2.c,stm32_lcd.c,stm32l562e_discovery_lcd.c

在stm32_lcd.c和stm32_lcd.h文件中,官方已经为我们封装好了多种用于屏幕显示的API。因此只需在主函数中调用相关API即可实现DIY屏幕显示。
在main.c中首先导入相关头文件
#include "stm32l562e_discovery_lcd.h"
#include "stm32_lcd.h"

在主函数中绘制相关画面
  LCD_UTILS_Drv_t lcdDrv;
  /* Initialize the LCD */
  BSP_LCD_Init(0, LCD_ORIENTATION_PORTRAIT);
  /* Set UTIL_LCD functions */
  lcdDrv.DrawBitmap  = BSP_LCD_DrawBitmap;
  lcdDrv.FillRGBRect = BSP_LCD_FillRGBRect;
  lcdDrv.DrawHLine   = BSP_LCD_DrawHLine;
  lcdDrv.DrawVLine   = BSP_LCD_DrawVLine;
  lcdDrv.FillRect    = BSP_LCD_FillRect;
  lcdDrv.GetPixel    = BSP_LCD_ReadPixel;
  lcdDrv.SetPixel    = BSP_LCD_WritePixel;
  lcdDrv.GetXSize    = BSP_LCD_GetXSize;
  lcdDrv.GetYSize    = BSP_LCD_GetYSize;
  lcdDrv.SetLayer    = BSP_LCD_SetActiveLayer;
  lcdDrv.GetFormat   = BSP_LCD_GetFormat;
  UTIL_LCD_SetFuncDriver(&lcdDrv);
  /* Clear the LCD */
  UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
  BSP_LCD_DisplayOn(0);
  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_BLUE);
  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);
  UTIL_LCD_SetFont(&Font24);
  UTIL_LCD_DisplayStringAt(0, 80, (uint8_t *)"STM32L562E-DK", CENTER_MODE);
  UTIL_LCD_DisplayStringAt(0, 120, (uint8_t *)"LCD Test", CENTER_MODE);
  UTIL_LCD_DisplayStringAt(0, 160, (uint8_t *)"FuShenxiao", CENTER_MODE);
  UTIL_LCD_DrawRect(5, 5, 230, 230, UTIL_LCD_COLOR_BLACK);
  UTIL_LCD_FillRect(30, 20, 40, 40, UTIL_LCD_COLOR_RED);
  UTIL_LCD_FillCircle(190, 40, 20, UTIL_LCD_COLOR_GREEN);
  UTIL_LCD_FillEllipse(120, 40, 40, 20, UTIL_LCD_COLOR_DARKMAGENTA);

得到最终显示结果如下图所示



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝