打印
[STM32F4]

使用STM32CubeMX进行STM32F429 LCD编程<一> 全局配置

[复制链接]
817|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
说明:
下面的程序均以STM32Cube_FW_F4_V1.16.0中的库为例。
STM32CubeMX版本号为STM32CubeMX 4.22.0。
LCD为1024 x 768 15寸液晶。
使用SDRAM作为LCD帧缓冲。

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





使用特权

评论回复
沙发
狗啃模拟|  楼主 | 2021-12-30 23:33 | 只看该作者
一.STM32F429 LTDC内部结构图:

使用特权

评论回复
板凳
狗啃模拟|  楼主 | 2021-12-30 23:36 | 只看该作者
层 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。

使用特权

评论回复
地板
狗啃模拟|  楼主 | 2021-12-30 23:38 | 只看该作者
RGB565内存格式
下图说明了像素数据映射与所选格式的关系:

使用特权

评论回复
5
狗啃模拟|  楼主 | 2021-12-30 23:40 | 只看该作者
上面两格为一个16bits数据,即一个完整的RGB565数据,即包含5位RED,6位Green,5位Blue。
下面的宏可以很好说明它们的关系和组成顺序:
#define   MAKE_RGB565(R, G, B)      (( R & 0x1F) << 11)  |   (( G & 0x3F) << 5)  |   ( B & 0x1F)

使用特权

评论回复
6
狗啃模拟|  楼主 | 2021-12-30 23:41 | 只看该作者
二. 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个时钟,总线访问时钟,一个外围总线时钟,一个像素时钟。外围总线时钟用于配置寄存器。

使用特权

评论回复
7
狗啃模拟|  楼主 | 2021-12-30 23:41 | 只看该作者
LCD CLK 时钟
不能过高,否则过高的时钟无法读取有效的SDRAM缓冲区内容,两者无法同步。
经测试当时钟高于40Mhz时,就无法正常显示。

使用特权

评论回复
8
狗啃模拟|  楼主 | 2021-12-30 23:45 | 只看该作者

使用特权

评论回复
9
狗啃模拟|  楼主 | 2021-12-30 23:45 | 只看该作者
三. 同步时序:

使用特权

评论回复
10
狗啃模拟|  楼主 | 2021-12-30 23:47 | 只看该作者
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写入该寄存器。

使用特权

评论回复
11
狗啃模拟|  楼主 | 2021-12-30 23:49 | 只看该作者
–– 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)。

使用特权

评论回复
12
狗啃模拟|  楼主 | 2021-12-30 23:51 | 只看该作者
–– 总宽度:总宽度通过编程 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 位置作为垂直同步区域中的第一个水平同步像素,随
后是后沿、有效数据显示区域和前沿。

使用特权

评论回复
13
狗啃模拟|  楼主 | 2021-12-30 23:55 | 只看该作者
禁止 LTDC 时,时序发生器模块复位为 X = 总宽度 - 1、Y = 总高度 - 1,并在垂直同步阶段
和 FIFO 刷新前保持上一个像素。因此,仅连续输出消隐数据。

STM32F429 LTDC并没有给出寄存器来直接配置VBP、VFP、HBF、HFP。而是可通过配置后的寄存器
之间的差值关系来描述这些值。

使用特权

评论回复
14
狗啃模拟|  楼主 | 2021-12-30 23:56 | 只看该作者
下面的代码很好的描述了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

使用特权

评论回复
15
狗啃模拟|  楼主 | 2021-12-30 23:56 | 只看该作者
STM32CubeMX中相关的配置:

使用特权

评论回复
16
狗啃模拟|  楼主 | 2021-12-30 23:57 | 只看该作者
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__ );
}

使用特权

评论回复
17
狗啃模拟|  楼主 | 2021-12-30 23:58 | 只看该作者
四. 背景色
恒定的背景色 (RGB888) 可通过 LTDC_BCCR 寄存器编程。它用于与底层混合。
STM32CubeMX中相关的配置:



STM32CubeMX生成的相应代码如下:
//LCD配置
hltdc . Init . Backcolor . Blue = 0 ;
hltdc . Init . Backcolor . Green = 0 ;
hltdc . Init . Backcolor . Red = 0 ;

默认为黑色RGB = 0。

使用特权

评论回复
18
狗啃模拟|  楼主 | 2021-12-30 23:58 | 只看该作者
五. IO口在STM32CubeMX的配置

使用特权

评论回复
19
狗啃模拟|  楼主 | 2021-12-30 23:59 | 只看该作者
默认是Low速。

使用特权

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

本版积分规则

60

主题

770

帖子

0

粉丝