【TFT彩屏移植】STM32F4移植1.8寸TFT彩屏简明教程

目录

一.移植说明

二.移植

1.例程

        物理接口:

        延时函数:

         底层驱动文件:

        GUI界面文件:

        测试demo:

2.移植至F4

创建工程:

        调试接口选择SW:

        RCC中HSE选择外部晶振:

        GPIO配置不变:

        时钟树暂时仍固定72MHz:

导入文件:

修改文件:

前置:

!Lcd_Driver.h文件!

Lcd_Driver.c文件

GUI.h文件

GUI.c文件

GUITFT_demo.c文件

 向主函数中添加驱动文件

三.测试


一.移植说明

        笔者最近为了学习LVGL需要一块显示屏,由于选择了STM32F407VET6这款芯片来作为搭建框架的主要平台,于是需要移植一块显示屏到F4上。正好笔者手上有一块1.8寸TFT彩屏,便进行移植。

        笔者的这块屏幕是1.8寸 128*160 RGB,驱动为ST7735的TFT屏,如下:

二.移植

1.例程

        首先找厂家要了例程,例程里是F1的驱动程序:

        物理接口:

        可见例程为软件SPI驱动。

        延时函数:

#include "stm32f10x.h"
#include "delay.h" 
static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
	SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟
	fac_us=SYSCLK/8;//HCLK/8		    
	fac_ms=(u16)fac_us*1000;
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864 
void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           //清空计数器
	SysTick->CTRL=0x01 ;          //开始倒数  
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL=0x00;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	  	    
}   
//延时nus
//nus为要延时的us数.		    								   
void delay_us(u32 nus)
{		
	u32 temp;	    	 
	SysTick->LOAD=nus*fac_us; //时间加载	  		 
	SysTick->VAL=0x00;        //清空计数器
	SysTick->CTRL=0x01 ;      //开始倒数 	 
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL=0x00;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	 
}

这个延时函数是很经典的写法,详解可见:【总结】单片机重点知识总结记录(存储管理+STM32滴答定时器)-CSDN博客

         底层驱动文件:

这个文件包含GPIO初始化以及软件SPI时序的实现。

        GUI界面文件:

主要是实现UI界面的功能函数。

        测试demo:

2.移植至F4

创建工程:

        笔者选择使用CubeMX创建工程,Hal库开发:

        调试接口选择SW:

        RCC中HSE选择外部晶振:

        GPIO配置不变:

        时钟树暂时仍固定72MHz:

然后生成工程即可。

导入文件:

在工程文件夹中创建一个LCD文件夹复制例程文件至此:

头文件路径添加LCD文件夹:

修改文件:

前置:

向所有.h文件(用了u8,u16,u32的)中添加以下定义:

#ifndef u8
#define u8 uint8_t
#endif

#ifndef u16
#define u16 uint16_t
#endif

#ifndef u32
#define u32 uint32_t
#endif
!Lcd_Driver.h文件!

这个文件很重要。

添加#include "stdint.h"头文件,并

将以上宏定义都改为:

//液晶控制口置1操作语句宏定义

#define	LCD_SCL_SET  	LCD_CTRLA->BSRR=LCD_SCL     
#define	LCD_SDA_SET  	LCD_CTRLA->BSRR=LCD_SDA    
#define	LCD_CS_SET  	LCD_CTRLA->BSRR=LCD_CS 
    
#define	LCD_LED_SET  	LCD_CTRLB->BSRR=LCD_LED   
#define	LCD_RS_SET  	LCD_CTRLB->BSRR=LCD_RS 
#define	LCD_RST_SET  	LCD_CTRLB->BSRR=LCD_RST
//液晶控制口置0操作语句宏定义

#define	LCD_SCL_CLR  	LCD_CTRLA->BSRR = (uint32_t)LCD_SCL << 16U  
#define	LCD_SDA_CLR  	LCD_CTRLA->BSRR = (uint32_t)LCD_SDA << 16U   
#define	LCD_CS_CLR  	LCD_CTRLA->BSRR = (uint32_t)LCD_CS << 16U  
                        
#define	LCD_LED_CLR  	LCD_CTRLB->BSRR = (uint32_t)LCD_LED << 16U    
#define	LCD_RST_CLR  	LCD_CTRLB->BSRR = (uint32_t)LCD_RST << 16U    
#define	LCD_RS_CLR  	LCD_CTRLB->BSRR = (uint32_t)LCD_RS << 16U

至于原因在这里不过多赘述,详情参考:【总结】单片机重点知识总结记录(存储管理+STM32滴答定时器)-CSDN博客

Lcd_Driver.c文件

中添加F4的头文件,去掉delay.h;初始化函数可以全部注释掉(因为我们已经在CubeMX中配置过相应的GPIO了);同时把文件中所有delay_ms()改成相应的HAL_Delay():

GUI.h文件

添加#include "stdint.h"

GUI.c文件

添加F4头文件,并替换延时函数为HAL_Delay():

GUITFT_demo.c文件

添加头文件,并修改延时函数,同时所有的测试字符串使用强制转换为指针类型,如下:

 向主函数中添加驱动文件

三.测试

在主函数中添加demo函数测试:

while (1)
  {
		QDTFT_Test_Demo();
	  
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 编译下载:

 !!!成功!!!

`#define SPI_MOSI_SET LCD_CTRL->BSRR = SPI_MOSI` 这段代码看起来像是用于控制 LCD 显示控制器的一个宏定义。在这里我们关注的是如何通过改变寄存器内容来设置 MOSI (Master Shift Out) 线的状态。 在微控制器(如基于 ARM 的系统、基于 PIC 的系统等)的编程中,寄存器是存储关键信息的地方,比如 GPIO(通用输入/输出)配置、定时器值或 I/O 控制。`LCD_CTRL` 很可能是包含一系列寄存器地址或功能块的结构体或指针,而 `BSRR` 可能是指向一个位设置寄存器(Bit Set Register)的位置,在这个寄存器中,我们可以设置特定的比特位来启用或者禁用电路的功能。 这里的 `SPI_MOSI` 是一个操作符,表示想要设置 MOSI 引脚的状态。通常,在串行外围接口(SPI)通信中,MOSI 引脚作为主设备的数据输出线,这意味着主设备可以将数据发送到从设备上。因此,`SPI_MOSI_SET` 宏实际上代表了对 MOSI 引脚进行操作的过程,使其处于所需的状态(通常是开启状态,即数据开始传输)。 宏定义 `#define` 允许程序员将长的表达式、复杂的代码段或者频繁使用的字符串替换为较短的标识符。在这个例子中,它使得编写 `LCD_CTRL->BSRR = SPI_MOSI` 成为更简洁的方式,并且可能还有一些额外的预处理指令会自动执行,例如优化、警告检查或其他预处理器特定的行为。 以下是相关的提问: -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五羟基己醛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值