在阅读了STM32F429的手册之后,对LTDC与DMA2D有了一点认识。

  STM32F429与之前的系列强大之处就在于增加了LTDC个功能,从手册上看STM32F429的LTDC可以用于驱动1024x768分辨率的LCD屏幕。

LTDC其实就是TFT LCD控制器的意思,在arm9/arm11/cortex-A系列CPU当中,这个是必须有的外设,在小型单片机中,有这个功能的不多。

LCD控制器的功能就是生成LCD像素时钟,将GRAM中的数据搬运到LCD屏幕上去显示。

在一般的小型LCD模块一般都集成了一个LCD控制器,如常用的ili9320/ili9325等型号,这些LCD模块同时还集成了几百KB大小的RAM,用于显示;

这种方案,不需要占用单片机的RAM就可以稳定地驱动LCD显示图像,一般地MCU先通过8080接口或SPI向控制器发送命令,配置LCD参数,

然后向集成的RAM中写入数据就可以显示,是低成本项目的首选方案。

而STM32F429自带的LTDC也是LCD控制器,与ili9320相比,支持的分辨率更高,功能更多,但是LTDC只负责产生LCD需要的时序,并没有集成RAM,

如640x480x16bpp的屏幕,需要600KB的RAM,在单片机中600KB的内存,已经是天文数字了,所以需要外扩一片SDRAM来充当GRAM。

那么在使用LTDC的时候,首先要配置LCD的时序,然后要设置GRAM的地址(这里GRAM的地址就是外扩的SDRAM的地址),最后开启LTDC,可以在LCD_CLK引脚测量到有稳定的频率输出,应该就差不多了;配置好LTDC之后,硬件会自动将GRAM中的内容搬运到LCD屏幕上,只要改变GRAM中的数据就可以改变显示内容。

另外要说的是这个LTDC支持2个图层和1个背景图层,一般情况下用一个图层显示就可以了;这2个图层可以单独设置显示区域和GRAM地址,并且同时开启时,硬件自动将2个图层的显示内容进行混合,混合顺序是:图层2 -> 图层1 -> 背景色,图层2位于最顶层,至于怎么利用这两个图层实现特殊的功能,就仁者见仁,智者见智了。

DMA2D则是一个生活在GRAM世界中的一个搬运工,往你指定的内存地址中制造一个矩形,或者把一个矩形数据从源RAM复制到目的RAM,并且完全由硬件实现。

LTDC的初始化参考例程:

#include "stm32f4xx.h"
#include "gpio.h"
#include "ltdc.h" #define HBP 8
#define VBP 4
#define HSW 1
#define VSW 1
#define HFP 30
#define VFP 1
#define WIDTH 240
#define HEIGHT 320 #define FRAMEBUFFER 0xD0000000 static void ltdc_gpio_init(void)
{
gpio_open(PA, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PA, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PA, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PA,, GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PA,, GPIO_MODE_AF, GPIO_AF_LTDC); gpio_open(PB, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PB, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PB, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PB, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PB,, GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PB,, GPIO_MODE_AF, GPIO_AF_LTDC); gpio_open(PC, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PC, , GPIO_MODE_AF, GPIO_AF_LTDC); gpio_open(PD, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PD, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PF,, GPIO_MODE_AF, GPIO_AF_LTDC); gpio_open(PG, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PG, , GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PG,, GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PG,, GPIO_MODE_AF, GPIO_AF_LTDC);
gpio_open(PG,, GPIO_MODE_AF, GPIO_AF_LTDC);
} static void ltdc_clock_init(void)
{
LTDC_InitTypeDef ltdc;
ltdc.LTDC_HSPolarity = LTDC_HSPolarity_AL;
ltdc.LTDC_VSPolarity = LTDC_VSPolarity_AL;
ltdc.LTDC_DEPolarity = LTDC_DEPolarity_AL;
ltdc.LTDC_PCPolarity = LTDC_PCPolarity_IPC;
ltdc.LTDC_HorizontalSync = HSW-;
ltdc.LTDC_VerticalSync = VSW-; //垂直同步宽度
ltdc.LTDC_AccumulatedHBP = HSW+HBP-; //水平同步后沿宽度
ltdc.LTDC_AccumulatedVBP = VSW+VBP-; //垂直同步后沿高度
ltdc.LTDC_AccumulatedActiveW = HSW+HBP+WIDTH-; //有效宽度
ltdc.LTDC_AccumulatedActiveH = VSW+VBP+HEIGHT-; //有效高度
ltdc.LTDC_TotalWidth = HSW+HBP+WIDTH+HFP-; //总宽度
ltdc.LTDC_TotalHeigh = VSW+VBP+HEIGHT+VFP-; //总高度
ltdc.LTDC_BackgroundRedValue = ;
ltdc.LTDC_BackgroundGreenValue = ;
ltdc.LTDC_BackgroundBlueValue = ; RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC,ENABLE);
RCC_PLLSAIConfig(, , );
RCC_PLLSAICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY)==RESET);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);
LTDC_Init(<dc);
LTDC_Cmd(ENABLE);
} static void ltdc_layer_init(void)
{
LTDC_Layer_InitTypeDef layer;
layer.LTDC_HorizontalStart = HBP+;
layer.LTDC_HorizontalStop = WIDTH+HBP;
layer.LTDC_VerticalStart = VBP+;
layer.LTDC_VerticalStop = HEIGHT+VBP;
layer.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;
layer.LTDC_ConstantAlpha = ;
layer.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;
layer.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;
layer.LTDC_CFBStartAdress = FRAMEBUFFER;
layer.LTDC_CFBLineLength = (WIDTH * )+;
layer.LTDC_CFBLineNumber = HEIGHT;
layer.LTDC_CFBPitch = WIDTH * ;
layer.LTDC_DefaultColorRed = ;
layer.LTDC_DefaultColorGreen= ;
layer.LTDC_DefaultColorBlue = ;
layer.LTDC_DefaultColorAlpha= ;
LTDC_LayerInit(LTDC_Layer1, &layer);
LTDC_ReloadConfig(LTDC_IMReload);
LTDC_LayerCmd(LTDC_Layer1, ENABLE);
LTDC_ReloadConfig(LTDC_IMReload);
} void ltdc_init(void)
{
ltdc_gpio_init();
ltdc_clock_init();
ltdc_layer_init();
}

最新文章

  1. [Asp.net 5] DependencyInjection项目代码分析
  2. Leetcode 166. Fraction to Recurring Decimal 弗洛伊德判环
  3. 【洛谷 p3386】模板-二分图匹配(图论)
  4. mysql笔记整理
  5. 查找进程对应的PID和对应的端口号
  6. sql 模糊查询带下划线的字段 _
  7. serialVersionUID作用
  8. OWIN产生的背景以及简单介绍
  9. Eclipse配置Struts2.x
  10. Codeforces Round #419 (Div. 2)
  11. studio中碰到的jni问题:java.lang.UnsatisfiedLinkError
  12. jquery 加法 乘法运算 精确计算函数
  13. linux命令之df
  14. [新三板摘牌]国资企业济南华光光电去年终止拟IPO今年摘牌新三板
  15. ethereum/EIPs-155 Simple replay attack protection 35,36
  16. MySQL global Log
  17. mybatis 参数为String,用_parameter 取值
  18. WCF错误&quot;The maximum message size quota for incoming messages (65536) has been exceeded.&quot;
  19. mahout推荐系统
  20. elasticsearch Geo Distance Query

热门文章

  1. 浅析MySQL使用 GROUP BY 分组聚合与细分聚合
  2. Nginx 配置 HTTPS(多域名)
  3. git学习记录--标签随笔
  4. SpringBoot RabbitMQ 延迟队列代码实现
  5. c++ default关键字
  6. idea的基础设置
  7. python中的logging日志模块
  8. sitemap怎么制作才适合蜘蛛抓取?
  9. “只有DBA才能导入由其他DBA导出的文件”各种解决办法
  10. 一个关于gcd的等式的证明