stm32驱动rgb屏电路图_stm32h7“点亮RGB屏幕”
本文是我学习安福莱H7教程后总结。目的是随便拿来一个RGB屏幕和屏幕手册就能点亮它。下面记录我的操作过程。本例7寸RGB屏使用的source driver ic是OTA7001。
1、硬件设计
硬件配置为24bit并口RGB接口,如图1
图1
2、软件设计
int main(void)函数中加上LCDH7_ConfigLTDC()和LCD_SetBackLight(BRIGHT_DEFAULT)即可,如代码1
int main(void)
{
MPU_Config();
CPU_CACHE_Enable();
HAL_Init();
SystemClock_Config();
/* 配置内部LTDC */
LCDH7_ConfigLTDC();
/* 设置背光为缺省亮度 */
LCD_SetBackLight(BRIGHT_DEFAULT);
while (1)
{
}
}
代码1
那么配置好LCDH7_ConfigLTDC()函数即可点亮RGB屏幕。此函数主要进行的工作见如下伪代码1
伪代码LCDH7_ConfigLTDC()
{
1、GPIO配置
2、LTDC配置
}
伪代码1
下面分别介绍GPIO配置和LTDC配置。
2-1、GPIO配置
/* 1、配置LCD相关的GPIO */
{
/* GPIOs Configuration */
/*
+------------------------+-----------------------+----------------------------+
+ LCD pins assignment +
+------------------------+-----------------------+----------------------------+
| LCDH7_TFT R0 PI.15 | LCDH7_TFT G0 PJ.07 | LCDH7_TFT B0 PJ.12 |
| LCDH7_TFT R1 PJ.00 | LCDH7_TFT G1 PJ.08 | LCDH7_TFT B1 PJ.13 |
| LCDH7_TFT R2 PJ.01 | LCDH7_TFT G2 PJ.09 | LCDH7_TFT B2 PJ.14 |
| LCDH7_TFT R3 PJ.02 | LCDH7_TFT G3 PJ.10 | LCDH7_TFT B3 PJ.15 |
| LCDH7_TFT R4 PJ.03 | LCDH7_TFT G4 PJ.11 | LCDH7_TFT B4 PK.03 |
| LCDH7_TFT R5 PJ.04 | LCDH7_TFT G5 PK.00 | LCDH7_TFT B5 PK.04 |
| LCDH7_TFT R6 PJ.05 | LCDH7_TFT G6 PK.01 | LCDH7_TFT B6 PK.05 |
| LCDH7_TFT R7 PJ.06 | LCDH7_TFT G7 PK.02 | LCDH7_TFT B7 PK.06 |
-------------------------------------------------------------------------------
| LCDH7_TFT HSYNC PI.12 | LCDTFT VSYNC PI.13 |
| LCDH7_TFT CLK PI.14 | LCDH7_TFT DE PK.07 |
-----------------------------------------------------
*/
GPIO_InitTypeDef GPIO_Init_Structure;
/*##-Enable peripherals and GPIO Clocks #################################*/
/* 使能LTDC时钟 */
__HAL_RCC_LTDC_CLK_ENABLE();
/* 使能GPIO时钟 */
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOJ_CLK_ENABLE();
__HAL_RCC_GPIOK_CLK_ENABLE();
/* GPIOI 配置 */
GPIO_Init_Structure.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP;
GPIO_Init_Structure.Pull = GPIO_NOPULL;
GPIO_Init_Structure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOI, &GPIO_Init_Structure);
/* GPIOJ 配置 */
GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \
GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \
GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \
GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP;
GPIO_Init_Structure.Pull = GPIO_NOPULL;
GPIO_Init_Structure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOJ, &GPIO_Init_Structure);
/* GPIOK 配置 */
GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \
GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP;
GPIO_Init_Structure.Pull = GPIO_NOPULL;
GPIO_Init_Structure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOK, &GPIO_Init_Structure);
}
代码2
2-2、LTDC配置
2-2-1、配置LTDC时钟
2-2-2、配置信号极性
2-2-3、配置时序
2-2-4、配置背景层颜色
2-2-1、配置LTDC时钟
找到该RGB屏幕手册有关时钟配置参数部分。可以看到该RGB屏幕支持的时钟频率的典型值是30MHz,最大值是50MHz,如图2。
图2
我打算把时钟配置为最大频率50MHz,如何配置呢?使用STM32CubeMX软件进行时钟配置,如图3。
图3
通过图3可以看到,为得到50MHz的LTDC时钟,即配置PLL3M = 5,PLL3N = 60,PLL3R = 6,如代码3。
/* 2-1、配置LTDC时钟 */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
PeriphClkInitStruct.PLL3.PLL3M = 5;
PeriphClkInitStruct.PLL3.PLL3N = 60;
PeriphClkInitStruct.PLL3.PLL3R = 6;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
代码3
2-2-2、配置信号极性
在此先说明RGB屏幕的DE(data enable)模式和HV(horizontal vertical)模式的区别。
注:这是两种不同的同步方式,现在的大尺寸面板一般使用DE同步模式,小尺寸的面板一般使用HV同步模式。HV模式是早期的驱动模式了,现在的液晶屏面板驱动IC基本都是支持HV和DE两种模式的。很多已经直接去掉了HV模式,仅支持DE模式。DE模式的好处就是使用比较简单方便。对于支持DE模式的液晶屏,H7可以不接行同步和场同步引脚。针对这个问题,还专门进行了测试,直接不初始化行同步和场同步引脚也是不受影响的。但DE模式不全都是方便的,比如ili9488支持的DE模式就麻烦,是需要使用行同步和场同步引脚的。
找到该RGB屏幕手册有关信号时序图,如图4
图4
经过测试,DE配置为低电平有效才能正常出现该时序波形,这个问题与时序图中DE相反,很奇怪。配置信号极性,如代码4。
注:LTDC_PCPolarity_IPC和LTDC_PCPolarity_IIPC两种极性,选择不当会有一些问题。比如,选择不当底边会有黑边。
/* 2-2、配置信号极性 */
hltdc_F.Init.HSPolarity = LTDC_HSPOLARITY_AL; /* HSYNC 低电平有效 */
hltdc_F.Init.VSPolarity = LTDC_VSPOLARITY_AL; /* VSYNC 低电平有效 */
hltdc_F.Init.DEPolarity = LTDC_DEPOLARITY_AL; /* DE 低电平有效 */
hltdc_F.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
代码4
2-2-3、配置时序
stm32h7官方参考手册关于LCF-TFT同步时序描述,如图5
图5
那么图5中的HSYNC Width、VSYNC Width、HBP、VBP、Active Width、Active Height 、HFP、VFP这些参数具体数值是多少呢?打开该RGB屏幕手册,找到该部分描述,如图6
图6
通过图6可以知道Width = 800,HSYNC_W = 48,HBP = 88,HFP = 40,Height = 480,VSYNC_W = 3,VBP = 32,VFP = 13。配置时序,如代码5。
/* 2-3、时序配置 */
Width = 800;
HSYNC_W = 48;
HBP = 88;
HFP = 40;
Height = 480;
VSYNC_W = 3;
VBP = 32;
VFP = 13;
hltdc_F.Init.HorizontalSync = (HSYNC_W - 1);
hltdc_F.Init.VerticalSync = (VSYNC_W - 1);
hltdc_F.Init.AccumulatedHBP = (HSYNC_W + HBP - 1);
hltdc_F.Init.AccumulatedVBP = (VSYNC_W + VBP - 1);
hltdc_F.Init.AccumulatedActiveH = (Height + VSYNC_W + VBP - 1);
hltdc_F.Init.AccumulatedActiveW = (Width + HSYNC_W + HBP - 1);
hltdc_F.Init.TotalHeigh = (Height + VSYNC_W + VBP + VFP - 1);
hltdc_F.Init.TotalWidth = (Width + HSYNC_W + HBP + HFP - 1);
代码5
2-2-4、配置背景层颜色
完成以上步骤后,可以测试LCD的背景色显示是否正常,如果正常,说明配置基本没有问题。这里配置的背景颜色是红色,即hltdc_F.Init.Backcolor.Blue = 0; hltdc_F.Init.Backcolor.Green = 0; hltdc_F.Init.Backcolor.Red = 255; 配置背景层颜色代码如下。
/* 2-4、配置背景层颜色 */
hltdc_F.Init.Backcolor.Blue = 0;
hltdc_F.Init.Backcolor.Green = 0;
hltdc_F.Init.Backcolor.Red = 255;
hltdc_F.Instance = LTDC;
/* 初始化LTDC */
if (HAL_LTDC_Init(&hltdc_F) != HAL_OK)
{
/* 初始化错误 */
Error_Handler(__FILE__, __LINE__);
}
通过以上配置,将程序下载进电路板,可以看到屏幕点亮,显示红色,如图7
图7
至此,stm32h7“点亮RGB屏幕”操作完毕!
总结
以上是生活随笔为你收集整理的stm32驱动rgb屏电路图_stm32h7“点亮RGB屏幕”的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: XP系统如何禁止别人在电脑上安装程序
- 下一篇: 中国移动发力5G,月增900万,反超中国