注意:有些液晶屏给的参数单位可能不一样,需要自己计算。
各参数值确定方法如下:
VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图,VBPD=t3/t6=1.02 mS/31.77μs=32。
VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,如图,VFPD=t5/t6=0.35 ms/31.77μs=11。
VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。如图,VSPW=t2/t6=0.06 ms/31.77μs=2。
HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数,如图,VBPD=t7×VCLK=1.89 μs×25MHz=47。
HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,如图,HFPD=t9×VCLK=0.94 μs×25 MHz=24。
HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数,如图,HSPW=3.77μs×25 MHz=94。
uint32_t DMA2D_OutAdd; uint32_t DMA2D_InAdd; void DMA2D_M2M_Config(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) { DMA2D_InitTypeDef DMA2D_InitStruct; DMA2D_FG_InitTypeDef DMA2D_FG_InitStruct; /* Enable the DMA2D Clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE); /* DMA2D configuration */ DMA2D_DeInit(); /* Transfer mode */ DMA2D_InitStruct.DMA2D_Mode = DMA2D_M2M; /* Color mode */ DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565; DMA2D_OutAdd = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos); /* Output Address */ DMA2D_InitStruct.DMA2D_OutputMemoryAdd = DMA2D_OutAdd; /* Number of lines : height */ DMA2D_InitStruct.DMA2D_NumberOfLine = Height; /* Number of pixel per line : width */ DMA2D_InitStruct.DMA2D_PixelPerLine = Width; /* Initialize the alpha and RGB values */ DMA2D_InitStruct.DMA2D_OutputGreen = 0; DMA2D_InitStruct.DMA2D_OutputBlue = 0; DMA2D_InitStruct.DMA2D_OutputRed = 0; DMA2D_InitStruct.DMA2D_OutputAlpha = 0; /* Initialize the output offset */ DMA2D_InitStruct.DMA2D_OutputOffset = (LCD_PIXEL_WIDTH - Width); /* Initialize DMA2D */ DMA2D_Init(&DMA2D_InitStruct); /* Configure default values for foreground */ DMA2D_FG_StructInit(&DMA2D_FG_InitStruct); /* Configure DMA2D foreground color mode */ DMA2D_FG_InitStruct.DMA2D_FGCM = DMA2D_RGB565; /* Configure Input Address */ DMA2D_FG_InitStruct.DMA2D_FGMA = CurrentFrameBuffer+BUFFER_OFFSET; /* Initialize foreground */ DMA2D_FGConfig(&DMA2D_FG_InitStruct); /* Start Transfer */ DMA2D_StartTransfer(); /* Wait for CTC Flag activation */ while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET) { } }