打印
[STM32F4]

STM32F429驱动VGA显示器,显示器显示输入不支持?

[复制链接]
12611|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家好,年底了发一个问题贴,希望过了春节能得到大家帮助.STM32F429驱动VGA显示器,显示器显示输入不支持,使用的驱动芯片为ADV7123!!  一样的程序,直接带7寸屏是OK的,能正常显示.

分辨率为800*600,驱动代码如下:
/**
  * @brief LTDC MSP Initialization
  *        This function configures the hardware resources used in this example:
  *           - Peripheral's clock enable
  *           - Peripheral's GPIO Configuration  
  * @param hltdc: LTDC handle pointer
  * @retval None
  */
void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
{  
  GPIO_InitTypeDef GPIO_Init_Structure;

  /* Enable peripherals and GPIO Clocks */  
  /* Enable the LTDC Clock */
  __LTDC_CLK_ENABLE();

  /* Enable GPIOs clock */
  __GPIOE_CLK_ENABLE();
  __GPIOF_CLK_ENABLE();
  __GPIOG_CLK_ENABLE();  
        __GPIOH_CLK_ENABLE();
        __GPIOI_CLK_ENABLE();
       
//        LCD_BL_ON();

  /* Configure peripheral GPIO */

  /* LTDC pins configuraiton: PE4,5,6 */  
  GPIO_Init_Structure.Pin       = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6;
  GPIO_Init_Structure.Mode      = GPIO_MODE_AF_PP;
  GPIO_Init_Structure.Pull      = GPIO_NOPULL;
  GPIO_Init_Structure.Speed     = GPIO_SPEED_FAST;
  GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;  
  HAL_GPIO_Init(GPIOE, &GPIO_Init_Structure);
       
        /* LTDC pins configuraiton: PF10原来是LCD_DE,现在改为BLANK N */  
  GPIO_Init_Structure.Pin       = GPIO_PIN_10;
  GPIO_Init_Structure.Mode      = GPIO_MODE_AF_PP;
  GPIO_Init_Structure.Pull      = GPIO_NOPULL;
  GPIO_Init_Structure.Speed     = GPIO_SPEED_FAST;
  GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;  
  HAL_GPIO_Init(GPIOF, &GPIO_Init_Structure);
       
       
        /* LTDC pins configuraiton: PG6,7,10,11,12 */  
  GPIO_Init_Structure.Pin       = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
  GPIO_Init_Structure.Mode      = GPIO_MODE_AF_PP;
  GPIO_Init_Structure.Pull      = GPIO_NOPULL;
  GPIO_Init_Structure.Speed     = GPIO_SPEED_FAST;
  GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;  
  HAL_GPIO_Init(GPIOG, &GPIO_Init_Structure);
       
        /* LTDC pins configuraiton: PH2,3,8,9,10,11,12,13,14,15 */  
  GPIO_Init_Structure.Pin       = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_8 | GPIO_PIN_9 | \
                                                                                                                                        GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 |\
                                                                                                                                        GPIO_PIN_14 | GPIO_PIN_15;
  GPIO_Init_Structure.Mode      = GPIO_MODE_AF_PP;
  GPIO_Init_Structure.Pull      = GPIO_NOPULL;
  GPIO_Init_Structure.Speed     = GPIO_SPEED_FAST;
  GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;  
  HAL_GPIO_Init(GPIOH, &GPIO_Init_Structure);
       
        /* LTDC pins configuraiton: PI0,1,2,4,5,6,7,8,9,10 */  
  GPIO_Init_Structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \
                                                                                                                                        GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 |\
                                                                                                                                        GPIO_PIN_9 | GPIO_PIN_10;
  GPIO_Init_Structure.Mode      = GPIO_MODE_AF_PP;
  GPIO_Init_Structure.Pull      = GPIO_NOPULL;
  GPIO_Init_Structure.Speed     = GPIO_SPEED_FAST;
  GPIO_Init_Structure.Alternate = GPIO_AF14_LTDC;  
  HAL_GPIO_Init(GPIOI, &GPIO_Init_Structure);  

  /* Set LTDC Interrupt to the lowest priority */
  HAL_NVIC_SetPriority(LTDC_IRQn, 0xF, 0);

  /* Enable LTDC Interrupt */
  HAL_NVIC_EnableIRQ(LTDC_IRQn);
}



#define  HSW            ((uint16_t)40)     /* Horizontal synchronization */
#define  HBP            ((uint16_t)46)      /* Horizontal back porch      */
#define  HFP            ((uint16_t)21)      /* Horizontal front porch     */
#define  VSW            ((uint16_t)40)     /* Vertical synchronization   */
#define  VBP            ((uint16_t)24)      /* Vertical back porch        */
#define  VFP            ((uint16_t)22)      /* Vertical front porch       */
#define  HSTART         (HBP)
#define  HSTOP          (XSIZE_PHYS+HSTART)
#define  VSTART         (VBP)
#define  VSTOP          (YSIZE_PHYS+VSTART)

static void LCD_LL_Init(void)
{
  static RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;

  /* DeInit */
  HAL_LTDC_DeInit(&hltdc);

  /* Set LCD Timings */
  hltdc.Init.HorizontalSync = HSW-1;//40;
  hltdc.Init.VerticalSync = VSW-1;//9;
  hltdc.Init.AccumulatedHBP = HBP-1;//Horizontal back porch;
  hltdc.Init.AccumulatedVBP = VBP-1;//Vertical back porch  
  hltdc.Init.AccumulatedActiveH = YSIZE_PHYS+VBP-1;//502;
  hltdc.Init.AccumulatedActiveW = XSIZE_PHYS+HBP-1;//845;
  hltdc.Init.TotalHeigh = YSIZE_PHYS+VBP+VFP-1;//525;
  hltdc.Init.TotalWidth = 1056;//XSIZE_PHYS+HBP+HFP-1;//1056;

  /* background value */
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 0;
  hltdc.Init.Backcolor.Red = 0;

  /* LCD clock configuration */
  /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
  /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 368 Mhz */
  /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 368/4 = 80 Mhz */
  /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 = 80/2 = 40 Mhz */
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
  PeriphClkInitStruct.PLLSAI.PLLSAIN = 160;
  PeriphClkInitStruct.PLLSAI.PLLSAIR = 2;
  PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);

  /* Polarity */
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  hltdc.Init.DEPolarity = LTDC_VSPOLARITY_AL;  
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  hltdc.Instance = LTDC;

  HAL_LTDC_Init(&hltdc);
  HAL_LTDC_ProgramLineEvent(&hltdc, 0);

/* Configure the DMA2D  default mode */
  hdma2d.Init.Mode         = DMA2D_R2M;
  hdma2d.Init.ColorMode    = DMA2D_RGB565;
  hdma2d.Init.OutputOffset = 0x0;     

  hdma2d.Instance          = DMA2D;

  if(HAL_DMA2D_Init(&hdma2d) != HAL_OK)
  {
    while (1);
  }
}



VGA驱动.png (98.34 KB )

STM32F429_ADV7123

STM32F429_ADV7123
沙发
everbright|  楼主 | 2015-2-12 15:35 | 只看该作者
用示波器测量VGA1接口中Red,green,Blue信号,是有波形的,幅值在0.7V左右;ADV7123的第36脚Vref的电压为1.25V, Vsync的频率是29.29HZ,Hsync的频率是18.92Khz,LCD_CLK的频率为20Mhz.曾尝试调大LCD_Clk的频率为30Mhz,也不行.各位支招....

使用特权

评论回复
板凳
戈卫东| | 2015-2-12 18:23 | 只看该作者
VSYNC HSYNC 可能不符合VGA

使用特权

评论回复
地板
everbright|  楼主 | 2015-2-13 08:53 | 只看该作者
请问应该怎么调,才能使VSYNC HSYNC 符合VGA.可设置项里就是时钟吧.
原来听说如果能驱动7寸屏的话,直接接上ADV7123就可以了,不是这样吗?

使用特权

评论回复
5
zh113214| | 2015-2-14 18:45 | 只看该作者
RGB的初始化是对的。。其他的没发现什么问题呢

使用特权

评论回复
6
peugeoter| | 2015-2-15 17:21 | 只看该作者
需要符合显示器EDID里面的分辨率,刷新率与分辨率都要符合。

使用特权

评论回复
7
戈卫东| | 2015-2-16 12:03 | 只看该作者
还有一个东东,消隐信号,它应该是在RGB信号里面给出的,有了它VGA显示器才能确定每个点。

使用特权

评论回复
8
戈卫东| | 2015-2-16 12:05 | 只看该作者
应该是对应ADV7123的VGA_BLANK_N。。。。。。。
我也不清楚,不过你可能需要正确配置它。

使用特权

评论回复
9
everbright|  楼主 | 2015-2-16 15:58 | 只看该作者
戈卫东 发表于 2015-2-16 12:05
应该是对应ADV7123的VGA_BLANK_N。。。。。。。
我也不清楚,不过你可能需要正确配置它。 ...

你说的消隐信号,应该就是我这里的PF10脚,原来的DE信号,这引脚的输出,好像是VSync&Hsync。我这个DE信号接到了VGA_BLANK_N。谢谢你的热情回复。香版主没在,香版主我这DE脚是对应VGA_BLANK_N,对吧

使用特权

评论回复
10
everbright|  楼主 | 2015-2-25 08:45 | 只看该作者
期待各位关注呀,不知道那里有STM32F4xx相关VGA的资料,PDF文档里都只是提了一下.

SVGA.png (38.36 KB )

SVGA.png

使用特权

评论回复
11
everbright|  楼主 | 2015-2-25 16:40 | 只看该作者
本帖最后由 everbright 于 2015-2-25 18:56 编辑

现在把分辨率设置成640*480,场频率为60Hz,显示器可以识别出来了.但设置成800*600,场频率为60hz, LTDC clock frequency设置为40Mhz时不能正确显示,花屏;场频率为50hz时,LTDC clock frequency设置为32Mhz时可以显示.我看手册上写着, LTDC clock frequency最高为42Mhz,40Mhz也没有超呀

使用特权

评论回复
12
everbright|  楼主 | 2015-2-25 16:41 | 只看该作者

数据手册Table 109. LTDC characteristics

本帖最后由 everbright 于 2015-2-25 16:45 编辑

数据手册Table 109. LTDC characteristics

11.png (12.38 KB )

11.png

使用特权

评论回复
13
everbright|  楼主 | 2015-2-26 20:32 | 只看该作者
找到原因,原来是SDRAM问题。800*600的显示静态图像没问题,但显示GIF动画或切换画面时屏会有闪烁;是SDRAM带宽不不行了。怎么提高SDRAM的操作频率呀。 我将stm32F429主频超频到210Mhz时切换画面会好些,但这不是办法呀,再求各位支招……
以下是我我对SDRAM的配置:
uint8_t BSP_SDRAM_Init(void)
{
SDRAM_HandleTypeDef hsdram;
FMC_SDRAM_TimingTypeDef SDRAM_Timing;
FMC_SDRAM_CommandTypeDef command;
  
        static uint8_t sdramstatus = SDRAM_ERROR;
   /*##-1- Configure the SDRAM device #########################################*/
  /* SDRAM device configuration */
  memset(&hsdram,0,sizeof(SDRAM_HandleTypeDef));
        hsdram.Instance = FMC_SDRAM_DEVICE;
  
  SDRAM_Timing.LoadToActiveDelay    = 1;
  SDRAM_Timing.ExitSelfRefreshDelay = 6;        //6
  SDRAM_Timing.SelfRefreshTime      = 4;
  SDRAM_Timing.RowCycleDelay        = 6;        //6
  SDRAM_Timing.WriteRecoveryTime    = 2;
  SDRAM_Timing.RPDelay              = 2;
  SDRAM_Timing.RCDDelay             = 2;
  
        hsdram.Init.SDBank             = FMC_SDRAM_BANK2;
  hsdram.Init.ColumnBitsNumber   = FMC_SDRAM_COLUMN_BITS_NUM_9;
  hsdram.Init.RowBitsNumber      = FMC_SDRAM_ROW_BITS_NUM_12;
  hsdram.Init.MemoryDataWidth    = SDRAM_MEMORY_WIDTH;
  hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  hsdram.Init.CASLatency         = FMC_SDRAM_CAS_LATENCY_3;
  hsdram.Init.WriteProtection    = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  hsdram.Init.SDClockPeriod      = SDCLOCK_PERIOD;
  hsdram.Init.ReadBurst          = FMC_SDRAM_RBURST_DISABLE;
  hsdram.Init.ReadPipeDelay      = FMC_SDRAM_RPIPE_DELAY_1;
  
  /* Initialize the SDRAM controller */
  if(HAL_SDRAM_Init(&hsdram, &SDRAM_Timing) == HAL_OK)
  {
    /* Initialization Error */
    sdramstatus=SDRAM_OK;
  }
  
        /* Program the SDRAM external device */
        //  BSP_SDRAM_Initialization_Sequence(&hsdram, &command);  
        SDRAM_Initialization_Sequence(&hsdram, &command);  
  
  return sdramstatus;
}

使用特权

评论回复
14
苏山人家| | 2015-2-27 09:31 | 只看该作者
make

使用特权

评论回复
15
everbright|  楼主 | 2015-2-27 11:24 | 只看该作者
既然SDRAM速度不够了,只能降低显示图像的质量了,先这样定义,凑和用800*600*60HZ的SVGA吧;
#define COLOR_CONVERSION_0 GUICC_M565         //为了显示16位图,这里定义为这种模式了
#define DISPLAY_DRIVER_0   GUIDRV_LIN_16

原来的定义,不行了
#define COLOR_CONVERSION_0 GUICC_M8888I
#define DISPLAY_DRIVER_0   GUIDRV_LIN_32

我的SDRAM的接法是16位的,改为32位会变好.但如果不改的话,从程序上不知道有没有办法.期待各位支招...

使用特权

评论回复
16
gampt| | 2015-2-27 11:29 | 只看该作者
mark

使用特权

评论回复
17
搞IT的| | 2015-2-28 18:19 | 只看该作者
分辨率为800*600的显示屏很常见!!

使用特权

评论回复
18
oayzw| | 2015-3-4 11:21 | 只看该作者
:lol

使用特权

评论回复
19
墨如风0205| | 2015-3-4 15:01 | 只看该作者
mark,谢谢了,学习中

使用特权

评论回复
20
墨如风0205| | 2015-3-12 10:35 | 只看该作者
楼主,我800*600的VGA驱动,屏幕会有小波纹在闪,你的有木有?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:/**************个人信息***********/ //联系人:韩先生, //QQ:243691732 //手机:13933870954 /////////////

21

主题

107

帖子

3

粉丝