21、stm32使用LTDC驱动LCD

注:本文基于stm32使用FMC驱动SDRAM(IS42S32800G-6BLI)工程继续开发
本例使用安富莱的H743XIH板子驱动LTDC点亮7寸LCD
硬件接线:RGB888
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、cubemx配置

1、LTDC配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意此引脚应于上面的硬件接线图一致

2、配置DMA2D

在这里插入图片描述
在这里插入图片描述

3、背光引脚和触摸引脚

在这里插入图片描述

4、时钟配置

在这里插入图片描述
在这里插入图片描述

5、定时器配置

定时器6用来做精确延时
在这里插入图片描述
TIM7配置成1ms中断一次
在这里插入图片描述
在这里插入图片描述
触摸先不予弄
生成代码…

二、代码编写

1、移植文件至工程中,可以去下载完整工程中获取

字体文件
ascii_32.h|ascii_32.c
AsciiFonts.h
fonts_32.c|fonts_32.h
LCD文件
lcd_driver.c|lcd_driver.h
lcd_h7_driver.c|lcd_h7_driver.h
精确延时文件
delay_driver.c|delay_driver.h
触摸文件
bsp_i2c.c|bsp_i2c.h
GT911_driver.c|GT911_driver.h
touch_driver.c|touch_driver.h

2、更改精确延时文件delay_driver.c中得接口dDelayTIM和dDelayTIM_Handle为定时器6

在这里插入图片描述

3、bsp.c文件中初始化硬件,编写1m中断执行函数

/**********************************************************************
*file:板级支持包文件
*author:残梦
*versions:V1.0
*date:2023.08.10
*note:
**********************************************************************/
#include "bsp.h"
#include "common_driver.h"
#include "tim.h"
#include "lcd_driver.h"
#include "bsp_i2c.h"
#include "touch_driver.h"

/****************************************
@function:板硬件初始化
@param:void
@return:小于0--失败,0--成功
@note:
****************************************/
int32_t bsp_init(void)
{
    bsp_i2c_Init();
    touch_init();
    LCD_InitHard();
    HAL_TIM_Base_Start_IT(&htim7);
    return 0;
}

void bsp_Task_1ms(void)
{
    static uint16_t ms = 0;

    ms++;
    if(ms >= 1000)
    {
        ms = 0;
        //printf("1s到了\n");
    }
    touch_1ms();
}

bsp.h

#ifndef _bsp_H_
#define _bsp_H_
#ifdef __Cplusplus
#extern "C" {
#endif
#include "stdint.h"

int32_t bsp_init(void);
void bsp_Task_1ms(void);

#ifdef __Cplusplus
}
#endif
#endif

4、tim.c文件中添加定时器回调

/* USER CODE BEGIN 0 */
#include "bsp.h"
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM7)
  {
    bsp_Task_1ms();
  }
}
/* USER CODE END 1 */

5、main.c中主函数添加触摸测试函数

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma2d.h"
#include "ltdc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "fmc.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "bsp.h"
#include "common_driver.h"
#include "sdram_driver.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#include "touch_driver.h"
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MPU_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
  SCB_EnableDCache();

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_FMC_Init();
  MX_USART1_UART_Init();
  MX_DMA2D_Init();
  MX_LTDC_Init();
  MX_TIM6_Init();
  MX_TIM7_Init();
  /* USER CODE BEGIN 2 */
  if(bsp_init() < 0){printf("error:bsp_init()\r\n");Error_Handler();}

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    touch_Test();
    HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

编译下载即可…
触摸屏幕随手指触摸轨迹画圆圈
屏幕800*480
在这里插入图片描述

三、完整工程下载

链接:https://pan.baidu.com/s/1PQfEsbaoNqUvyevT0YbDgA
提取码:p7j6

四、笔记

1、如何验证 LTDC 的时序配置是否正确

ltdc.c文件中void MX_LTDC_Init(void)内
在这里插入图片描述
下载程序,此处开启背光,测试背景色是否正常,如果背景层可以正常显示绿色,说明引脚和时序配置都是没有问题的
◆首先要清楚一点,当前的配置是否成功与 SDRAM 没有任何关系,因为背景层还用不到 SDRAM,图层 1 和图层 2 才需要 SDRAM 做显存使用。
◆ 从硬件着手检查,保证 STM32H7 芯片焊接没问题,TFT 接口一定要牢固,防止接触不良,特别是使用 FPC 软排线的时候,测试阶段,软排线越短越好。有时候也可能是显示屏有问题,最好可以备两个显示屏测试。
◆ 从软件配置着手检查,查看 LTDC 涉及到的所有引脚是否配置,引脚时钟是否使能。有时候无法显示也有可能是板子硬件设计不规范导致干扰较大造成的,此时,可以降低 LTDC 所涉及到 GPIO 的速度等级。
◆ 如果显示了,但是显示的位置不正确,可以重新调整时序参数即可。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 介绍和使用方法 STM32 HAL 库提供了一组 API 函数,可用于访问 LCD/TFT 控制器(LTDC)的控制器和显示器的功能。LTDC API 提供了一组函数,可用于配置和控制 LTDC 的功能,并可访问 LTDC 的控制器和显示器的配置和状态。使用 LTDC API,可以轻松地实现屏幕分辨率,颜色深度,显示模式,定时器,更新窗口等功能。 ### 回答2: STM32 HAL库中的LTDCLCD TFT Display Controller)相关函数用于驱动和控制液晶显示屏。 首先,在使用LTDC之前,需要初始化LTDC控制器。可以使用函数`HAL_LTDC_Init()`对LTDC进行初始化配置,包括像素时钟分频、同步信号、垂直和水平同步信号脉冲宽度等。在初始化后,可以使用其他LTDC函数来设置像素格式、颜色映射和背光等。 然后,可以使用`HAL_LTDC_SetPitch()`函数设置像素行的步进值,以便根据需要调整图像显示的宽度和高度。使用`HAL_LTDC_SetAddress()`函数设置LTDC图层的显存地址。 另外,通过使用`HAL_LTDC_ConfigLayer()`函数配置LTDC图层,可以设置图层大小、像素格式和透明度等。可以使用`HAL_LTDC_SetWindowPosition()`和`HAL_LTDC_SetWindowAlpha()`函数设置图层窗口位置和透明度。 在所有设置完成后,可以使用`HAL_LTDC_Start()`函数启动LTDC显示过程,并通过调用`HAL_LTDC_Reload()`函数来重新加载数据以更新显示内容。 如果需要采取某种操作更改LTDC显示,可以使用相关的`HAL_LTDC`函数来控制图层的启用/禁用、透明度、混合模式等。 总的来说,STM32 HAL库中的LTDC相关函数提供了一套方便易用的界面,用于配置和控制LTDC控制器,实现液晶屏的高效显示和更新操作。无论是在嵌入式系统还是工业控制领域,这些函数都为开发人员提供了良好的支持,以实现图形界面的设计和交互。 ### 回答3: STM32 HAL库中的LTDC(Layered Transmission Display Controller)是用于控制液晶显示屏的功能模块。LTDC库函数提供了一系列API函数,用于配置和控制LCD屏幕的参数、图层和显示内容。 首先,我们需要通过使用函数`HAL_LTDC_Init()`来初始化LTDC控制器。该函数将会对LTDC控制器进行配置,设置相关的时钟和GPIO引脚,并启用LTDC控制器。 然后,我们可以使用`HAL_LTDC_SetPitch()`函数来设置屏幕像素在内存中的布局方式。通过调用`HAL_LTDC_LayerCfgStruct()`函数,我们可以配置和初始化图层的参数,如图层尺寸、像素格式、颜色模式和透明度等。可以通过调用`HAL_LTDC_ConfigLayer()`来启用或禁用每个图层。 接下来,我们可以通过`HAL_LTDC_SetWindowPosition()`函数来设置图层在屏幕上的位置,以及`HAL_LTDC_SetWindowAlpha()`函数来设置图层的不透明度。此外,我们还可以使用`HAL_LTDC_SetWindowColorKeying()`函数来设置颜色键功能,以选择无需绘制的颜色。 在配置完图层参数之后,我们可以使用`HAL_LTDC_SetPixelFormat()`函数来设置像素格式,如RGB565、RGB888等。通过调用`HAL_LTDC_SetAddress()`函数,我们可以设置用于显示的帧缓冲区的地址。可以使用`HAL_LTDC_SetLength()`和`HAL_LTDC_SetLineOffset()`函数来设置帧缓冲区的行长度和偏移量。 最后,在完成所有配置和参数设置之后,我们可以通过调用`HAL_LTDC_EnableCLUT()`函数来启用颜色查询表,以映射多个颜色到屏幕上。最终,可以通过`HAL_LTDC_Reload()`函数重新加载LTDC控制器来应用所有配置的更改。 综上所述,STM32 HAL库中的LTDC相关函数提供了一套完整的接口,用于配置和控制LCD屏幕的参数、图层和显示内容。通过使用这些函数,我们可以方便地操作LTDC控制器,实现液晶显示屏的相关功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值