倔强青铜铜 2025-01-18 17:48 采纳率: 76.5%
浏览 13
已结题

stm32和彩屏的例程非要加上LED代码才能正常显示

为什么这个例程没了led部分的代码就没办法实现了呀?我用的是stm32f103c8t6,显示屏是1.44tft彩屏,看代码LED也没啥特别的呀,但是如果注释掉主函数里那两行LED代码就会白屏

int main(void)
{
    float t=0;
    delay_init();
    LED_Init();//LED初始化
    LCD_Init();//LCD初始化
    LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
    LED=0;
    
    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;
        LCD_ShowPicture(65,80,40,40,gImage_1);
    }
}

LED.c

void LED_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);     //使能A端口时钟
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;     
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
     GPIO_Init(GPIOC, &GPIO_InitStructure);      //初始化GPIOA
     GPIO_SetBits(GPIOC,GPIO_Pin_13);
}


LED.h

#ifndef __LED_H
#define __LED_H

#include "sys.h"



#define LED PCout(13)    // PA15

void LED_Init(void);


#endif


  • 写回答

2条回答 默认 最新

  • GISer Liu 2025-01-18 18:24
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    用户在STM32F103C8T6微控制器上使用1.44寸TFT彩屏时,发现如果注释掉主函数中的LED初始化代码(LED_Init())和LED控制代码(LED=0;),彩屏就会白屏,无法正常显示内容。用户认为LED代码与彩屏显示没有直接关系,但实际运行结果却表明LED代码对彩屏显示有影响。

    问题定位

    1. LED初始化代码的作用:在LED_Init()函数中,除了初始化LED引脚外,还进行了以下操作:

      • 使能了GPIOC端口的时钟。
      • 配置了GPIOC的Pin13为推挽输出模式。
      • 使用了GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);,这行代码禁用了JTAG调试接口,释放了相关的引脚。
    2. JTAG引脚与彩屏的关系:STM32F103C8T6的JTAG调试接口占用了部分GPIO引脚(如PA15、PB3、PB4等)。如果这些引脚被JTAG占用,而彩屏的驱动电路恰好使用了这些引脚,那么彩屏将无法正常工作。

    3. LED代码的影响LED_Init()函数中的GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);这行代码禁用了JTAG接口,释放了PA15、PB3、PB4等引脚,使得这些引脚可以被彩屏驱动电路正常使用。如果注释掉这行代码,JTAG接口仍然占用这些引脚,导致彩屏无法正常工作。

    解决方案

    1. 保留LED初始化代码:最简单的方法是保留LED_Init()函数中的代码,特别是GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);这行代码,以确保JTAG接口被禁用,相关引脚可以被彩屏驱动电路使用。

    2. 单独禁用JTAG接口:如果不想保留LED初始化代码,可以单独添加代码来禁用JTAG接口,释放相关引脚。具体代码如下:

    void DisableJTAG(void)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  // 使能AFIO时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  // 禁用JTAG,释放PA15、PB3、PB4
    }
    

    然后在main()函数中调用DisableJTAG()函数:

    int main(void)
    {
        float t = 0;
        delay_init();
        DisableJTAG();  // 禁用JTAG接口
        LCD_Init();  // LCD初始化
        LCD_Fill(0, 0, LCD_W, LCD_H, WHITE);
    
        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;
            LCD_ShowPicture(65, 80, 40, 40, gImage_1);
        }
    }
    

    总结

    问题的根本原因是JTAG接口占用了部分GPIO引脚,导致彩屏无法正常工作。通过禁用JTAG接口,可以释放这些引脚,使彩屏能够正常显示。用户可以选择保留LED初始化代码,或者单独添加代码来禁用JTAG接口。

    参考代码

    // main.c
    #include "stm32f10x.h"
    #include "delay.h"
    #include "lcd.h"
    #include "led.h"
    
    void DisableJTAG(void)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  // 使能AFIO时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  // 禁用JTAG,释放PA15、PB3、PB4
    }
    
    int main(void)
    {
        float t = 0;
        delay_init();
        DisableJTAG();  // 禁用JTAG接口
        LCD_Init();  // LCD初始化
        LCD_Fill(0, 0, LCD_W, LCD_H, WHITE);
    
        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;
            LCD_ShowPicture(65, 80, 40, 40, gImage_1);
        }
    }
    

    通过以上修改,用户可以注释掉LED相关的代码,同时确保彩屏能够正常显示。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

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

报告相同问题?

问题事件

  • 系统已结题 1月26日
  • 已采纳回答 1月18日
  • 创建了问题 1月18日