lu50211 发表于 2024-5-7 15:27

【APM32F411V开发板测评】+ 硬件SPI驱动1.54 IPS TFT

上文已经完UART更新外置FLASH中的图片数据,那么今天开始驱动TFT屏了。
外接一块ST7789 驱动芯片的TFT屏,使用自带的硬件SPI驱动来驱动,接的单片机PA5和PA7,还需要RESET,DC,CS,背光源共6只引脚。
PA5和PA7,还需要RESET,DC,CS,背光源共6只引脚。
目前手上现有的TFT屏是中景园的,已经做成小模块了

按以下引脚接好电路:
PA5   -> SPI_SCK   
PA7   -> SPI_MOSI
PE7   -> RESET
PE8   ->DC
PE9   ->CS
PE10->背光源

硬件接好后就可以调试程序了
借用上次工程,并增加TFT驱动文件

初始化SPI
void SPI1_Init(void)
{
        GPIO_Config_T GPIO_InitStructure;

        RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);//使能GPIO时钟
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);//使能系统配置控制器时钟
   
    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_5, GPIO_AF_SPI1);// Config SPI1 PinAF
    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_7, GPIO_AF_SPI1);// Config SPI1 PinAF

        GPIO_InitStructure.pin = GPIO_PIN_5|GPIO_PIN_7;
    GPIO_InitStructure.mode = GPIO_MODE_AF;       //复用推挽输出
        GPIO_InitStructure.speed = GPIO_SPEED_100MHz;//速度
        GPIO_InitStructure.otype = GPIO_OTYPE_PP;
    GPIO_InitStructure.pupd = GPIO_PUPD_NOPULL;
   
        GPIO_Config(GPIOA, &GPIO_InitStructure); //初始化GPIOA
    GPIO_SetBit(GPIOA,GPIO_PIN_5|GPIO_PIN_7);
   
    SPI_Config_TSPI_InitStructure;
   
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);//使能SPI1时钟
   
    SPI_ConfigStructInit(&SPI_InitStructure);

        SPI_InitStructure.direction = SPI_DIRECTION_1LINE_TX;//只发送模式
        SPI_InitStructure.mode = SPI_MODE_MASTER;//设置SPI工作模式:主机模式
        SPI_InitStructure.length = SPI_DATA_LENGTH_8B;//设置SPI数据大小:8位帧结构
        SPI_InitStructure.polarity = SPI_CLKPOL_HIGH;//串行同步时钟空闲时SCLK位高电平
        SPI_InitStructure.phase = SPI_CLKPHA_2EDGE;//串行同步时钟空第二个时钟沿捕获
        SPI_InitStructure.nss = SPI_NSS_SOFT;//NSS信号由硬件管理
        SPI_InitStructure.baudrateDiv = SPI_BAUDRATE_DIV_2;//波特率预分频值:波特率预分频值为4
        SPI_InitStructure.firstBit = SPI_FIRSTBIT_MSB;//数据传输高位先行
        SPI_InitStructure.crcPolynomial = 7;//CRC值计算的多项式
   
        SPI_Config(SPI1,&SPI_InitStructure);//初始化SPI
   
    SPI_DisableCRC(SPI1);
   
        SPI_Enable(SPI1);//使能SPI
}
替换数据发送部分
/******************************************************************************
      函数说明:LCD串行数据写入函数
      入口数据:dat要写入的串行数据
      返回值:无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{       
        LCD_CS_Clr();
    while(SPI_I2S_ReadStatusFlag(SPI1, SPI_FLAG_TXBE) == RESET);//检查接收标志位
        SPI_I2S_TxData(SPI1,dat);
        delay(1);
        LCD_CS_Set();
}
修改TFT相关控制引脚
//-----------------LCD端口定义----------------

#define LCD_RES_Clr()GPIO_ResetBit(GPIOE,GPIO_PIN_7)//RES
#define LCD_RES_Set()GPIO_SetBit(GPIOE,GPIO_PIN_7)

#define LCD_DC_Clr()   GPIO_ResetBit(GPIOE,GPIO_PIN_8)//DC
#define LCD_DC_Set()   GPIO_SetBit(GPIOE,GPIO_PIN_8)
                     
#define LCD_CS_Clr()   GPIO_ResetBit(GPIOE,GPIO_PIN_9)//CS
#define LCD_CS_Set()   GPIO_SetBit(GPIOE,GPIO_PIN_9)

#define LCD_BLK_Clr()GPIO_ResetBit(GPIOE,GPIO_PIN_10)//BLK
#define LCD_BLK_Set()GPIO_SetBit(GPIOE,GPIO_PIN_10)
增加 测试代码

int main(void)
{
    System_TickInit(); //滴答定时
    MyUartInit(115200);//串口通信
    LED_Init();      //LED
    LCD_Init();      //LCD
    LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
    LCD_BLK_Set();//打开背光
   
    while(1)
    {
      /*实时更新*/
                DataDeal_485();
      
      if((base_timer_flag & 0x01) != 0)
      {
            base_timer_flag &= 0xfe;
      }
      if((base_timer_flag & 0x02) != 0)
      {
            base_timer_flag &= 0xfd;
            
            GPIO_ToggleBit(GPIOE,GPIO_PIN_6);
      }
      if((base_timer_flag & 0x04) != 0)
      {
            base_timer_flag &= 0xfb;
            
            if((base_timer_flag & 0x08) != 0)
            {
                base_timer_flag &= 0xF7;
               
                LCD_ShowPicture(0,0,240,240,gImage_2);
            }
            else
            {
                base_timer_flag |= 0x08;
                LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
                LCD_ShowChinese(0,0,"极海电子",RED,WHITE,32,0);
                LCD_ShowString(0,40,"LCD_W:",RED,WHITE,16,0);
                LCD_ShowIntNum(48,40,LCD_W,3,RED,WHITE,16);
                LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
                LCD_ShowIntNum(128,40,LCD_H,3,RED,WHITE,16);
                LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
                LCD_ShowString(0,70,"Increaseing Nun:",RED,WHITE,16,0);
                LCD_ShowFloatNum1(128,70,t,4,RED,WHITE,16);
                t += 0.11;
                for(j=0;j<3;j++)
                {
                  for(i=0;i<6;i++)
                  {
                        LCD_ShowPicture(40*i,120+j*40,40,40,gImage_1);
                  }
                }
            }
            
            GPIO_ToggleBit(GPIOE,GPIO_PIN_5);
      }
    }
}
编译,调试。。。。。

这样就完成TFT的驱动工作了。。。

详细请各位看官查阅附件。


lu50211 发表于 2024-5-7 15:30

有拍段视频,无奈不知道怎么发出来。。。。
知道怎么操作的朋友,麻烦告知下。

yuyy1989 发表于 2024-5-7 16:19

lu50211 发表于 2024-5-7 15:30
有拍段视频,无奈不知道怎么发出来。。。。
知道怎么操作的朋友,麻烦告知下。 ...

时间短就转成GIF图片传上来,时间长就上传到B站再把链接贴过来
页: [1]
查看完整版本: 【APM32F411V开发板测评】+ 硬件SPI驱动1.54 IPS TFT