当前位置:网站首页>STM32驱动ST7789V2 tft屏幕
STM32驱动ST7789V2 tft屏幕
2022-04-21 13:28:00 【奋斗小鹏】
一 . 简介
本次教程使用的是1.54寸240*240像素的tft屏幕,其接口协议为SPI协议。在使用的过程中仅需要四根数据即可驱动点亮屏幕。然后硬件使用的是STM32F103C8T6核心板,用的是SPI2。一般购买屏幕的话它们会提供对应的例程,直接拿过来修改即可。
欢迎━(`∀´)ノ亻!关注微信公众号 FPGA之旅 获取更多。
二. 屏幕的使用
第一步肯定是引脚初始化,接口是SPI接口,所以也需要对SPI进行初始化(软件模拟SPI时序的话就不需要,硬件SPI需要),如果需要用到DMA进行加速的话,也需要对DMA进行初始化(不用DMA显示一副图片的速度比使用DMA的要慢上几倍,如果不显示图片的话可以不进行初始化)。
- 屏幕引脚介绍:
DC: 写数据后命令控制,1为数据
CS:片选,低电平有效
RES: 控制lCD重启
SDA:SPI的MOSI线
SCK:SPI的时钟线
BLK:控制LCD是否显示,不进行控制的话直接接高电平即可(这里直接接的高电平) - 引脚初始化
这里除了SDA和SCK是SPI信号线需要进行复用之外,其他的都可以当做普通的IO进行初始化即可。查看手册可以知道SPI2的时钟映射到了GPIOB-Pin13,MOSI映射到了GPIOB-Pin15(一下子找不到了 ̄□ ̄||)。对其引脚进行复用初始化即可。 - SPI初始化
这里就直接上代码了
SPI_InitTypeDef SPI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //初始化SPI2端口时钟
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_Init(SPI2,&SPI_InitStructure);
SPI_Cmd(SPI2,ENABLE);
- DMA初始化
需要查看SPI2的Tx是使用的DMA1的那个通道,这个也需要查看手册。如下图,映射到的时候通道5,根据这个就可以进行初始化了。

DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32)&SPI2->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32)buffer; //发送数据的内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //方向为内存到外设
DMA_InitStructure.DMA_BufferSize = 480; //数据大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //每发送一个外设地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //每发送一个内存地址加一
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5,&DMA_InitStructure);
- 然后就是对LCD屏幕的初始化了,也就是配置对应的寄存器。这个可以拿卖家提供的直接拿来用就可以。
这里我们就完成了所有的初始化工作了。
1. 设置数据地址范围
每次发送显示数据的时候,需要设置显示范围,也就是行列的起始值。设置好范围,然后就发送对应大小的数据即可。其显示发送为从左往右,从上到下。

//设置数据显示地址范围
void LCD_Address_Set(uint16 x1,uint16 y1,uint16 x2,uint16 y2)
{
LCD_Write_Cmd(0x2a);//列地址设置
LCD_WriteDisplayData16(x1);
LCD_WriteDisplayData16(x2);
LCD_Write_Cmd(0x2b);//行地址设置
LCD_WriteDisplayData16(y1);
LCD_WriteDisplayData16(y2);
LCD_Write_Cmd(0x2c);//储存器写
}
2. 点亮LCD屏幕
//LCD全亮
void LCDFullOn(uint16 Color)
{
uint16 i,j;
LCD_Address_Set(0,0,LCD_Width-1,LCD_Height-1);
for(i=0;i<LCD_Width;i++)
{
for (j=0;j<LCD_Height;j++)
{
LCD_WriteDisplayData16(Color);
}
}
}
3. 使用DMA搬运数据
- 对设置DMA搬运数据的大小并且使能
//spi2 DMA使能
void SPI2DMA_Enable(void)
{
DMA_Cmd(DMA1_Channel5, DISABLE );
DMA_SetCurrDataCounter(DMA1_Channel5,480); //设置搬运数据的大小
DMA_Cmd(DMA1_Channel5, ENABLE);
}
- 开启DMA请求,且等待发送完成,清除标志位
for(j = 0 ; j< 240 ; j++)
{
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
SPI2DMA_Enable();
while((DMA_GetFlagStatus(DMA1_FLAG_TC5)==RESET)); // 等待dma发送完成
DMA_ClearFlag(DMA1_FLAG_TC5);
}
通过测试,可以明显看到使用DMA进行加速的显示效果要快很多。
版权声明
本文为[奋斗小鹏]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44678052/article/details/124264150
边栏推荐
- SSM高校实验室安全培训系统设计与实现.docx
- Navlinkmatch of blazor's navlink What does prefix do
- 36 day assault Tencent finally took the offer! Redis, high concurrency
- 月销超千万,新防晒时代「蕉下」如何成为爆款制造机?
- Fibonacci sequence
- What are the futures varieties of agricultural products?
- 大才能否小用?OceanBase一体化场景测试
- OJ daily practice - piecewise function
- Which brand of running headphones is good and suitable for sports
- 【数字信号处理】线性常系数差分方程 ( 使用 matlab 求解 “ 线性常系数差分方程 “ 示例 | A 向量分析 | B 向量分析 | 输入序列分析 | matlab 代码 )
猜你喜欢

20210812

Huffman coding

no server suitable for synchronization found

Q:如何论文中附录编号随着正文变化。

大才能否小用?OceanBase一体化场景测试

Detailed explanation of Flink related API development and operation architecture and implementation principle

Netease cloud - Mobile authentication code login

万字干货!帮你深度掌握设计中的「光影」知识点

Flink相关API开发及运行架构和实现原理详解

跑步运动耳机哪个牌子好、适合运动的耳机
随机推荐
动手篇 | 如何在麒麟v10 SP2安装达梦8版本数据库
Communication sliding window
网络通信协议模型
Why does MySQL driver rely on protobuf
Build a service registration and Discovery Center
Wireless network protocol terms
Go language file operation
安装和配置Canal
Meichuang technology was invited to carry out data security training for Haidian District academy of Educational Sciences
AI video cloud vs narrowband HD, who is the darling of the video era
3-4Dom形XSS详解以及演示
Leetcode: countless denominations of coins get the option of amount (DP)
【数字信号处理】相关系数 ( 相关系数概念 | 能量信号与功率信号 | 系统的因果性 )
【数字信号处理】相关系数 ( 相关系数概念解析 | 信号能量常数 | 共轭序列 | 序列在相同时刻的相关性 )
Which brand of running headphones is good and suitable for sports
The return value of [SV] function is a parameterized function of variable matrix
浅析 联邦学习是什么?
OJ daily practice - output new array in reverse order
Read fast RCNN
Wang Baiping: my way to envoy maintainer