SPI3+DMA外设驱动-TFTLCD初始化

前言

(1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。

(2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片机开发的同学学习和使用。

学习目标

本章有五个任务:

  1. 了解关于TFTLCD液晶屏的硬件接口
  2. 学习和了解STM32 DMA驱动
  3. TFTLCD液晶屏的硬件接口初始化
  4. LCD液晶初始化
  5. TFTLCD液晶屏代码移植和显示测试

TFTLCD液晶屏硬件电路分析

接口说明:TFTLCD液晶屏是连接到了单片机的SPI3接口。

TFTDIO ---- PB5 SPI3-MOSI 数据发送管脚 SPI硬件控制

TFTCMD---- PB4 SPI3-MISO 数据/指令控制脚

TFTCLK ----- PB3 SPI3-SCK 数据发送时钟脚 SPI硬件控制

CS ------PB6 片选脚位

LEDA_EN— PC10 LCD屏背光控制脚

FTFRES — PA15 LCD复位脚

电路设计说明:

● 硬件电路设计是参考液晶屏官方给的参考资料设计的。基本是按照芯片资料照抄过来即可

● 为了提高液晶屏的刷屏效率,我们选择了SPI3接口。采用单线模式

● DIO CLK 必须固定连接 MOSI SCK ,其他管脚可以连任意IO口

TFTLCD液晶屏初始化

hal_tftlcd.c 代码

#include "hal_tftlcd.h"
#include "stm32F10x.h"
//#include "lcd_font.h"//-----------------LCD端口定义---------------- 
#define LCD_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_3)//SCL=SCLK
#define LCD_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_3)#define LCD_MOSI_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_5)//SDA=MOSI
#define LCD_MOSI_Set() GPIO_SetBits(GPIOB,GPIO_Pin_5)#define LCD_DC_Clr()   GPIO_ResetBits(GPIOB,GPIO_Pin_4)//DC
#define LCD_DC_Set()   GPIO_SetBits(GPIOB,GPIO_Pin_4)#define LCD_CS_Clr()   GPIO_ResetBits(GPIOB,GPIO_Pin_6)//CS
#define LCD_CS_Set()   GPIO_SetBits(GPIOB,GPIO_Pin_6)#define LCD_RES_Clr()  GPIO_ResetBits(GPIOA,GPIO_Pin_15)//RES
#define LCD_RES_Set()  GPIO_SetBits(GPIOA,GPIO_Pin_15)#define LCD_BLK_Clr()  GPIO_ResetBits(GPIOC,GPIO_Pin_10)//BLK
#define LCD_BLK_Set()  GPIO_SetBits(GPIOC,GPIO_Pin_10)void hal_tftlcdConfig(void)
{SPI_InitTypeDef  SPI_InitStructure;GPIO_InitTypeDef  GPIO_InitStructure;DMA_InitTypeDef  DMA_InitStructure;//DMA初始化结构体RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);  //相关IO的初始化GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//RES-PA15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);	  //初始化GPIOAGPIO_SetBits(GPIOA,GPIO_Pin_15);//CMD-PB4//CS-PB6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);	  //初始化GPIOA	GPIO_SetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_6);//BLK-PC10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOC, &GPIO_InitStructure);	  //初始化GPIOA		GPIO_ResetBits(GPIOC,GPIO_Pin_10);//CLK-PB3//MOSI-PB5GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 |GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);	/* SPI3 configuration */ SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; //SPI1设置为单线SPI_InitStructure.SPI_Mode = SPI_Mode_Master;	                     //设置SPI1为主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;	 		                   //串行时钟在不操作时,时钟为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;		                   //第二个时钟沿开始采样数据SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;			                     //NSS信号由软件(使用SSI位)管理SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //定义波特率预分频的值:波特率预分频值为8SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;				         //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;						               //CRC值计算的多项式SPI_Init(SPI3, &SPI_InitStructure);//使能DMA发送DMA_DeInit(DMA2_Channel2); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI3->DR; //数据传输目标地址//数据缓存地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 	//外设作为数据传输的目的地DMA_InitStructure.DMA_BufferSize = 1024;            //发送Buff数据大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置外设地址是否递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;          //设置内存地址是否递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度为8位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;       	//内存数据宽度为8位	DMA_InitStructure.DMA_Mode =   DMA_Mode_Normal;                              //普通缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                        //高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                 //禁止DMA2个内存相互访问DMA_Init(DMA2_Channel2, &DMA_InitStructure);                                 //初始化DMA,SPI在DMA1的通道2SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx,ENABLE);                               /使能SPI2 DMA发送功能*/	SPI_Cmd(SPI3, ENABLE);//使能SPI2
}// SPI3 DMA发送
void DMA_SPI3_TX(unsigned char *buffer,unsigned short len)
{DMA2->IFCR |=(0xf<<4);    //清除通道2上面所有的标志位DMA2_Channel2->CNDTR=len; //设置要传输的数据长度DMA2_Channel2->CMAR=(u32)buffer; //设置RAM缓冲区地址DMA2_Channel2->CCR|=0x1;   ///启动DMAwhile(!(DMA2->ISR&(1<<5)));///等待数据数据传输完成DMA2_Channel2->CCR &=(uint32_t)~0x1;//关闭DMA
}void LCD_Writ_Bus(unsigned char dat) 
{	LCD_CS_Clr();DMA_SPI3_TX(&dat,1);
}/******************************************************************************函数说明:LCD写入数据入口数据:dat 写入的数据返回值:  无
******************************************************************************/
void LCD_WR_DATA8(unsigned char dat)
{LCD_Writ_Bus(dat);
}/******************************************************************************函数说明:LCD写入数据入口数据:dat 写入的数据返回值:  无
******************************************************************************/
void LCD_WR_DATA(unsigned short dat)
{unsigned char d[2];d[0] = dat>>8;d[1] = dat;DMA_SPI3_TX(&d[0],2);
}/******************************************************************************函数说明:LCD写入命令入口数据:dat 写入的命令返回值:  无
******************************************************************************/
void LCD_WR_REG(unsigned char dat)
{LCD_DC_Clr();//写命令LCD_Writ_Bus(dat);LCD_DC_Set();//写数据
}void hal_Oled_Display_on(void)
{LCD_BLK_Set();
}void hal_Oled_Display_off(void)
{LCD_BLK_Clr();
}
///void hal_oled_RestH(void)
{LCD_RES_Set();
}
void hal_oled_RestL(void)
{LCD_RES_Clr();
}

hal_tftlcd.h 代码

#ifndef ____HAL_TFTLCD_H_
#define ____HAL_TFTLCD_H_void hal_tftlcdConfig(void);void LCD_WR_REG(unsigned char dat);
void LCD_WR_DATA8(unsigned char dat);
void LCD_WR_DATA(unsigned short dat);
void DMA_SPI3_TX(unsigned char *buffer,unsigned short len);void hal_Oled_Display_on(void);
void hal_Oled_Display_off(void);
void hal_oled_RestH(void);
void hal_oled_RestL(void);
#endif

代码分析

hal_tftlcd.c 包括

● TFTLCD液晶屏通讯接口初始化

● TFTLCD通过DMA数据发送函数

● TFTLCD液晶屏其他端口控制函数

TFTLCD SP3接口初始化流程

➢ 定义TFTLCD通讯的接口

//-----------------LCD端口定义---------------- 
#define LCD_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_3)//SCL=SCLK
#define LCD_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_3)#define LCD_MOSI_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_5)//SDA=MOSI
#define LCD_MOSI_Set() GPIO_SetBits(GPIOB,GPIO_Pin_5)#define LCD_DC_Clr()   GPIO_ResetBits(GPIOB,GPIO_Pin_4)//DC
#define LCD_DC_Set()   GPIO_SetBits(GPIOB,GPIO_Pin_4)#define LCD_CS_Clr()   GPIO_ResetBits(GPIOB,GPIO_Pin_6)//CS
#define LCD_CS_Set()   GPIO_SetBits(GPIOB,GPIO_Pin_6)#define LCD_RES_Clr()  GPIO_ResetBits(GPIOA,GPIO_Pin_15)//RES
#define LCD_RES_Set()  GPIO_SetBits(GPIOA,GPIO_Pin_15)#define LCD_BLK_Clr()  GPIO_ResetBits(GPIOC,GPIO_Pin_10)//BLK
#define LCD_BLK_Set()  GPIO_SetBits(GPIOC,GPIO_Pin_10)

➢ 打开相关时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);  //相关IO的初始化GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//打开端口重映射,PB3、PB4端口默认的功能不是SPI3,是JTAG,所以要对端口重映射,让它们具备SPI3的功能

➢ 初始化TFTLCD 液晶屏 和SPI3相关的GPIO口

	//CMD-PB4//CS-PB6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);	  //初始化GPIOA	GPIO_SetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_6);//BLK-PC10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOC, &GPIO_InitStructure);	  //初始化GPIOA		GPIO_ResetBits(GPIOC,GPIO_Pin_10);//CLK-PB3//MOSI-PB5GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 |GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);	

➢ 初始化SPI3相关参数

/* SPI3 configuration */ 
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; //SPI1设置为单线
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;	                     //设置SPI1为主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;	  //串行时钟在不操作时,时钟为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;		 //第二个时钟沿开始采样数据
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;	 //NSS信号由软件(使用SSI位)管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //定义波特率预分频的值:波特率预分频值为8
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7;			 //CRC值计算的多项式
SPI_Init(SPI3, &SPI_InitStructure);

➢ 配置SPI3 DMA功能。

DMA介绍:

直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

总之,当我们的功能中涉及数据传输功能时,例如ADC、DMA、USART等,为了使数据传输更快,可以在数据传输中加上DMA功能,使能DMA发送或接收。

DMA1 各个通道对应表:

DMA2 各个通道对应表:

我们项目用到是DMA2的发送功能,因为我们只需要对TFTLCD显示屏发送数据。

//使能DMA发送
DMA_DeInit(DMA2_Channel2); 
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI3->DR; //数据传输目标地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 	数据传输方向,从内存读取发送到外设
DMA_InitStructure.DMA_BufferSize = 1024;            //发送Buff数据大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置外设地址是否递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //设置内存地址是否递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度为8位	DMA_InitStructure.DMA_Mode =   DMA_Mode_Normal;                         //普通缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                        //高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;            //禁止DMA2个内存相互访问
DMA_Init(DMA2_Channel2, &DMA_InitStructure);        //初始化DMA,SPI在DMA1的通道2SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx,ENABLE); /使能SPI2 DMA发送功能*/	
SPI_Cmd(SPI3, ENABLE);//使能SPI2
SPI3 DMA 数据发送函数
// SPI3 DMA发送
void DMA_SPI3_TX(unsigned char *buffer,unsigned short len)
{DMA2->IFCR |=(0xf<<4);    //清除通道2上面所有的标志位DMA2_Channel2->CNDTR=len; //设置要传输的数据长度DMA2_Channel2->CMAR=(u32)buffer; //设置RAM缓冲区地址DMA2_Channel2->CCR|=0x1;   ///启动DMAwhile(!(DMA2->ISR&(1<<5))) ; ///等待数据数据传输完成DMA2_Channel2->CCR &=(uint32_t)~0x1;//关闭DMA
}
void LCD_Writ_Bus(unsigned char dat) 
{	LCD_CS_Clr();DMA_SPI3_TX(&dat,1);
}
其他LCD脚位控制函数
void hal_Oled_Display_on(void)
{LCD_BLK_Set();
}void hal_Oled_Display_off(void)
{LCD_BLK_Clr();
}void hal_oled_RestH(void)
{LCD_RES_Set();
}
void hal_oled_RestL(void)
{LCD_RES_Clr();
}
LCD指令和数据发送函数
/******************************************************************************函数说明:LCD写入数据入口数据:dat 写入的数据返回值:  无
******************************************************************************/
void LCD_WR_DATA8(unsigned char dat)
{DMA_SPI3_TX(dat);
}/******************************************************************************函数说明:LCD写入数据入口数据:dat 写入的数据返回值:  无
******************************************************************************/
void LCD_WR_DATA(unsigned short dat)
{unsigned char d[2];d[0] = dat>>8;d[1] = dat;DMA_SPI3_TX(&d[0],2);
}/******************************************************************************函数说明:LCD写入命令入口数据:dat 写入的命令返回值:  无
******************************************************************************/
void LCD_WR_REG(unsigned char dat)
{LCD_DC_Clr();//写命令LCD_Writ_Bus(dat);LCD_DC_Set();//写数据
}

以上内容都是hal_tftlcd.c 和hal_tftlcd.h文件内容,都是有关于stm32外设 DMA SPI3 的初始化的函数.

以下内容将会是mt_tftlcd.c 和mt_tftlcd.h文件内容,都是有关于模块 LCD屏幕 的初始化内容,LCD屏幕模块的初始化都是基于stm32外设初始化的函数写的,所以模块的初始化函数都是调用外设初始化函数组合而成的,底层就是stm32外设的初始化函数,模块的初始化函数和代码,相对来说是应用层代码。所以,mt文件中是应用层驱动代码,hal文件中是底层驱动代码。

LCD屏幕初始化和LCD填充函数

LCD驱动和LCD相关其他驱动函数,我们直接从官方参考的例程移植过来使用即可,不需要自己深入的研究。

void mt_tftlcd_init(void);

LCD_Fill(unsigned short xsta,unsigned short ysta,unsigned short xend,unsigned short yend,unsigned short color);

注意:不论是底层驱动代码还是应用层驱动代码,都是基于配置STM32寄存器写的程序,不要求深入研究,会调用即可;应用层驱动程序是基于底层驱动程序编程的。

mt_tftlcd.c代码

#include "mt_Tftlcd.h"
#include "hal_tftlcd.h"static void hal_tftlcd_Delay(unsigned int de);
unsigned char ColorBuf[640];void mt_tftlcd_init(void)
{hal_tftlcdConfig();//初始化GPIOhal_tftlcd_Delay(10000);hal_oled_RestL();//复位hal_tftlcd_Delay(10000);hal_oled_RestH();hal_tftlcd_Delay(100);//************* Start Initial Sequence **********//LCD_WR_REG(0x11);hal_tftlcd_Delay(10000);//delay_ms(100); //Delay 120msLCD_WR_REG(0X36);// Memory Access Controlif(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);else LCD_WR_DATA8(0xA0);LCD_WR_REG(0X3A);// LCD_WR_DATA8(0X03);   //12bitLCD_WR_DATA8(0X05);  //--------------------------------ST7789S Frame rate setting-------------------------LCD_WR_REG(0xb2);LCD_WR_DATA8(0x0c);LCD_WR_DATA8(0x0c);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x33);LCD_WR_DATA8(0x33);LCD_WR_REG(0xb7);LCD_WR_DATA8(0x35);//---------------------------------ST7789S Power setting-----------------------------LCD_WR_REG(0xbb);LCD_WR_DATA8(0x35);LCD_WR_REG(0xc0);LCD_WR_DATA8(0x2c);LCD_WR_REG(0xc2);LCD_WR_DATA8(0x01);LCD_WR_REG(0xc3);LCD_WR_DATA8(0x13);LCD_WR_REG(0xc4);LCD_WR_DATA8(0x20);LCD_WR_REG(0xc6);LCD_WR_DATA8(0x0f);LCD_WR_REG(0xca);LCD_WR_DATA8(0x0f);LCD_WR_REG(0xc8);LCD_WR_DATA8(0x08);LCD_WR_REG(0x55);LCD_WR_DATA8(0x90);LCD_WR_REG(0xd0);LCD_WR_DATA8(0xa4);LCD_WR_DATA8(0xa1);//--------------------------------ST7789S gamma setting------------------------------LCD_WR_REG(0xe0);LCD_WR_DATA8(0xd0);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x06);LCD_WR_DATA8(0x09);LCD_WR_DATA8(0x0b);LCD_WR_DATA8(0x2a);LCD_WR_DATA8(0x3c);LCD_WR_DATA8(0x55);LCD_WR_DATA8(0x4b);LCD_WR_DATA8(0x08);LCD_WR_DATA8(0x16);LCD_WR_DATA8(0x14);LCD_WR_DATA8(0x19);LCD_WR_DATA8(0x20);LCD_WR_REG(0xe1);LCD_WR_DATA8(0xd0);LCD_WR_DATA8(0x00);LCD_WR_DATA8(0x06);LCD_WR_DATA8(0x09);LCD_WR_DATA8(0x0b);LCD_WR_DATA8(0x29);LCD_WR_DATA8(0x36);LCD_WR_DATA8(0x54);LCD_WR_DATA8(0x4b);LCD_WR_DATA8(0x0d);LCD_WR_DATA8(0x16);LCD_WR_DATA8(0x14);LCD_WR_DATA8(0x21);LCD_WR_DATA8(0x20);LCD_WR_REG(0x29);hal_Oled_Display_on();//打开背光LCD_Fill(0,0,LCD_W,LCD_H,RED);
} /******************************************************************************函数说明:设置起始和结束地址入口数据:x1,x2 设置列的起始和结束地址y1,y2 设置行的起始和结束地址返回值:  无
******************************************************************************/
void LCD_Address_Set(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2)
{LCD_WR_REG(0x2a);//列地址设置LCD_WR_DATA(x1+2);LCD_WR_DATA(x2+2);LCD_WR_REG(0x2b);//行地址设置LCD_WR_DATA(y1+1);LCD_WR_DATA(y2+1);LCD_WR_REG(0x2c);//储存器写
}static void hal_tftlcd_Delay(unsigned int de)
{while(de--);
}void LCD_Fill(unsigned short xsta,unsigned short ysta,unsigned short xend,unsigned short yend,unsigned short color)
{          unsigned short i; LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围for(i=0;i<xend;i++){ColorBuf[i++] = color>>8;ColorBuf[i] = color;}for(i=ysta;i<yend*2;i++){		DMA_SPI3_TX(ColorBuf,xend);}	
}

mt_Tftlcd.h代码

#ifndef ____MT_TFTLCD_H_
#define ____MT_TFTLCD_H_#define USE_HORIZONTAL 3  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏#if USE_HORIZONTAL==0||USE_HORIZONTAL==1#define LCD_W 240
#define LCD_H 320#else
#define LCD_W 320
#define LCD_H 240
#endif///RGB565
#define WHITE         	 0xFFFF
#define BLACK         	 0x0000	  
#define BLUE           	 0x001F  
#define BRED                  0XF81F
#define GRED 		 0XFFE0
#define GBLUE	         0X07FF
#define RED           	         0xF800
#define MAGENTA       	 0xF81F
#define GREEN         	 0x07E0
#define CYAN          	 0x7FFF
#define YELLOW        	 0xFFE0
#define BROWN 			     0XBC40 //棕色
#define BRRED 			     0XFC07 //棕红色
#define GRAY  			     0X8430 //灰色
#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色  
#define GRAYBLUE       	 0X5458 //灰蓝色
#define LIGHTGREEN     	 0X841F //浅绿色
#define LGRAY 			     0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)enum
{FORTSIZE_12 = 12,FORTSIZE_16 = 16,	FORTSIZE_24 = 24,FORTSIZE_32 = 32,	FORTSIZE_48 = 48,	
};#define HUE_LCD_FONT     WHITE
#define HUE_LCD_BACK     BLACK//YELLOW  //BLACK//
#define HUE_FONT_BACK    GRAYvoid mt_tftlcd_init(void);
void LCD_Fill(unsigned short xsta,unsigned short ysta,unsigned short xend,unsigned short yend,unsigned short color);
#endif

功能测试验证

LCD屏幕全屏显示黄色,表示驱动完成OK。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内网隧道代理技术(二十)之 CS使用HTTP代理上线不出网机器

CS使用HTTP代理上线不出网机器 CS工具自带上线不出网机器 如图A区域存在一台中转机器,这台机器可以出网,这种是最常见的情况。我们在渗透测试的过程中经常是拿下一台边缘机器,其有多块网卡,边缘机器可以访问内网机器,内网机器都不出网。这种情况下拿这个边缘机器做中转,…

VsCode搭建Java开发环境 vscode搭建java开发环境 vscode springboot 搭建springboot

VsCode搭建Java开发环境 vscode搭建java开发环境 vscode springboot 搭建springboot VsCode java开发截图1、安装Java 环境相关插件2、安装 Spring 插件3、安装 Mybatis 插件第一个 vsc-mybatis第二个 mybatisX 4、安装Maven环境4.1、安装Maven环境4.2、VsCode配置Maven环境 5、…

视频汇聚/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?

开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

Java异常处理

Java内置了一套异常处理机制&#xff0c;总是使用异常来表示错误。一个健壮的程序必须处理各种各样的错误。所谓错误&#xff0c;就是程序调用某个函数的时候&#xff0c;如果失败了&#xff0c;就表示出错 异常是一种class&#xff0c;因此它本身带有类型信息。异常可以在任何…

Flutter Web 项目网络请求报 XMLHttpRequest error 解决方案

使用http库进行简单的网络请求时&#xff0c;运行在Chrome浏览器上&#xff0c;网络请求一直报错 XMLHttpRequest error&#xff0c;而在iOS 模拟器上运行则正常&#xff0c;后面在postman上发送请求&#xff0c;也是正常的。这就是很尴尬了&#xff01;&#xff01;&#xff0…

【计算机基础】Git从安装到使用,详细每一步!扩展Github\Gitlab

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

np.numpy, np.reshape, np.cumsum方法速查

1 np.numpy() 创建一个数组 state[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]] state2np.array(state) print(state) print(state2)[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] [[ 1 2 3 4 5] [ 6 7 8 9 10] [11 12 13 14 15]] 2 np.reshape() 常用于矩阵规…

《Go 语言第一课》课程学习笔记(十三)

方法 认识 Go 方法 Go 语言从设计伊始&#xff0c;就不支持经典的面向对象语法元素&#xff0c;比如类、对象、继承&#xff0c;等等&#xff0c;但 Go 语言仍保留了名为“方法&#xff08;method&#xff09;”的语法元素。当然&#xff0c;Go 语言中的方法和面向对象中的方…

【CSS 画个梯形】

使用clip-path: polygon画梯形 clip-path: polygon使用方式如下&#xff1a; 效果实现 clip-path: polygon 是CSS的属性之一&#xff0c;用于裁剪元素的形状。它可以通过定义一个具有多边形顶点坐标的值来创建一个多边形的裁剪区域&#xff0c;从而实现元素的非矩形裁剪效果。…

C++ - 继承

继承的概念 继承机制是面向对象程序设计当中&#xff0c;非常重要且好用的手段&#xff0c;这种手段可以允许程序员在原有的类的特性基础之上&#xff0c;进行拓展从而产生新的类&#xff0c;这些新产生的类&#xff0c;我们成为派生类。在以前&#xff0c;我们实现的复用是函数…

从零开发JavaWeb入门项目--十天掌握

原文网址&#xff1a;从零开发JavaWeb入门项目--十天掌握_IT利刃出鞘的博客-CSDN博客 简介 这是一个靠谱的JavaWeb入门项目实战&#xff0c;名字叫蚂蚁爱购。从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目&#xff0c;教程路线是&#xff1a;搭…

Docker私有镜像仓库(Harbor)安装

Docker私有镜像仓库(Harbor)安装 1、什么是Harbor Harbor是类似与DockerHub 一样的镜像仓库。Harbor是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。Docker容器应用的…

transformer源码

1.传统RNN网络 每一层都需要上一层执行完才能执行 1.1 自注意力 在一句话中找到it_指代的是什么&#xff0c;它的上下文语境是什么&#xff1f; self-attetion计算 1.2 multi-header机制 1.3 堆叠多层self-attention&#xff0c;相当于再一次卷积 1.4 位置信息编码 1.5 残…

K8S容器OOM killed排查

背景 数据服务平台南海容器k8s设置的内存上限2GB&#xff0c;多次容器被OOM killed。 启动命令 java -XX:MaxRAMPercentage70.0 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/apps/logs/ ***.jar排查过程 1 当收到实例内存超过95%告警时&#xff0c;把jvm进程堆dump下…

Data Rescue Professional for Mac:专业的数据恢复工具

在数字化时代&#xff0c;我们的生活和工作离不开电脑和存储设备。但是&#xff0c;意外情况时常发生&#xff0c;例如误删除文件、格式化硬盘、病毒攻击等&#xff0c;这些都可能导致重要的数据丢失。面对数据丢失&#xff0c;我们迫切需要一款可靠的数据恢复工具。今天&#…

YOLOv8目标检测实战:TensorRT加速部署(视频教程)

课程链接&#xff1a;https://edu.csdn.net/course/detail/38956 PyTorch版的YOLOv8是先进的高性能实时目标检测方法。 TensorRT是针对英伟达GPU的加速工具。 本课程讲述如何使用TensorRT对YOLOv8目标检测进行加速和部署。 •采用改进后的tensorrtx/yolov8的代码&#xff0c;…

全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”

糖尿病是全球高发慢性病中患病人数增长最快的疾病&#xff0c;是导致心血管疾病、失明、肾衰竭以及截肢等重大疾病的主要病因之一。目前中国有近1.4亿成人糖尿病患者&#xff0c;科学的血糖监测和健康管理对于糖尿病患者来说至关重要。 在9月1日全民健康生活方式行动日前夕&am…

Homebrew下载安装及使用教程

Homebrew是什么&#xff1f; 简单来说&#xff0c;就是用命令行的形式去管理mac系统的包或软件。 安装命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"国内请使用镜像源进行下载 执行上述命令后会要求输入…

工具分享 | PDF文档解析工具PyMuPDF

1 需求描述 最近工作需要从PDF文档中按照章节解析出对应的文本和图片(后续可能还会有表格)&#xff0c;经过调研&#xff0c;找到了一个功能强大的解析工具MuPDF&#xff0c;对应的Python包是PyMuPDF。本篇博客记录使用它来实现具体功能。 官方文档&#xff1a;https://pymupd…

JavaScript 生成 16: 9 宽高比

这篇文章只是对 for 循环一个简单应用&#xff0c;没有什么知识含量。 可以跳过这篇文章。 只是我用来保存一下我的代码&#xff0c;保存在本地我嫌碍眼&#xff0c;总想把他删了。 正文部分 公式&#xff1a;其中 width 表示宽度&#xff0c;height 表示高度 16 9 w i d t…