基于STM32 HAL库硬件SPI的ST7789驱动(TFT-LCD 240*320)
点击上方「嵌入式实验基地」,选择「置顶公众号」第一时间查看嵌入式笔记!
在日常开发项目中,显示屏是经常使用的一个部件,显示屏的种类也是多种多样,但对于开发者来说,主要关心的是显示屏所用到的驱动芯片,本次给小伙伴们带来的是 STM32 下的 HAL 库硬件 SPI 驱动 320*240 分辨率的 TFT-LCD,LCD 显示屏驱动芯片为 ST7789,一步步实现如何驱动此类驱动芯片的 LCD 屏幕,话不多说,上干货!
完成目标
1、cubemx配置硬件SPI
2、驱动240*320分辨率LCD显示屏(驱动芯片为ST7789)
硬件环境
1、STM32F103C8T6(自设计)
2、ST7789驱动LCD显示屏
软件环境
1、cubemx
2、keil5
一、cubemx配置硬件SPI及LCD相关引脚
1.1 时钟配置
第一步仍然是时钟配置,由于板子上设计没有预留外部晶振,我使用的是内部RC振荡器,内部RC振荡器只能配置到64MHZ,如下,如果你使用的是外部晶振,最大到72MHZ
1.2 LCD与STM32硬件连接关系
LCD | MCU |
---|---|
LCD-RST | PB1 |
LCD-CS | PB0 |
LCD-DC | PA4 |
LCD-MOSI | PA7 |
LCD-CLK | PA5 |
LCD-LDE+ | VCC-3.3(可接IO控制) |
LCD-LDE- | GND |
LCD-VCC | VCC-3.3V |
LCD-GND | GND |
1.3 LCD相关引脚配置
本次使用的是SPI1,对SPI1的引脚及参数进行配置,相关IO初始化状态可以根据需要进行配置u,比如CS引脚,拉低有效,初始化我们可以配置为高,根据自己需要进行配置即可
小伙伴们有没有遇到过配置完发现不能仿真,这里需要设置一下,根据自己的仿真器接口进行配置,是SWD模式还是JTAG模式 生成工程配置,配置完之后,直接点击生成即可,注意工程路径不要有中文,记得以前可以有,不知道什么时候有的臭毛病...只能按照做了
二、代码编写
先定义LCD相关引脚,CS、RST、DC
#define LCD_REST_LOW() HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET);
#define LCD_REST_HIGH() HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET);#define LCD_DC_LOW() HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET);
#define LCD_DC_HIGH() HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);#define LCD_CS_LOW() HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);
#define LCD_CS_HIGH() HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET);#define LCD_WR_RS(n) (n?HAL_GPIO_WritePin(LCD_DC_GPIO_Port,LCD_DC_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(LCD_DC_GPIO_Port,LCD_DC_Pin,GPIO_PIN_RESET))
定义用到的几个基本函数
/*** @brief 写16位的数据(两个字节)到LCD* @param dat —— 需要发送的16bit数据* @return none*/
void LCD_Write_2Bytes(const uint16_t dat)
{uint8_t data[2] = {0};data[0] = dat >> 8;LCD_data_write(data[0]);data[1] = dat;LCD_data_write(data[1]);// LCD_SPI_Send(data, 2);
}void LCD_command_write(uint8_t command)
{ // 写命令LCD_DC_LOW();LCD_CS_LOW();lcd_SendBytes(command);LCD_CS_HIGH();
}
void LCD_data_write(uint8_t data)
{ //写数据LCD_DC_HIGH();LCD_CS_LOW();lcd_SendBytes(data);LCD_CS_HIGH();
}void delay_lcd(unsigned int time)
{while (time){time--;time--;time--;time--;}
}void LCD_Reset(void)
{LCD_REST_HIGH();delay_lcd(1000);LCD_REST_LOW();delay_lcd(10000);LCD_REST_HIGH();delay_lcd(10000);LCD_CS_HIGH();
}
LCD行列设置
//========================================================
//CASET (2Ah): Column Address Set
//RASET (2Bh): Row Address Set
//x1,y1:起始地址,x2,y2:终点地址
//========================================================
void lcd_set_address(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{LCD_command_write(0x2a);LCD_data_write(x1 >> 8);LCD_data_write(x1);LCD_data_write(x2 >> 8);LCD_data_write(x2);LCD_command_write(0x2b);LCD_data_write(y1 >> 8);LCD_data_write(y1);LCD_data_write(y2 >> 8);LCD_data_write(y2);LCD_command_write(0x2C); // write_ram
}
LCD初始化代码,这部分主要是参考网上已经完成的,相关配置可以在手册具体查看
void lcd_init(void)
{LCD_CS_HIGH();LCD_Reset();/************* display Setting *************/LCD_command_write(0x01);delay_lcd(10000);LCD_command_write(LCD_CMD_SLPOUT);delay_lcd(10000);//修改此处,可以改变屏幕的显示方向,横屏,竖屏等LCD_command_write(LCD_CMD_MADCTL); // 0x36 ///< Memory Data Access ControlLCD_data_write(0x00); //50//40//C0LCD_command_write(LCD_CMD_COLMOD); // 0x3A ///< Interface Pixel FormatLCD_data_write(0x05); /// 16bit/pixel/*********** Frame Rate Setting ***********/LCD_command_write(LCD_CMD_PORCTRL); //0xB2 ///< Porch SettingLCD_data_write(0x0c); ///< Back porch in normal modeLCD_data_write(0x0c); ///< Front porch in normal modeLCD_data_write(0x00); ///< Disable separate porch controlLCD_data_write(0x33); ///< Back and front porch in idle modeLCD_data_write(0x33); ///< Back and front porch in partial modeLCD_command_write(LCD_CMD_GCTRL); // 0xB7 ///< Gate ControlLCD_data_write(0x72); ///< VGH:13.26, VGL:-10.43LCD_command_write(LCD_CMD_VCOMS); // 0xBB ///< VCOM SettingLCD_data_write(0x3d); ///< VCOM: 1.425LCD_command_write(LCD_CMD_LCMCTRL); ///0xC0 ///< LCM ControlLCD_data_write(0x2c);LCD_command_write(LCD_CMD_VDVVRHEN); //0xC2 ///< VDV and VRH Command EnableLCD_data_write(0x01);LCD_data_write(0xFF);/* VRH Set */LCD_command_write(LCD_CMD_VRHS); //0xC3LCD_data_write(0x19);/* VDV Set */LCD_command_write(LCD_CMD_VDVS); //0xC4LCD_data_write(0x20);LCD_command_write(LCD_CMD_FRCTRL2); // 0xC6 ///< Frame Rate Control in Normal ModeLCD_data_write(0x0f); ///< 60HzLCD_command_write(LCD_CMD_PWCTRL1); // 0xD0 ///< Power Control 1LCD_data_write(0xa4);LCD_data_write(0xa1); ///< AVDD:6.8V, AVCL:-4.8V, VDDS:2.3V/* Positive Voltage Gamma Control */LCD_command_write(0xE0);LCD_data_write(0xD0);LCD_data_write(0x04);LCD_data_write(0x0D);LCD_data_write(0x11);LCD_data_write(0x13);LCD_data_write(0x2B);LCD_data_write(0x3F);LCD_data_write(0x54);LCD_data_write(0x4C);LCD_data_write(0x18);LCD_data_write(0x0D);LCD_data_write(0x0B);LCD_data_write(0x1F);LCD_data_write(0x23);/* Negative Voltage Gamma Control */LCD_command_write(0xE1);LCD_data_write(0xD0);LCD_data_write(0x04);LCD_data_write(0x0C);LCD_data_write(0x11);LCD_data_write(0x13);LCD_data_write(0x2C);LCD_data_write(0x3F);LCD_data_write(0x44);LCD_data_write(0x51);LCD_data_write(0x2F);LCD_data_write(0x1F);LCD_data_write(0x1F);LCD_data_write(0x20);LCD_data_write(0x23);// LCD_command_write( 0x21); ///< Display Inversion On//LCD_command_write( 0x13);//LCD_InitSequence();//Display_logo();// lcd_clear(LCD_DISP_RED);lcd_clear(LCD_DISP_WRITE);LCD_command_write(LCD_CMD_DISPON); ///< Display on
}
常用颜色定义,为RGB565格式,其他颜色可以自己改变配比
/************** 颜色(RGB 5,6,5) **************/
#define LCD_DISP_RED 0xF800 //先高字节,后低字节
#define LCD_DISP_GREEN 0x07E0
#define LCD_DISP_BLUE 0x001F
#define LCD_DISP_WRITE 0xFFFF
#define LCD_DISP_BLACK 0x0000
#define LCD_DISP_GRAY 0xEF5D
#define LCD_DISP_GRAY75 0x39E7
#define LCD_DISP_GRAY50 0x7BEF
#define LCD_DISP_GRAY25 0xADB5
LCD清屏,可以填充指定的颜色
//========================================================
//LCD清屏 color:要写入的颜色
//先关显示,等所有的数据写入到RAM后,再打开显示
//========================================================
void lcd_clear(uint16_t color)
{uint16_t i, j;LCD_command_write(0x2A);LCD_data_write(0);LCD_data_write(0);LCD_data_write(0);LCD_data_write(240);LCD_command_write(0X2B);LCD_data_write(0);LCD_data_write(0);LCD_data_write(0X01);LCD_data_write(0X40);LCD_command_write(0X2C);for (i = 0; i < 240; i++){for (j = 0; j < 320; j++){LCD_data_write(color >> 8);LCD_data_write(color);}}lcd_display_on(); /* 开LCD显示 */
}
还有一些打点、划线、画圆等函数,就不再一一介绍了,编写测试代码,刷屏,画圆、画矩形、显示汉字,一气呵成,直接来看演示视频吧.,延时视频见公众号~
后面会分享更多有意思的显示小项目,包括界面等的设计,敬请期待吧!
本次的介绍就到这里啦,后面有更精彩的内容,欢迎大家持续关注嵌入式实验基地!
如果你觉得对自己有帮助的话,给个赞,点个关注,点个在看,感谢前进的道路上有你的陪伴!
推荐阅读
☞开源电路のSTM32最小系统设计
☞一种你值得拥有的简单易实现的开关电路
☞无线通讯之红外通讯
☞DIY一个离线语音控制器
☞HAL库us延时的3种实现方式
☞逻辑分析仪的简单使用介绍(附带iic,uart,spi数据波形分析)
☞ART-PI重力感应无线智能小车第一弹----ART-PI扩展板设计
☞ART-PI重力感应无线智能小车第二弹----Onenet+wifi+L298N电机驱动
☞ART-PI重力感应无线智能小车第三弹----RT-Studio+MPU6050+MQTT发布订阅
☞STM32 DAC音频输出
☞PCB设计基础
☞OLED+ESP8266网络小时钟
基于STM32 HAL库硬件SPI的ST7789驱动(TFT-LCD 240*320)相关推荐
- STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...
- 基于STM32 HAL库的遥控小车
目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...
- [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备
序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...
- HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库
HIH8121温湿度传感器代码基于STM32 HAL库 HIH8121传感器简介 驱动代码.c 驱动代码.h main函数 HIH8121传感器简介 HIH8121是霍尼韦尔公司生产的测量温湿度参数一 ...
- STM32 HAL库 STM32CubeMX -- SPI
文章目录 一.SPI 协议简介 SPI 物理层 SPI 协议层 二.SPI 的架构 三.通讯过程 四.STM32Cube MX配置 五.SPI HAL库函数 一.SPI 协议简介 SPI (Seria ...
- STM32F030 HAL库硬件SPI操作W25Q16存储芯片(二)
上篇文章介绍了W25Q16芯片的一些基本信息,这篇主要介绍编程操作. /*封装读写操作 SPI 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 */ uint8_t SPI_R ...
- DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动
系列文章 DW1000开发笔记(一)DW1000芯片概览 DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信 一.官方驱动 Decawave官方提 ...
- 基于STM32(HAL库)的水质检测(浑浊度、PH值、温度、手机APP显示、wifi上云)
本系统由通过wifi将浑浊度.PH值.温度采集的数据发送到手机APP,超过设定的阈值报警. 一.硬件材料清单: 1.STM32C8T6:控制器 2.OLED显示屏:显示传感器采集的数据 3.PH传感器 ...
- 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结
目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...
- STM32 HAL 库0.96寸oledSSD1306 驱动
看到网上的ssd1306初始化都一个样.我自己写了一个锻炼一下编程和看英文文档的能力顺便熟悉下hal库 这个是Google上找的官方初始流程不得不说百度和中文文档是阉割版后面直接少了这个关键的东西害的 ...
最新文章
- 【Android工具】speedtest网速测试工具(4.1.5)安卓网速测试去广告高级版
- 开源团队协作 TMS 2.4.0 版本发布
- 使用SpringData出现java.lang.AbstractMethodError
- 别再龟速炼丹了!聊聊怎样科学提升训练效率
- 错误Read timed out.
- linux下无法删除文件夹,linux服务器下完美解决无法删除虚拟主机文件或文件夹...
- Eclipse-无法引用maven依赖的类/没有MavenDependencies/没有buildpath
- c语言定义一个strcmp函数,定义一个strcmp函数实现两个字符串比较,函数原型为int strcmp(char * p1,...
- 改变函数this指向
- 编写合格的C代码(1):通过编译选项将特定警告视为错误
- mt4 指标 涨跌幅 颜色k线_通达信K线波段操盘指标公式
- 最新版华为HG255D硬件定义
- ARM 与 STM32 的关系
- CAD插件的安装和自动加载dll、arx
- get请求中文乱码处理方法
- unity3D-游戏/AR/VR在线就业班 C#入门访问修饰符学习笔记
- [个人笔记]origin学习 APP功能
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
- spark 的第一个程序 WordCount(详细注释版)
- Golang 匿名字段