打印
[APM32F4]

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

[复制链接]
327|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
上文已经完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_T  SPI_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的驱动工作了。。。

详细请各位看官查阅附件。
APM32F411V-TFT.zip (7.32 MB)

使用特权

评论回复
沙发
lu50211|  楼主 | 2024-5-7 15:30 | 只看该作者
有拍段视频,无奈不知道怎么发出来。。。。
知道怎么操作的朋友,麻烦告知下。

使用特权

评论回复
板凳
yuyy1989| | 2024-5-7 16:19 | 只看该作者
lu50211 发表于 2024-5-7 15:30
有拍段视频,无奈不知道怎么发出来。。。。
知道怎么操作的朋友,麻烦告知下。 ...

时间短就转成GIF图片传上来,时间长就上传到B站再把链接贴过来

使用特权

评论回复
评论
lu50211 2024-5-8 08:24 回复TA
感谢解答。。。 时间比较短,我试着转GIF。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

425

帖子

8

粉丝