STM32F429之LTDC驱动图解

本文基于ST官方demo板STM32F429 Discovery硬件平台,以看图说话的形式给大家讲解LTDC的主要参数配置。关于本文提到的代码部分均摘自本人另一片文章《STM32F429之LTDC代码模板》,LCD硬件为240x320,驱动IC为ili9341。本文目的意在让大家通过几张图就能掌握STM32F429
LTDC控制器的配置要领,而从干涩的文字中解脱出来,方便记忆。当然本文只是讲解了LTDC一些常用的设置,关于更多细节的操作还是得参照ST的官方datasheet。

一、关于LTDC外设的时钟配置,只需要记住下面这张图就可以了(图片来源于STM32CubeMX RCC时钟树):

该图所对应的代码如下:

  /* Configure PLLSAI prescalers for LCD */
  /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
  /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */
  /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAI_R = 192/3 = 64 Mhz */
  /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 64/8 = 8 Mhz */
  RCC_PLLSAIConfig(192, 7, 3);
  RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);

  /* Enable PLLSAI Clock */
  RCC_PLLSAICmd(ENABLE);
  /* Wait for PLLSAI activation */
  while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET)
  {
  }

二、关于LCD的信号时序配置参数,只需要记住下面这张图就可以了:

注意:这部分需要根据LCD Datasheet要求严格配置。

改图所对应的代码如下:

  /* Initialize the horizontal synchronization polarity as active low*/
  LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;
  /* Initialize the vertical synchronization polarity as active low */
  LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;
  /* Initialize the data enable polarity as active low */
  LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;
  /* Initialize the pixel clock polarity as input pixel clock */
  LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;

  /* Timing configuration */
  /* Configure horizontal synchronization width */
  LTDC_InitStruct.LTDC_HorizontalSync = 9;
  /* Configure vertical synchronization height */
  LTDC_InitStruct.LTDC_VerticalSync = 1;
  /* Configure accumulated horizontal back porch */
  LTDC_InitStruct.LTDC_AccumulatedHBP = 29;
  /* Configure accumulated vertical back porch */
  LTDC_InitStruct.LTDC_AccumulatedVBP = 3;
  /* Configure accumulated active width */
  LTDC_InitStruct.LTDC_AccumulatedActiveW = 269;
  /* Configure accumulated active height */
  LTDC_InitStruct.LTDC_AccumulatedActiveH = 323;
  /* Configure total width */
  LTDC_InitStruct.LTDC_TotalWidth = 279;
  /* Configure total height */
  LTDC_InitStruct.LTDC_TotalHeigh = 327;

三、LTDC的层——Layer

关于层的概念有以下几点:

1. STM32F429共有3个层,分别为Background、Layer1、Layer2,任何时候LCD显示的图像都是由层叠加后的最终结果;

2. Background层任何时候都有效,而Layer1、Layer2可以通过软件配置使能或禁止;

3. 这3个层的空间顺序,从下往上依次为Background、Layer1、Layer2,所以叠加的顺序如下图:

每个Layer支持窗口(Window)操作,所谓Window,就是指该层的图像只有在Window区域内有效,而Window区域外则用该层的DefaultColor填充。如下图:

关于Layer Window显示位置及大小的配置,记住下面这张图就可以了:

该图所对应的代码如下:

  /* Windowing configuration */
  /* In this case all the active display area is used to display a picture then:
  Horizontal start = horizontal synchronization + Horizontal back porch = 30
  Horizontal stop = Horizontal start + window width -1 = 30 + 240 -1
  Vertical start   = vertical synchronization + vertical back porch     = 4
  Vertical stop   = Vertical start + window height -1  = 4 + 320 -1      */
  LTDC_Layer_InitStruct.LTDC_HorizontalStart = 30;
  LTDC_Layer_InitStruct.LTDC_HorizontalStop = (240 + 30 - 1);
  LTDC_Layer_InitStruct.LTDC_VerticalStart = 4;
  LTDC_Layer_InitStruct.LTDC_VerticalStop = 320 + 4 -1;

每个Layer关联了一个显示缓冲区FrameBuffer,由于Background只能使用单色填充,所以它没有FrameBuffer。关于FrameBuffer有几个参数:Pixel Format、Buffer Address、Line Length、Number of lines、Buffer Pitch,这几个参数都是针对于Layer的Window而言的,它们的含义如下:

Pixel Format:不多说,RGB565、ARGB8888、ARGB1555等等;

Buffer Address:显示缓冲区的起始地址;

Line Length:window所对应的缓冲区宽度+3,以字节为单位;

Number of Lines:window所对应的缓冲区高度,以字节为单位;

Buffer Pitch:从这一行起始到下一行起始所经过的字节数,说白了就是换行时的一个行指针增量(也可以理解为整幅图像的宽度,以字节为单位);

假设Layer1的FrameBuffer如下图(RGB565):

设置window要显示的图像为下图粉色部分:

结合之前设置的Window的位置,最终显示的图像如下图(不考虑Layer2及透明色):

由此可以看到:

Start Address、Buffer Pitch决定了window在显存中每行的起始位置;

Line Length、Line Number决定了window在显存中的大小。

该部分所对应的代码如下:

  /* Input Address configuration */
  LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (u32)FrameBuffer;

  /* the length of one line of pixels in bytes + 3 then :
  Line Lenth = Active high width x number of bytes per pixel + 3
  Active high width         = 240
  number of bytes per pixel = 2    (pixel_format : RGB565)
  */
  LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((240 * 2) + 3);

  /*  the pitch is the increment from the start of one line of pixels to the
  start of the next line in bytes, then :
  Pitch = Active high width x number of bytes per pixel
  */
  LTDC_Layer_InitStruct.LTDC_CFBPitch = (240 * 2);  

  /* configure the number of lines */
  LTDC_Layer_InitStruct.LTDC_CFBLineNumber = 320;

需要注意的是,为了保证图像能正确显示,请务必确认显存中图像的大小与window显示的大小一致,即Line Length、Line Number要与(HStop-HStart)、(VStop-VStart)相一致,否则显示将不正确。

最后不要忘了设置完所有Layer的寄存器后,光调用LTDC_LayerCmd()还不够,还需要调用LTDC_ReloadConfig(ENABLE)函数才能使所有层的设置生效。

时间: 2024-10-25 10:44:16

STM32F429之LTDC驱动图解的相关文章

STM32F429 Discovery FMC驱动原子4.3寸LCD

本人手里有块STM32F429 Discovery板子,因为某种原因需要使用8080接口的LCD,而该块开发板自带的LCD接口采用LTDC驱动,所以就在正点原子这里买了一块4.3寸电容触摸屏,驱动IC为NT35510. 为了快速搭建软件工程,本人使用STM32CubeMX工具生成代码模板,并编写了lcd.c和nt35510.c两个文件,代码如下: lcd.c typedef struct _LCD_DRV{ uint32_t (*checkid)(void); void (*init)(void

STM32F429中LTDC的DMA2D加速

液晶屏的时序问题?每个液晶屏的时序都不一样,但总体上是类似的.如下图: VDEN:    数据使能信号.HSYNC:     每一行扫描的起始点, 在扫描过程中, 不会管上一行扫描有没有结束, 当出现这一个信号,即开始新一行的扫描.VSYNC:      每一场扫描的起始点, 这与HSYNC相似的.BACK PROCH:     因为有不同tft屏和不同扫描硬件, 并且HSYNC和VSYNC对于时序的约束力有限, 所以会加入一些容错的时间, 因此行扫描和场扫描都会有BACK PROCH: 和FR

【STM32H7教程】第51章 STM32H7的LTDC应用之LCD汉字显示和2D图形显示

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第51章       STM32H7的LTDC应用之LCD汉字显示和2D图形显示 本章教程为大家讲解LTDC应用中最基本的汉字显示和2D图形显示功能实现. 51.1 初学者重要提示 51.2 LCD相关的基础支持 51.3 LCD硬件设计 51.4 LCD驱动设计 51.5 LCD板级支持包(bsp_ltdc_h7.c和bsp_tft_lcd.c) 51.6 LCD的

【STM32H7教程】第53章 STM32H7的LTDC应用之汉字小字库和全字库制作

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第53章       STM32H7的LTDC应用之汉字小字库和全字库制作 本章教程为大家讲解汉字小字库和全字库的制作方式,实际项目中用到的地方比较多. 53.1 初学者重要提示 53.2 使用MakeDot小软件生成C文件格式小字库方法 53.3 使用MakeDot小软件生成C文件格式全字库方法 53.4 C文件格式汉字使用方法 53.5 汉字显示方法解析 53.6

第4章 初识STM32

第4章     初识STM32 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:1.<STM8和STM32产品选型手册>2.SetupSTM32CubeMX-4.11.0.exe 4.1 什么是STM32 STM32,从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指ST公司开发的32位微控

图解WildFly8.x模块化加载数据库驱动

在上一篇中<图解WildFly8.x配置JNDI数据源>没有说明数据库的驱动是如何设置的,本文以Mysql的驱动设置为例进行详细的补充,主要是利用JBoss的模块化设计思想,让系统启动更快,更充分地利用内存.首先到modules目录增加驱动的包. module.xml文件的配置如下: 接下来要手动修改standalone.xml配置文件,增加添加的驱动: 配置好后,在后台的图形界面下就可以看到添加的驱动了: 接下来就是使用这个驱动,手动使用的方式如下: 其中需要注意几个名称必须保证一致: 设置

HTTP图解

本节内容 俗话说好的开发,底层知识必须过硬,不然再创新的技术,你也理解不深入,比如python web开发工程师,想要学习任何一个框架,底层都是http和socket,底层抓牢了,学起来会很轻松,所以楼主今天特意写了一篇底层的博客,来源于<HTTP图解>这本书.下载内容在本节末尾,可以自行前去下载观看,比我个人了解得多要全面很多,不过不要忘记点赞哈!! 本文只要内容: 了解web及网络基础 简单的http协议 了解web及网络基础 1.使用http协议访问web 当我们用网页浏览器(web b

图解 &amp; 深入浅出JavaWeb:事务必会必知

图解 & 深入浅出JavaWeb:事务必会必知 转载自http://www.bysocket.com/ 事务,大家所熟悉的事务(Transaction),基本上会就往Spring事务靠.其实Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring事务管理的基础.这篇总结下数据库事务. 一.数据库事务 它的思想:we are 伐木累.就是多个SQL语句(一个团队),要么所有执行success,不然就fail. 它最终的目标:数据不会被破坏.即事务操作成功,数据的结

读《图解HTTP》总结--第一章

一.第一章:了解Web及网络基础 1.基础知识     HTTP:(HyperText Transfer Protocol ,超文本传输协议)          客户端:发送请求获取服务器资源的web浏览器等都可以称为客户端          www : World Wide Web  万维网          URL :Uniform  Resource Locator ,统一资源定位符          URI  :Uniform Resource Identifier  统一资源标识符