上文已经完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)
|
打赏榜单
Gfan 打赏了 50.00 元 2024-07-17 理由:F411V Tiny测评活动优质测评帖
共1人点赞
|