STM32F429的LTDC和DMA2D
来源:互联网 发布:数据上报系统 源码 编辑:程序博客网 时间:2024/06/05 17:13
在阅读了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 HBP8#define VBP4#define HSW1#define VSW1#define HFP30#define VFP1#define WIDTH 240#define HEIGHT320#define FRAMEBUFFER0xD0000000static void ltdc_gpio_init(void){gpio_open(PA, 3, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PA, 4, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PA, 6, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PA,11, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PA,12, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PB, 0, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PB, 1, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PB, 8, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PB, 9, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PB,10, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PB,11, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PC, 6, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PC, 7, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PD, 3, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PD, 6, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PF,10, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PG, 6, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PG, 7, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PG,10, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PG,11, GPIO_MODE_AF, GPIO_AF_LTDC);gpio_open(PG,12, 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-1; ltdc.LTDC_VerticalSync = VSW-1; //垂直同步宽度 ltdc.LTDC_AccumulatedHBP = HSW+HBP-1; //水平同步后沿宽度 ltdc.LTDC_AccumulatedVBP = VSW+VBP-1; //垂直同步后沿高度 ltdc.LTDC_AccumulatedActiveW = HSW+HBP+WIDTH-1; //有效宽度 ltdc.LTDC_AccumulatedActiveH = VSW+VBP+HEIGHT-1; //有效高度 ltdc.LTDC_TotalWidth = HSW+HBP+WIDTH+HFP-1; //总宽度 ltdc.LTDC_TotalHeigh = VSW+VBP+HEIGHT+VFP-1; //总高度 ltdc.LTDC_BackgroundRedValue = 0; ltdc.LTDC_BackgroundGreenValue = 0; ltdc.LTDC_BackgroundBlueValue = 0; RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC,ENABLE); RCC_PLLSAIConfig(256, 2, 4); 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+1;layer.LTDC_HorizontalStop = WIDTH+HBP;layer.LTDC_VerticalStart = VBP+1;layer.LTDC_VerticalStop = HEIGHT+VBP;layer.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;layer.LTDC_ConstantAlpha = 255;layer.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;layer.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;layer.LTDC_CFBStartAdress = FRAMEBUFFER;layer.LTDC_CFBLineLength = (WIDTH * 2)+3;layer.LTDC_CFBLineNumber = HEIGHT;layer.LTDC_CFBPitch = WIDTH * 2;layer.LTDC_DefaultColorRed = 0;layer.LTDC_DefaultColorGreen= 0;layer.LTDC_DefaultColorBlue = 0;layer.LTDC_DefaultColorAlpha= 0;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加速
- STM32F429--LTDC寄存器详解
- STM32f429-SDRAM+LTDC总结
- STM32F429 LTDC学习笔记1
- STM32F429之LTDC代码模板
- STM32F429之LTDC驱动图解
- 第27章 LTDC/DMA2D—液晶显示—零死角玩转STM32-F429系列
- STM32F429的定时器的使用方法
- 基于STM32F429的SDRAM使用
- DMA2D 原理
- STM32F429之使用FPU和DSP
- LTDC 学习
- STM32F429的USART波特率计算溢出Bug
- 基于STM32F429-Discovery RTEMS 4.11的移植
- STM32F429 使用 TCS34725 颜色传感器的驱动程序
- 基于STM32F429的RGB屏使用
- 基于STM32F429的IAP升级(HAL库/RS485)
- Angualr2 之 angular模块
- 内部类
- 蓝鸥Web开发:初识div + css引入方式
- JXTA 2: 具有高性能、海量伸缩性的 P2P 网络
- 最简单mysql5.6忘记密码处理方式
- STM32F429的LTDC和DMA2D
- 关于boundService使用方法
- Unity3D-使用custom font字体以及重叠问题
- sqoop总结
- iOS Socket编程
- linux学习笔记--host命令
- Git_git reset简介
- redis 启动命令
- 微信自动打招呼功能