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

news/2024/12/30 22:37:21/

目录

一.移植说明

二.移植

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 */}

 编译下载:

 !!!成功!!!


http://www.ppmy.cn/news/1539474.html

相关文章

Golang | Leetcode Golang题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; func validIPAddress(queryIP string) string {if sp : strings.Split(queryIP, "."); len(sp) 4 {for _, s : range sp {if len(s) > 1 && s[0] 0 {return "Neither"}if v, err : strconv.Atoi(s); err …

C Programming Basics

1.C语言的基本介绍 Basics of the C Programming Language • C 是一种编程语言&#xff0c;它的发明是为了进行低级别的系统编程工作。C 语言从 B 语言发展而来&#xff0c;是一种非常紧凑(compact)的语言。 • 它是一种通用(general)编程语言&#xff0c;既可以用于系统编程…

Lua 协同程序(coroutine)

Lua 协同程序(coroutine) 概述 Lua 语言以其轻量级和易于嵌入的特点,在游戏开发、脚本编写等领域广受欢迎。Lua 中的协同程序(coroutine)是其并发编程的核心特性之一。协同程序提供了一种不同于多线程的并发执行方式,它允许多个代码段交替执行,而不是同时执行。这种机制…

安卓上的iso 是哪几个gain 相乘

在安卓的相机系统中&#xff0c;ISO 表示感光度&#xff0c;它实际上反映的是图像传感器对光线的整体响应度。ISO 值的调整可以通过增益&#xff08;gain&#xff09;的调节实现&#xff0c;增益会放大传感器采集的信号强度。通常&#xff0c;ISO 是通过以下几种增益相乘得到的…

歌曲怎么去掉原唱只留伴奏?创作无界,轻松获取伴奏音轨

在音乐制作、翻唱或是卡拉OK等场合&#xff0c;我们经常需要歌曲的伴奏版本&#xff0c;即去掉原唱声音&#xff0c;只保留背景音乐的部分。然而&#xff0c;并非每首歌曲都会官方发布伴奏版本&#xff0c;这时我们就需要借助一些技术手段来实现这一目标。本文将介绍几种常见的…

PythonAI 学习大纲

设计一套学习Python在AI方向的入门教程需要涵盖基础知识、编程技能、AI原理、以及具体的AI技术和应用。以下是一个分阶段、模块化的教程大纲&#xff0c;旨在帮助初学者逐步掌握Python在AI领域的应用。 第一阶段&#xff1a;Python基础与编程技能 第1周&#xff1a;Python入门…

【计算机网络】IPv4地址的表示方法

文章目录 概念表示方法网络部分和主机部分子网掩码特殊地址 概念 IPv4&#xff08;Internet Protocol version 4&#xff09;地址是用于标识网络设备的32位数字地址。 表示方法 IPv4地址通常以点分十进制的形式表示&#xff0c;由四个十进制数构成&#xff0c;每个数的取值范…

道路与航线

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int, int> PII; const int N 25e310, M 15e410; const int inf 0x3f3f3f3f; int h[N], e[M], ne[M], idx, w[M]; int id[N], bcnt; vector<int>…