STM32F429的LTDC和DMA2D ***
在阅读了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();
}
STM32F429的LTDC和DMA2D ***的更多相关文章
- STM32F429中LTDC的DMA2D加速
液晶屏的时序问题?每个液晶屏的时序都不一样,但总体上是类似的.如下图: VDEN: 数据使能信号.HSYNC: 每一行扫描的起始点, 在扫描过程中, 不会管上一行扫描有没有结束, 当出现 ...
- 第27章 LTDC/DMA2D—液晶显示—零死角玩转STM32-F429系列
第27章 LTDC/DMA2D—液晶显示 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- LTDC/DMA2D——液晶显示
1.显示器的基本参数 (1) 像素像素是组成图像的最基本单元要素,显示器的像素指它成像最小的点. (2) 分辨率一些嵌入式设备的显示器常常以“行像素值 x列像素值”表示屏幕的分辨率.如分辨率 800x ...
- 第27章 LTDC/DMA2D—液晶显示
本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板 ...
- DMA2D 图形加速器简介
在实际使用 LTDC 控制器控制液晶屏时,使 LTDC 正常工作后,往配置好的显存地址写入要显示的像素数据, LTDC 就会把这些数据从显存搬运到液晶面板进行显示,而显示数据的容量非常大,所以我们希望 ...
- 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列
第47章 QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.y ...
- 【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
第6章 示波器设计—双通道ADC驱动 本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现.关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用, ...
- 27-4-DMA2D图形加速器
在实际使用 LTDC 控制器控制液晶屏时,使 LTDC 正常工作后,往配置好的显存地址写入要显示的像素数据, LTDC 就会把这些数据从显存搬运到液晶面板进行显示,而显示数据的容量非常大,所以我们希望 ...
- LTDC_DMA2D驱动实验
STM32F429芯片使用LTDC.DMA2D.及RAM存储器,构成了一个完整的液晶控制器.LTDC负责不断刷新液晶屏(将数据从显存搬运到液晶屏),DMA2D用于图像数据搬运.混合及格式转换(将数据搬 ...
随机推荐
- C#中hashtable如何嵌套遍历
嵌套hashtable的遍历取值怎么做 hastable中嵌套了hashtable,想用递归的方式把所有hashtable中的key和value取出来 foreach (DictionaryEntry ...
- python(列表函数)
一.列表函数 1.sort()原址排序 参数默认reverse=False时为正序排序 list1 = [1,3,5,2,1,23,18] list1.sort() print (list1) 当参数 ...
- oracle命令行导出、导入dmp文件
1.导出语句: exp test/test@127.0.0.1:1521/orcl file=d:\gpmgt.dmp full=n: 导出test用户数据库对象,full=n表示默认只导出test用 ...
- Java重试机制
重试作用: 对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法.写操作等(要考虑写是否幂等)都不适合重试. 远程调用超时.网络突然中断可以重试.在微服务治理框架中,通常都有自己的重试与 ...
- AWVS (Acunetix Web Vulnerability Scanner )
1.AWVS 是国外一款不错的安全测试工具 ,界面清楚,使用方便.可以爬取网页加载payload测试存在的安全问题 破解版的下载地址: https://www.arvinhk.c ...
- sqoop 导入增量数据到hive
版本 hive:apache-hive-2.1.0 sqoop:sqoop-1.4.6 hadoop:hadoop-2.7.3 导入方式 1.append方式 2.lastmodified方式,必须要 ...
- JS知识图谱
- Spark-2.3.2 Java SparkSQL的自定义HBase数据源
由于SparkSQL不支持HBase的数据源(HBase-1.1.2),网上有很多是采用Hortonworks的SHC,而SparkSQL操作HBase自定义数据源大多数都是基于Scala实现,我就自 ...
- 牛客NOIP暑期七天营-提高组1 解题报告
https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...
- JVM那些事儿之内存区域
相信绝大多数java开发者或多或少的都应该知道jvm,但是有多少人又深入去了解过,笔者深感自身能力的不足,去看了些资料,觉得还是有必要整理下自己的学习记录,时常回头看看,多看多实践提升自己的能力,故开 ...