倔强青铜铜 2025-01-19 11:06 采纳率: 76.5%
浏览 21
已结题

stm32和tft彩屏注释掉delay就白屏

为什么注释掉delay_init就白屏
主函数

    float t=0;
//    delay_init();
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);     //使能A端口时钟
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
    //LED_Init();//LED初始化
    LCD_Init();//LCD初始化
    LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
    
    
    GPIO_InitTypeDef  GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //使能A端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;     
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
     GPIO_Init(GPIOA, &GPIO_InitStructure);      //初始化GPIOA

    while(1)
    {
        LCD_ShowChinese(0,0,"中景园电子",RED,WHITE,24,0);
        LCD_ShowString(24,30,"LCD_W:",RED,WHITE,16,0);
        LCD_ShowIntNum(72,30,LCD_W,3,RED,WHITE,16);
        LCD_ShowString(24,50,"LCD_H:",RED,WHITE,16,0);
        LCD_ShowIntNum(72,50,LCD_H,3,RED,WHITE,16);
        LCD_ShowFloatNum1(20,80,t,4,RED,WHITE,16);
        t+=0.11;
        if (GPIO_ReadInputDataBit (GPIOA,GPIO_Pin_7 )==0)
        {
            delay_ms (20);
            
            while(GPIO_ReadInputDataBit (GPIOA,GPIO_Pin_7 ));
            delay_ms (20);
            LCD_ShowPicture(65,80,40,40,gImage_1);
        }
    }

delay函数

void delay_init()     
{

#ifdef OS_CRITICAL_METHOD     //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
    u32 reload;
#endif
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    //选择外部时钟  HCLK/8
    fac_us=SystemCoreClock/8000000;    //为系统时钟的1/8  
     
#ifdef OS_CRITICAL_METHOD     //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
    reload=SystemCoreClock/8000000;        //每秒钟的计数次数 单位为K       
    reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出时间
                            //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右    
    fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延时的最少单位       
    SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;       //开启SYSTICK中断
    SysTick->LOAD=reload;     //每1/OS_TICKS_PER_SEC秒中断一次    
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;       //开启SYSTICK    
#else
    fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
#endif
}    

  • 写回答

2条回答 默认 最新

  • FFMXjy 2025-01-21 22:41
    关注

    我来解答为什么在 STM32 和 TFT 彩屏程序中注释掉 delay_init() 会导致白屏的问题:

    主要原因:

    1. 时序问题:
    • TFT 显示屏的初始化过程需要严格的时序控制
    • 每条命令之间需要适当的延时来确保命令被正确执行
    • 没有延时函数会导致时序紊乱,显示屏无法正常初始化
    1. 初始化序列:
    • TFT 显示屏上电后需要一系列初始化命令
    • 这些命令包括复位、配置显示模式、设置时钟等
    • 每个步骤都需要特定的延时来确保稳定

    解决方案:

    1. 保留 delay_init() 初始化:

      delay_init();  // 不要注释此行
      
    2. 确保关键位置有适当延时:

      // 显示屏初始化示例
      LCD_Reset();      // 复位
      delay_ms(100);    // 复位后延时
      LCD_Init();       // 初始化配置
      delay_ms(50);     // 初始化后延时
      
    3. 如果必须去掉 delay_init(),可以:

    • 使用其他延时函数替代
    • 确保有其他时序控制机制
    • 使用硬件定时器实现延时

    建议:

    1. 查看显示屏数据手册中的时序要求
    2. 保留必要的延时函数
    3. 确保初始化过程中的关键延时
    4. 不要随意删除时序相关的代码

    总结:
    delay_init() 和相关延时函数对于 TFT 显示屏的正常工作非常重要,建议保留这些时序控制代码。如果必须修改,需要确保有替代方案来满足显示屏的时序要求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月1日
  • 已采纳回答 2月1日
  • 创建了问题 1月19日