|
使用ST论坛上面得一份参考代码,修改好适配自己的硬件配置后,想要看下LCD读写效果,我就调用了一个画线函数,发现设置文本颜色时,总是设置的时整个屏幕得颜色,并没有看到线,而且我配置成layer1&layer2后,layer1做为背景层设置为黄色,然后在将文本设置为前景层,蓝色,上电时发现黄色直接被蓝色覆盖,实在搞不清楚啥问题 ,感觉像是LCD缓存地址被覆盖的意思,SDRAM没起作用似的。
代码片段如下:
/* Global variables to set the written text color */
/* LCD Size (Width and Height) */
#define LCD_PIXEL_WIDTH ((uint16_t)800)
#define LCD_PIXEL_HEIGHT ((uint16_t)480)
#define LCD_FRAME_BUFFER (SDRAM_BANK_ADDR)
#define BUFFER_OFFSET ((uint32_t)LCD_PIXEL_WIDTH*LCD_PIXEL_HEIGHT*2)
static uint16_t CurrentTextColor = 0x0000;//LCD_COLOR_BLACK
static uint16_t CurrentBackColor = 0xFFFF;//LCD_COLOR_WHITE
/* Default LCD configuration with LCD Layer 1 */
static uint32_t CurrentFrameBuffer = LCD_FRAME_BUFFER ;
static uint32_t CurrentLayer = LCD_BACKGROUND_LAYER;
void LCD_LayerInit(void)
{
LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct;
/*初始化 LTDC 的层参数
** LTDC共有3层,分别为:LTDC背景层(颜色恒定),第一层(背景层),第二层(前景层)
*/
/* 层窗口配置 */
LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP + HSW;
LTDC_Layer_InitStruct.LTDC_HorizontalStop = HSW+HBP+LCD_PIXEL_WIDTH-1;
LTDC_Layer_InitStruct.LTDC_VerticalStart = VBP + VSW;
LTDC_Layer_InitStruct.LTDC_VerticalStop = VSW+VBP+LCD_PIXEL_HEIGHT-1;
LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;/* 像素格式配置 */
/* 默认背景颜色,该颜色在定义的层窗口外或在层禁止时使用。 */
LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0;
LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;
LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;
LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;
LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255;/* 恒定 Alpha 值配置,0-255(完全不透明)*/
/* 配置混合因子 CA 表示使用恒定 Alpha 值,PAxCA 表示使用像素 Alpha x 恒定 Alpha
值 */
LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;
LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;
/* 该成员应写入 (一行像素数据占用的字节数 +3)
Line Lenth = 行有效像素个数 x 每个像素的字节数 + 3
行有效像素个数 = LCD_PIXEL_WIDTH
每个像素的字节数 = 2(RGB565/RGB1555)/ 3 (RGB888)/ 4(ARGB8888)
*/
LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCD_PIXEL_WIDTH * 2) + 3);
/* 从某行的起始位置到下一行起始位置处的像素增量
Pitch = 行有效像素个数 x 每个像素的字节数 */
LTDC_Layer_InitStruct.LTDC_CFBPitch = (LCD_PIXEL_WIDTH * 2);
LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;/* 配置有效的行数 */
LTDC_Layer_InitStruct.LTDC_CFBStartAdress= LCD_FRAME_BUFFER;//LCD_FRAME_BUFFER;/* 配置本层的显存首地址 */
/* 以上面的配置初始化第 1 层 */
LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct) ;
#if 1
/*配置第2层,若没有重写某个成员的值,则该成员使用跟第1层一样的配置*/
/*配置本层的显存首地址,这里配置它紧挨在第1层的后面*/
LTDC_Layer_InitStruct.LTDC_CFBStartAdress= LCD_FRAME_BUFFER+ BUFFER_OFFSET;
/*配置混合因子,使用像素Alpha参与混合*/
LTDC_Layer_InitStruct.LTDC_BlendingFactor_1=LTDC_BlendingFactor1_PAxCA;
LTDC_Layer_InitStruct.LTDC_BlendingFactor_2=LTDC_BlendingFactor2_PAxCA;
/*初始化第2层*/
LTDC_LayerInit(LTDC_Layer2,<DC_Layer_InitStruct);
#endif
/*使能前景及背景层*/
LTDC_LayerCmd(LTDC_Layer1,ENABLE);
#if 1
LTDC_LayerCmd(LTDC_Layer2,ENABLE);
#endif
/*立即重载配置*/
LTDC_ReloadConfig(LTDC_IMReload);
LTDC_Cmd(ENABLE); /* display ON */
}
/**
* @brief Displays a line.
* @param Xpos: specifies the X position, can be a value from 0 to 240.
* @param Ypos: specifies the Y position, can be a value from 0 to 320.
* @param Length: line length.
* @param Direction: line direction.
* This parameter can be one of the following values: LCD_DIR_HORIZONTAL or LCD_DIR_VERTICAL.
* @retval None
*/
void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction)
{
DMA2D_InitTypeDef DMA2D_InitStruct;
uint32_t Xaddress = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);
uint16_t Red_Value = (0xF800 & CurrentTextColor) >> 11;
uint16_t Blue_Value = 0x001F & CurrentTextColor;
uint16_t Green_Value = (0x07E0 & CurrentTextColor) >> 5;
/* Configure DMA2D */
DMA2D_DeInit();
DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;
DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;
DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;
DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;
DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;
if(Direction == LCD_DIR_HORIZONTAL)
{
DMA2D_InitStruct.DMA2D_OutputOffset = 0;
DMA2D_InitStruct.DMA2D_NumberOfLine = 1;
DMA2D_InitStruct.DMA2D_PixelPerLine = Length;
}
else
{
DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH - 1;
DMA2D_InitStruct.DMA2D_NumberOfLine = Length;
DMA2D_InitStruct.DMA2D_PixelPerLine = 1;
}
DMA2D_Init(&DMA2D_InitStruct);
/* Start Transfer */
DMA2D_StartTransfer();
/* Wait for CTC Flag activation */
while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)
{
}
}
//------------------------------------------------------------------------------
//主函数
//------------------------------------------------------------------------------
int main(void)
{
LCD_Init(); //LCD初始化
LCD_LayerInit(); //LCD层次显示初始化
LTDC_Cmd(ENABLE); //打开LTDC
LCD_SetLayer(LCD_BACKGROUND_LAYER); //设置为背景层
LCD_SetTransparency(120); //背景层透明度
LCD_Clear(LCD_COLOR_YELLOW);
LCD_SetLayer(LCD_FOREGROUND_LAYER); //把LCD设置为前景显示层
LCD_SetTransparency(120); //前景层透明度
LCD_SetTextColor(LCD_COLOR_BLUE);
while(1)
{
LCD_DrawLine(20,50,200,LCD_DIR_VERTICAL);
}
}
|
|