STM32单片机芯片与内部105 LTDC 显示汉字与2D图形
介绍了LTDC SDRAM 显示信息的配置、硬件接口等。
目录
一、硬件接口设计
二、LCD驱动显示
1、LTDC显存使用SDRAM
设计 LTDC 驱动前,要先保证显存可以正常使用, V6 开发板用的外部 SDRAM 作为显存。 所以一定要保证 SDRAM 大批量读写数据时是正常的, SDRAM 的测试可以自己专门做一个工程测试下。 对于SDRAM 的驱动实现,可以学习本教程第 39 章。 不管你使用的是镁光的,海力士的,三星的, ISSI 的或者华邦的, 实现方法基本都是一样的。
V6 开发板使用镁光的 32 位带宽、 16MB 的 SDRAM, 如果想最大限度的发挥 STM32F429 驱动SDRAM 的性能,强烈建议使用 32 位带宽的 SDRAM,或者两个 16 位 SDRAM 组成 32 位带宽的 SDRAM也是可以的。 那 SDRAM 主要起到什么作用呢?作用有二:
- 用作显示屏的显存
STM32F429 的 LTDC 外接 RGB 接口屏是没有显存的,所以需要 SDRAM 用作显存。 如果用户选择STM32F429 LTDC 的颜色格式是 32 位色 ARGB8888, 那么所需要显存大小(单位字节)是: 显示屏宽 * 显示屏高 * ( 32/8) , 其中 32/8 是表示这种颜色格式的一个像素点需要 4 个字节来表示。
又比如配置颜色格式是 16 位色的 RGB565,那么需要的显存大小是:显示屏宽 * 显示屏高 *( 16/8),其中 16/8 是表示这种颜色格式的一个像素点需要 2 个字节来表示。其它的颜色格式, 依此类推。
- 用作 GUI 动态内存
如果想要实现炫酷效果, GUI 是极其消耗动态内存的,所以用户可以将 SDRAM 除了用于显存以外的所有内存全部用作 GUI 动态内存。
图层 1 占用 2MB, 图层 2 占用 2MB, 最后 12MB 可做其它使用。
2、LTDC 涉及到的引脚配置
几乎均为推挽输出,Alternate选择LTDC。
3、LTDC时钟与时序配置
LTDC 时序配置主要分三步就可以完成:
1、行同步,场同步和 DE 的极性配置。
2、CLK 时钟配置。
3、时序参数配置。
LCD_CLK=30MHz 时
刷新率 = 30MHz /((Width + HSYNC_W + HBP + HFP)*(Height + VSYNC_W + VBP + VFP))
= 30000000/((800 + 96 + 10 + 10)*(480 + 2 + 10 + 10)) = 30000000/(916*502)
= 65Hz
/* LCD 时钟配置 */
/*
PLLSAI_VCO Input = HSE_VALUE / PLL_M = 8M / 8 = 1MHz
PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 1 * 420 = 420MHz
PLLLCDCLK = PLLSAI_VCO Output / PLLSAI_R = 420 / 7 = 60MHz
LTDC 时钟 = PLLLCDCLK / RCC_PLLSAIDivR = 60 / 2 = 30MHz
*/
/*
刷新率 = 30MHz /((Width + HSYNC_W + HBP + HFP)*(Height + VSYNC_W + VBP + VFP))
= 30000000/((800 + 96 + 10 + 10)*(480 + 2 + 10 + 10))
= 30000000/(916*502)
= 65Hz
24位或者32位色选择LTDC输出15MHz,16位或者8位30MHz
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
PeriphClkInitStruct.PLLSAI.PLLSAIN = 420;
PeriphClkInitStruct.PLLSAI.PLLSAIR = 7;
PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_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;
/* 时序配置 */
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);
4、LCD背光设置
主要是PWM来调节。
三、LCD板级支持包
FMC配置SDRAM的位置
LTDC配置了显存的位置,刷新的长宽,刷新率等,其会自动从显存获取数据进行显示。
我们只需针对显存的数据进行修改,例如下可以看到,其中s_CurrentFrameBuffer是显存的基地址,当为RGB=565即16bit,那么每个像素点就占据16bits,因此第一个像素点在基地址,第二个像素点在基地址的下一个16bits内,通过选择X、Y计算好第几个像素点,并赋值16bits的颜色数据即可。
void LCDF4_PutPixel(uint16_t _usX, uint16_t _usY, uint16_t _usColor)
{
uint16_t *p;
uint32_t index = 0;
p = (uint16_t *)s_CurrentFrameBuffer;
if (g_LcdDirection == 0) /* 横屏 */
{
index = (uint32_t)_usY * g_LcdWidth + _usX;
}
if (index < g_LcdHeight * g_LcdWidth)
{
p[index] = _usColor;
}
}
由于画线、画字符本质上都是画点的循环,不再进行展示。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)