历史上的今天
返回首页

历史上的今天

今天是:2025年06月03日(星期二)

正在发生

2018年06月03日 | 使用STM32CubeMX进行STM32F429 LCD编程<一> 全局配置

2018-06-03 来源:eefocus

说明:

下面的程序均以STM32Cube_FW_F4_V1.16.0中的库为例。

STM32CubeMX版本号为STM32CubeMX 4.22.0。

LCD为1024 x 768 15寸液晶。

使用SDRAM作为LCD帧缓冲。

STM32CubeMX芯片引脚总配置图如下:


一.STM32F429 LTDC内部结构图:


层 FIFO

每层一个 64x32 位 FIFO。

PFC

Pixel Format Convertor performing the pixel format conversion from the selected input

pixel format of a layer to words.

执行像素格式转换的像素格式转换器,从层的所选输入像素格式转换为字。

像素数据从帧缓冲区中读取,随后按照以下方式转换为内部 8888 (ARGB) 格式:

宽度低于 8 位的分量通过位重复扩展到 8 位。所选位范围多次拼接,直至其超过 8 位。

在得到的向量中,选择高 8 位。例如:5 位 RGB565 红色通道将变为(位位置):

43210432(低 3 位由 5 位中的高 3 位填充,4321即第4、3、2、1位)

即RGB565中的R通道,R5--R[4:0]扩展为R[4:0]R[4:2],组成8位数据R8。

RGB565内存格式

下图说明了像素数据映射与所选格式的关系:


上面两格为一个16bits数据,即一个完整的RGB565数据,即包含5位RED,6位Green,5位Blue。

下面的宏可以很好说明它们的关系和组成顺序:

#define   MAKE_RGB565(R, G, B)      ((R & 0x1F) << 11)  |   ((G & 0x3F) << 5)  |   (B & 0x1F)

二. LTDC 复位和时钟

LCD-TFT 控制器外设使用 3 个时钟域:

  • AHB 时钟域 (HCLK):用于将数据从存储器传输到 FIFO 层

  •  APB2 时钟域 (PCLK2):用于配置寄存器

  • 像素时钟域 (LCD_CLK):用于生成 LCD-TFT 接口信号。LCD_CLK 输出应按照面板要求配置。LCD_CLK 通过 PLLSAI 进行配置(见 RCC 部分)

通过将 RCC_APB2RSTR 寄存器中的相应位置 1 可将 LCD 控制器复位。这将复位三个时钟域。

注意,LTDC使用了3个时钟,总线访问时钟,一个外围总线时钟,一个像素时钟。外围总线时钟用于配置寄存器。


LCD CLK 时钟

不能过高,否则过高的时钟无法读取有效的SDRAM缓冲区内容,两者无法同步。

经测试当时钟高于40Mhz时,就无法正常显示。




三. 同步时序:



VBP--vertical back porch

VFP--vertical front porch

HBF--Horizontal back porch

HFP--Horizontal front porch

HBP 和 HFP 分别为水平后沿周期和水平前沿周期。

VBP 和 VFP 分别为垂直后沿周期和垂直前沿周期。

LCD-TFT 可编程同步时序包括:

–– HSYNC 和 VSYNC 宽度:水平和垂直同步宽度,通过编程 LTDC_SSCR 寄存器中

的 HSYNC Width - 1 和 VSYNC Width - 1 的值进行配置。

如LCD面板手册中HSYNC Width的值为1,那么就将1-1 = 0写入该寄存器。

–– HBP 和 VBP:水平和垂直同步后沿宽度,通过编程 LTDC_BPCR 寄存器中的累加

值 HSYNC Width + HBP - 1 和累加值 VSYNC Width + VBP - 1 进行配置。

–– 有效宽度和有效高度:有效宽度和有效高度通过编程 LTDC_AWCR 寄存器中的累加

值 HSYNC Width + HBP + Active Width - 1 和累加值 VSYNC Width + VBP + Active Height - 1

进行配置(仅支持最高 1024x768)。

–– 总宽度:总宽度通过编程 LTDC_TWCR 寄存器中的累加值 HSYNC Width + HBP + Active Width + HFP - 1

进行配置。HFP 为水平前沿周期。

–– 总高度:总高度通过编程 LTDC_TWCR 寄存器中的累加值 VSYNC Height + VBP +Active Height + VFP - 1 

进行配置。VFP 为垂直前沿周期。

注意: 使能 LTDC 时,产生的时序以 X/Y=0/0 位置作为垂直同步区域中的第一个水平同步像素,随

后是后沿、有效数据显示区域和前沿。

禁止 LTDC 时,时序发生器模块复位为 X = 总宽度 - 1、Y = 总高度 - 1,并在垂直同步阶段

和 FIFO 刷新前保持上一个像素。因此,仅连续输出消隐数据。

STM32F429 LTDC并没有给出寄存器来直接配置VBP、VFP、HBF、HFP。而是可通过配置后的寄存器

之间的差值关系来描述这些值。

下面的代码很好的描述了LCD同步参数和STM32F429 LTDC同步配置寄存器之间的关系:

//LTDC_SSCR--LTDC Synchronization Size Configuration Register

//LTDC_BPCR--LTDC Back Porch Configuration Register

//LTDC_AWCR --LTDC Active Width Configuration Register

//LTDC_TWCR--LTDC Total Width Configuration Register

/* 时间参数配置 */

/* 配置行同步信号宽度(HSW-1) */

LTDC_InitStruct.LTDC_HorizontalSync=HSW-1;  //LTDC_SSCR

/* 配置垂直同步信号宽度(VSW-1) */

LTDC_InitStruct.LTDC_VerticalSync  =VSW-1;  //LTDC_SSCR

/* 配置(HSW+HBP-1) */

LTDC_InitStruct.LTDC_AccumulatedHBP=HSW+HBP-1;//LTDC_BPCR

/* 配置(VSW+VBP-1) */

LTDC_InitStruct.LTDC_AccumulatedVBP=VSW+VBP-1;//LTDC_BPCR

/* 配置(HSW+HBP+有效像素宽度-1) */

LTDC_InitStruct.LTDC_AccumulatedActiveW=HSW+HBP+LCD_PIXEL_WIDTH-1; //LTDC_AWCR

/* 配置(VSW+VBP+有效像素高度-1) */

LTDC_InitStruct.LTDC_AccumulatedActiveH=VSW+VBP+LCD_PIXEL_HEIGHT-1;//LTDC_AWCR

/* 配置总宽度(HSW+HBP+有效像素宽度+HFP-1) */

LTDC_InitStruct.LTDC_TotalWidth        =HSW+HBP+LCD_PIXEL_WIDTH+HFP-1; //LTDC_TWCR

/* 配置总高度(VSW+VBP+有效像素高度+VFP-1) */

LTDC_InitStruct.LTDC_TotalHeigh        =VSW+VBP+LCD_PIXEL_HEIGHT+VFP-1; //LTDC_TWCR


STM32CubeMX中相关的配置:



STM32CubeMX图形配置中的设定值均是LCD面板中的相关值,STM32CubeMX会重新计算,然后生成如下的代码:

hltdc.Instance=LTDC;

hltdc.Init.HSPolarity=LTDC_HSPOLARITY_AL;

hltdc.Init.VSPolarity=LTDC_VSPOLARITY_AL;

hltdc.Init.DEPolarity=LTDC_DEPOLARITY_AL;

hltdc.Init.PCPolarity=LTDC_PCPOLARITY_IPC;

hltdc.Init.HorizontalSync    =0;    //HSW:Horizontal Synchronization Height

hltdc.Init.VerticalSync      =0;    //VSW:Vertical Synchronization Height

hltdc.Init.AccumulatedHBP    =6;    //HBP

hltdc.Init.AccumulatedVBP    =6;    //VBP

hltdc.Init.AccumulatedActiveW=1030; //自动计算 HBP + Active Width - 1;

hltdc.Init.AccumulatedActiveH=774;  //自动计算 VBP + Active Heigh - 1;

hltdc.Init.TotalWidth        =1036; //自动计算 HSW + HBP + Active Width - 1;

hltdc.Init.TotalHeigh        =782;  //自动计算 VSW + VBP + Active Heigh - 1;  

...

if(HAL_LTDC_Init(&hltdc)!=HAL_OK)

{

    _Error_Handler(__FILE__,__LINE__);

}


四. 背景色

恒定的背景色 (RGB888) 可通过 LTDC_BCCR 寄存器编程。它用于与底层混合。

STM32CubeMX中相关的配置:


STM32CubeMX生成的相应代码如下:

//LCD配置

hltdc.Init.Backcolor.Blue=0;

hltdc.Init.Backcolor.Green=0;

hltdc.Init.Backcolor.Red=0;


默认为黑色RGB = 0。


五. IO口在STM32CubeMX的配置


注意默认是Low速。


推荐阅读

史海拾趣

GSME Electronics公司的发展小趣事

GSME Electronics深知品质是企业发展的生命线。因此,公司积极寻求并通过了ISO9001:2000质量管理体系、ISO14001环境管理体系以及IECQ QC080000危害物质流程管理体系等三项认证。同时,公司还遵循欧盟ROHS指令,通过了无铅、汞、无公害认证,确保产品符合国际环保标准。这些举措不仅提升了公司的市场竞争力,也赢得了国内外客户的广泛认可。

Fabrimex AG公司的发展小趣事

1979年,Fabrimex AG接管了ARCO-Solar(美国)的代表处,标志着公司正式进入光伏领域。这一举措为公司带来了新的增长点,并推动了相关产品的研发和生产。随着光伏技术的不断发展,Fabrimex AG在光伏领域逐渐取得了显著的成绩,为公司带来了可观的收益。

Automatic Connector公司的发展小趣事

Automatic Connector公司自创立之初,就专注于电子连接器技术的研发与创新。公司团队不断突破传统设计,推出了多款具有高性能、高可靠性的连接器产品。随着智能手机和可穿戴设备的普及,Automatic Connector的微型连接器在市场上大受欢迎,公司因此迅速崛起。通过与知名电子设备制造商的合作,Automatic Connector逐渐在行业中树立了技术领先的形象,实现了稳健的发展。

GSG公司的发展小趣事
检查通信接口是否连接正确,通信协议是否匹配,以及通信线路是否受到干扰或损坏。
Aten International公司的发展小趣事

在全球能源危机和环保意识日益增强的背景下,绿色能源成为了电子行业的一大发展趋势。Aten International积极响应环保号召,研发出了一系列绿色能源解决方案,包括智能型电源分配器和节能感测软件等。这些产品不仅能够有效降低能源消耗,还能提供实时的能源管理与效能指标,为企业实现绿色生产提供了有力支持。

aconno公司的发展小趣事

aconno公司在电子行业的崛起,始于其坚持创新驱动的发展策略。早年公司便投入大量资源进行技术研发,尤其是在物联网和嵌入式系统领域。通过不断推出具有创新性和实用性的产品,aconno逐渐在市场中建立了良好的口碑。例如,其自主研发的一款智能传感器,因其高灵敏度和稳定性受到了市场的广泛认可。随着技术的不断积累和创新,aconno逐渐在行业中崭露头角。

问答坊 | AI 解惑

功率单元板上电压快速、精准测量!!!!!

我现在正在做一个专题研究,实现变频器单元板上电压的快速、精准测量,现在电压测量一般采用采样电阻进行分压测量,但准确性和快速型都不好,请大家讨论一下,给些新的实现方法。谢谢高手指点…

查看全部问答>

matlab第三课--矩阵与矩阵的运算~

分为加减乘除,点运算! 哈哈 慢慢体会吧!…

查看全部问答>

有关基准源的问题

有关基准源的问题 我在电路中要用到1.25V和2.5V这两个基准电压                                       &nbs ...…

查看全部问答>

模电、数电教程,有需要的进来

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑  …

查看全部问答>

基于LPC2478的嵌入式智能胰岛素泵的设计

 概述   当前全球范围内,每10秒钟就有一个糖尿病患者因并发症死亡,在同一个10秒钟内,又会新增两例糖尿病患者;受糖尿病影响的人口总数约为2.46亿,预计在未来20年内糖尿病患者的数量会上升至3.8亿。糖尿病是一种终身代谢性疾病,若能得到有效 ...…

查看全部问答>

DM9000读写问题

在对DM9000芯片读ID时,ID读不对,读出的数据是相同的,都是第一个读到的内容,VIDL  0x46,整个就成了0x46464646。不知道是什么原因,请大家指点下,排除硬件问题…

查看全部问答>

Tree View Control 在 WinCE6.0 上 无法用鼠标选择

问题是这样的:我在ce6上使用树控件,可以用上下键选择某个节点,但是不能用鼠标来选择,用鼠标时候点击某个节点没反应,选不上。我添加了NM_CLICK消息响应,但是用鼠标点击时候也不能进到这个消息的响应函数中,所以我觉得该控件根本没有收到系统 ...…

查看全部问答>

vxworks里的powerpc-wrs-vxworks-ar等指什么?

一个软件为在vxworks_powerpc下安装写的makefile中有如下几句: “CCROOT=/net/compiler/gcc_mpt_1.02/bin RANLIB = $(CCROOT)/powerpc-wrs-vxworks-ranlib AR = $(CCROOT)/powerpc-wrs-vxworks-ar cq NM = $(CCROOT)/powerpc-wrs-vxworks-nm” ...…

查看全部问答>

工作三年,换工作,何去何从。。。

说一下背景:          本人09年小二本毕业,毕业后在上海工作一年,后来深圳,算起来总共工作时间为三年,三年说长不长,说短也不短,由于这两三年一直工作在小公司,主要工作就是单片机的底层开发,还有就是arm7, ...…

查看全部问答>

求助各位关于直流无刷电机测速

我刚刚接触dsp,现在想用dsp2808的ecap口对直流无刷电机的霍尔信号进行测速。我设置CEVT4时间后触发cap1中断(其中CAP1POL1与CAP1POL3为上升沿触发,CAP1POL2与CAP1POL4为下降沿触发)。问题是现在我给cap口一个pwm信号(2.5kHz)进行频率测试的时 ...…

查看全部问答>