这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
icore4t_61 [2020/10/21 09:58] zgf 创建 |
icore4t_61 [2022/04/01 10:58] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-10-21 | gingko | 初次建立 | | | V1.0 | 2020-10-21 | gingko | 初次建立 | | ||
行 102: | 行 101: | ||
* HV同步模式 | * HV同步模式 | ||
- | HV模式需要LCD_CLK时钟信号,行同步信号LCD_HSYNC和场同步信号LCD_VSYNC来控制刷新。比如一个480x272分辨率的裸屏,有一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),就有480个LCD_CLK输出时钟来确认行中480个点。每个时钟有效的时候,从显存读取一次RGB数据。再来一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),切换到下一行,继续行同步和时钟输出,扫描272行后,发送一个场同步信号LCD_VSYNC,又重新从第一行扫描开始。 | + | HV模式需要LCD_CLK时钟信号,行同步信号LCD_HSYNC和场同步信号LCD_VSYNC来控制刷新。比如一个800x480分辨率的裸屏,有一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),就有800个LCD_CLK输出时钟来确认行中800个点。每个时钟有效的时候,从显存读取一次RGB数据。再来一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),切换到下一行,继续行同步和时钟输出,扫描480行后,发送一个场同步信号LCD_VSYNC,又重新从第一行扫描开始。 |
=== 3.LTDC的时序配置 === | === 3.LTDC的时序配置 === | ||
行 110: | 行 109: | ||
* HSYNC width水平同步宽度设置,以LCD_CLK的像素时钟输出为单位。 | * HSYNC width水平同步宽度设置,以LCD_CLK的像素时钟输出为单位。 | ||
* HBP(horizontal back porch period)水平后沿周期设置,以LCD_CLK的像素时钟输出为单位。 | * HBP(horizontal back porch period)水平后沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
- | * Active width有效宽度设置,以LCD_CLK的像素时钟输出为单位。以480*272分辨率为例,Active width = 480。 | + | * Active width有效宽度设置,以LCD_CLK的像素时钟输出为单位。以800*480分辨率为例,Active width = 800。 |
* HFP(horizontal front porch period)水平前沿周期设置,以LCD_CLK的像素时钟输出为单位。 | * HFP(horizontal front porch period)水平前沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
* VSYNC width垂直同步宽度设置,以LCD_CLK的像素时钟输出为单位。 | * VSYNC width垂直同步宽度设置,以LCD_CLK的像素时钟输出为单位。 | ||
* VBP(vertical back porch period)垂直后沿周期设置,以LCD_CLK的像素时钟输出为单位。 | * VBP(vertical back porch period)垂直后沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
- | * Active height有效高度设置,以LCD_CLK的像素时钟输出为单位。以480*272分辨率为例,Active height = 272。 | + | * Active height有效高度设置,以LCD_CLK的像素时钟输出为单位。以800*480分辨率为例,Active height = 480。 |
* VFP(vertical front porch period)垂直前沿周期设置,以LCD_CLK的像素时钟输出为单位。 | * VFP(vertical front porch period)垂直前沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
行 213: | 行 212: | ||
x = x + xs; | x = x + xs; | ||
y = y + ys; | y = y + ys; | ||
- | if((x+r)>=480 || (x-r)<=0){ | + | if((x+r)>=LCD_WIDTH || (x-r)<=0){ |
xs=-1*xs; | xs=-1*xs; | ||
x = x + 2*xs; | x = x + 2*xs; | ||
行 219: | 行 218: | ||
if(co==7){ | if(co==7){ | ||
co=0; | co=0; | ||
- | clear_screen(bg);} | + | clear_screen(bg); |
- | } | + | } |
- | if((y+r)>=272 || (y-r)<=0){ | + | } |
+ | if((y+r)>=LCD_HEIGHT || (y-r)<=0){ | ||
ys=-1*ys; | ys=-1*ys; | ||
y = y + 2*ys; | y = y + 2*ys; | ||
行 227: | 行 227: | ||
if(co==7){ | if(co==7){ | ||
co=0; | co=0; | ||
- | clear_screen(bg);} | + | clear_screen(bg); |
+ | } | ||
} | } | ||
draw_circle(x, y, r, colo[co], 1); //画圆 | draw_circle(x, y, r, colo[co], 1); //画圆 | ||
for(j = oldx-r-2;j < oldx+r+2;j ++){ | for(j = oldx-r-2;j < oldx+r+2;j ++){ | ||
for(i = oldy-r-2;i < oldy+r+2;i ++){ | for(i = oldy-r-2;i < oldy+r+2;i ++){ | ||
- | if(j<1 || j>479 || i<1 || i>271)continue; | + | if(j<1 || j>LCD_WIDTH-1 || i<1 || i>LCD_HEIGHT-1)continue; |
if( (int)(x-j)*(x-j) + (int)(y-i)*(y-i) > (int)r*r ){ | if( (int)(x-j)*(x-j) + (int)(y-i)*(y-i) > (int)r*r ){ | ||
*(volatile unsigned short int *) (address_sdram[i] + (j << 1)) = bg; | *(volatile unsigned short int *) (address_sdram[i] + (j << 1)) = bg; | ||
行 245: | 行 246: | ||
void MX_LTDC_Init(void) | void MX_LTDC_Init(void) | ||
{ | { | ||
- | LTDC_LayerCfgTypeDef pLayerCfg = {0}; | + | LTDC_LayerCfgTypeDef pLayerCfg = {0}; |
- | LTDC_LayerCfgTypeDef pLayerCfg1 = {0}; | + | LTDC_LayerCfgTypeDef pLayerCfg1 = {0}; |
- | hltdc.Instance = LTDC; | + | hltdc.Instance = LTDC; |
- | hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; //水平同步极性 | + | hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; //水平同步极性 |
- | hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; //垂直同步极性 | + | hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; //垂直同步极性 |
- | hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; //数据使能极性 | + | hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; //数据使能极性 |
- | hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; //像素时钟极性 | + | hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; //像素时钟极性 |
- | hltdc.Init.HorizontalSync = 0; //水平同步宽度 | + | hltdc.Init.HorizontalSync = 0; //水平同步宽度 |
- | hltdc.Init.VerticalSync = 0; //垂直同步宽度 | + | hltdc.Init.VerticalSync = 1; //垂直同步宽度 |
- | hltdc.Init.AccumulatedHBP = 20; //水平同步后沿宽度 | + | hltdc.Init.AccumulatedHBP = 45; //水平同步后沿宽度 |
- | hltdc.Init.AccumulatedVBP = 9; //垂直同步后沿高度 | + | hltdc.Init.AccumulatedVBP = 22; //垂直同步后沿高度 |
- | hltdc.Init.AccumulatedActiveW = 500;//有效宽度 | + | hltdc.Init.AccumulatedActiveW = 845;//有效宽度 |
- | hltdc.Init.AccumulatedActiveH = 281;//有效高度 | + | hltdc.Init.AccumulatedActiveH = 502;//有效高度 |
- | hltdc.Init.TotalWidth = 524; //总宽度 | + | hltdc.Init.TotalWidth = 1055; //总宽度 |
- | hltdc.Init.TotalHeigh = 287; //总高度 | + | hltdc.Init.TotalHeigh = 525; //总高度 |
- | hltdc.Init.Backcolor.Blue = 255; //背景RGB数值,白色 | + | hltdc.Init.Backcolor.Blue = 255; //背景RGB数值,白色 |
- | hltdc.Init.Backcolor.Green = 255; | + | hltdc.Init.Backcolor.Green = 255; |
- | hltdc.Init.Backcolor.Red = 255; | + | hltdc.Init.Backcolor.Red = 255; |
- | if (HAL_LTDC_Init(&hltdc) != HAL_OK) | + | if (HAL_LTDC_Init(&hltdc) != HAL_OK) |
- | {Error_Handler();} | + | {Error_Handler();} |
- | pLayerCfg.WindowX0 = 0; //屏幕像素宽 | + | pLayerCfg.WindowX0 = 0; //屏幕像素宽 |
- | pLayerCfg.WindowX1 = 480; | + | pLayerCfg.WindowX1 = 800; |
- | pLayerCfg.WindowY0 = 0; //屏幕像素高 | + | pLayerCfg.WindowY0 = 0; //屏幕像素高 |
- | pLayerCfg.WindowY1 = 272; | + | pLayerCfg.WindowY1 = 480; |
- | pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; //屏幕格式 | + | pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; //屏幕格式 |
- | pLayerCfg.Alpha = 0xff; //透明度,不透明 | + | pLayerCfg.Alpha = 0xff; //透明度,不透明 |
- | pLayerCfg.Alpha0 = 0; //默认透明度 | + | pLayerCfg.Alpha0 = 0; //默认透明度 |
- | pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; | + | pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; |
- | pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; | + | pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; |
- | pLayerCfg.FBStartAdress = 0xC0000000; //帧缓冲区起始地址 | + | pLayerCfg.FBStartAdress = 0xC0000000; //帧缓冲区起始地址 |
- | pLayerCfg.ImageWidth = 480; //图层宽 | + | pLayerCfg.ImageWidth = 800; //图层宽 |
- | pLayerCfg.ImageHeight = 272; //图层高 | + | pLayerCfg.ImageHeight = 480; //图层高 |
- | pLayerCfg.Backcolor.Blue = 255; //图层背景RGB数值,白色 | + | pLayerCfg.Backcolor.Blue = 255; //图层背景RGB数值,白色 |
- | pLayerCfg.Backcolor.Green = 255; | + | pLayerCfg.Backcolor.Green = 255; |
- | pLayerCfg.Backcolor.Red = 255; | + | pLayerCfg.Backcolor.Red = 255; |
- | if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) | + | if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) |
- | { Error_Handler();} | + | { Error_Handler();} |
} | } | ||
- | |||
</code> | </code> | ||
=== 4.画点函数 === | === 4.画点函数 === | ||
行 307: | 行 307: | ||
int draw_circle(int x, int y, int r, int color, int fill) { | int draw_circle(int x, int y, int r, int color, int fill) { | ||
int i,j; | int i,j; | ||
- | if(x<0 || x>480 || y<0 || y>272)return 0; | + | if(x<0 || x>LCD_WIDTH || y<0 || y>LCD_HEIGHT)return 0; |
for(j = x-r;j < x+r;j ++){ | for(j = x-r;j < x+r;j ++){ | ||
for(i = y-r;i < y+r;i ++){ | for(i = y-r;i < y+r;i ++){ |