> 技术文档 > 【模块系列】STM32&1.69TFT屏幕_cst816t

【模块系列】STM32&1.69TFT屏幕_cst816t


前言

  在翻翻自己的器件盒的时候,发现这块好久之前买的TFT屏了,想起还没有用STM32点亮过,手头上正好有立创的梁山派STM32F4,就试着按照网上的文章教程顺便移植个LVGL看看,然后就有了就本文。

  代码工程命名的是LvglDemo,不要奇怪。虽然LVGL8.3移植进去了,不知道是不是还没开始优化,跑演示文本滚动的时候,都一卡一卡的,所以LVGL相关代码都注释掉了。本文主要是分享自己编写的CST816T(虽然代码不多),和整个代码工程,LCD的显示代码是修改自中景园的。希望能帮助到大家。

材料

模块:1.69寸液晶显示屏,分辨率:240x280,驱动IC:ST7789V,触摸IC:CST816T。加上立创上打的显示屏驱动板。

开发板:立创梁山派·天空星STM32F407VGT

案例的代码环境:Keil5+STM32CubeMX生成的HAL库,硬件I2C+硬件SPI

其它事项:可能在用I2C与触摸IC建立通信时没反应,如读取芯片ID没有回应之类,那可能是芯片进入待机模式了,可以试着点击屏幕的同时在通信看看有没有反应。

步骤

STM32CubeMX配置简述

SYS上Debug配置成Serial Wire,启用USART1调试,SPI1对接LCD,I2C1对接TOUCH,像LCD上的其它引脚都是找普通的GPIO,按输出、上拉、快速、推挽模式配置,初始状态全部为高电平。

通常1.69\"IPS240x280(RGB)的引脚定义

序号 模块引脚 引脚说明 1 GND 液晶屏电源地 2 VCC 液晶屏电源正(3.3V) 3 SCL 液晶屏SPI总线时钟信号 4 SDA 液晶屏SPI总线写数据信号 5 RES 液晶屏复位控制信号 (低电平复位) 6 DC 液晶屏寄存器/数据选择控制信号(低电平:寄存器,高电平:数据) 7 CS 液晶屏片选控制信号 (低电平使能) 8 BLK 液晶屏背光控制信号(高电平点亮,如不需要控制,请接3.3V)

代码

下面仅展示CST816T库和main.c的节选,完整的工程文件会放在末尾。因为目前对CST816T没啥应用,所以就写了几条基本的功能函数,来测试,但是手册上所列出来的寄存器都写成宏了,有需要的可以自行扩写。

CST816T.H

#ifndef __CST816T_H__#define __CST816T_H__// #include \"stdint.h\"// I2C相关参数#define CST816T_I2CAddress_7bit 0x15#define CST816T_I2CAddress_8bit_Read (CST816T_I2CAddress_7bit << 1) | 0x01#define CST816T_I2CAddress_8bit_Write (CST816T_I2CAddress_7bit << 1)// CST816T的寄存器// 参考于《CST816T通用版本SDK寄存器说明-v1》#define CST816T_Register_GestureID0x01// 手势码#define CST816T_Register_FingerNum0x02// 手指个数#define CST816T_Register_XposH0x03// X坐标高4位#define CST816T_Register_XposL0x04// X坐标低8位#define CST816T_Register_YposH0x05// Y坐标高4位#define CST816T_Register_YposL0x06// Y坐标低8位#define CST816T_Register_ChipID0xA7// 工程编号#define CST816T_Register_FwVersion0xA9// 软件版本号#define CST816T_Register_FactoryID 0xAA// TP厂家ID#define CST816T_Register_BPC0H0xB0// BPC0值的高8位#define CST816T_Register_BPC0L0xB1// BPC0值的低8位#define CST816T_Register_BPC1H0xB2// BPC1值的高8位#define CST816T_Register_BPC1L 0xB3// BPC1值的低8位#define CST816T_Register_SleepMode 0xE5// 值为0x03时进入休眠状态(无触摸唤醒功能)#define CST816T_Register_ErrResetCtl 0xEA// 复位触摸面积相关#define CST816T_Register_LongPressTick 0xEB// 长按时间门限,默认为100。大约1S#define CST816T_Register_MotionMask 0xEC// 连续运动手势使能#define CST816T_Register_IrqPluseWidth 0xED// 中断低脉冲输出宽度#define CST816T_Register_NorScanPer 0xEE// 正常快速检测周期#define CST816T_Register_MotionSlAngle 0xEF// 手势检测滑动分区角度控制#define CST816T_Register_LpScanRaw1H 0xF0// 低功耗扫描1号通道的基准值的高8位#define CST816T_Register_LpScanRaw1L 0xF1// 低功耗扫描1号通道的基准值的低8位#define CST816T_Register_LpScanRaw2H 0xF2// 低功耗扫描2号通道的基准值的高8位#define CST816T_Register_LpScanRaw2L 0xF3// 低功耗扫描2号通道的基准值的低8位#define CST816T_Register_LpAutoWakeTime 0xF4// 低功耗时自动重校正周期#define CST816T_Register_LpScanTH 0xF5// 低功耗扫描唤醒门限。越小越灵敏#define CST816T_Register_LpScanWin 0xF6// 低功耗扫描量程。越大越灵敏,功耗越高#define CST816T_Register_LpScanFreq 0xF7// 低功耗扫描频率。越小越灵敏#define CST816T_Register_LpScanIdac 0xF8// 低功耗扫描电流。越小越灵敏#define CST816T_Register_AutoSleepTime 0xF9// x秒内无触摸时,自动进入低功耗模式#define CST816T_Register_IrqCtl 0xFA// 发出低脉冲的动作#define CST816T_Register_AutoReset 0xFB// x秒内有触摸但无有效手势时,自动复位#define CST816T_Register_LongPressTime 0xFC// 长按x秒后自动复位#define CST816T_Register_IOCtl 0xFD// 主控通过拉低IRQ引脚实现触控的软复位功能#define CST816T_Register_DisAutoSleep 0xFE// 默认为0,使能自动进入低功耗模式// 功能函数void CST816T_Init(void);// 初始化uint8_t CST816T_GetGestureID(void);// 获取手势码uint16_t CST816T_GetXpos(void);// 获取点击的X坐标uint16_t CST816T_GetYpos(void);// 获取点击的Y坐标uint8_t CST816T_GetChipID(void);// 获取芯片IDuint8_t CST816T_GetRegisterData(uint8_t reg);// 获取单个寄存器数据#endif

CST816T.C

#include \"main.h\"#include \"i2c.h\"#include \"CST816T.h\"// 初始化void CST816T_Init(void){}// 获取手势码uint8_t CST816T_GetGestureID(void){uint8_t reData[1] = {0};// 接收数据uint8_t CMD[] = { CST816T_Register_GestureID };// 命令HAL_I2C_Master_Transmit(&hi2c1, CST816T_I2CAddress_8bit_Write, CMD , 1, 1000);HAL_I2C_Master_Receive(&hi2c1, CST816T_I2CAddress_8bit_Read, reData , 1, 1000);return reData[0];}// 获取点击的X坐标uint16_t CST816T_GetXpos(void){uint8_t reData[2] = {0};// 接收数据uint8_t CMD[] = { CST816T_Register_XposH };// 命令HAL_I2C_Master_Transmit(&hi2c1, CST816T_I2CAddress_8bit_Write, CMD , 1, 1000);HAL_I2C_Master_Receive(&hi2c1, CST816T_I2CAddress_8bit_Read, reData , 2, 1000);return ((reData[0] & 0x0F) << 8) | reData[1];}// 获取点击的Y坐标uint16_t CST816T_GetYpos(void){uint8_t reData[2] = {0};// 接收数据uint8_t CMD[] = { CST816T_Register_YposH };// 命令HAL_I2C_Master_Transmit(&hi2c1, CST816T_I2CAddress_8bit_Write, CMD , 1, 1000);HAL_I2C_Master_Receive(&hi2c1, CST816T_I2CAddress_8bit_Read, reData , 2, 1000);return ((reData[0] & 0x0F) << 8) | reData[1];}// 获取芯片IDuint8_t CST816T_GetChipID(void){uint8_t reData[1] = {0};// 接收数据uint8_t CMD[] = { CST816T_Register_ChipID };// 命令HAL_I2C_Master_Transmit(&hi2c1, CST816T_I2CAddress_8bit_Write, CMD , 1, 1000);HAL_I2C_Master_Receive(&hi2c1, CST816T_I2CAddress_8bit_Read, reData , 1, 1000);return reData[0];}// 获取单个寄存器数据// 多用于测试用,放入寄存器地址获取数据uint8_t CST816T_GetRegisterData(uint8_t reg){uint8_t reData[1] = {0};// 接收数据uint8_t CMD[] = { reg };// 命令HAL_I2C_Master_Transmit(&hi2c1, CST816T_I2CAddress_8bit_Write, CMD , 1, 1000);HAL_I2C_Master_Receive(&hi2c1, CST816T_I2CAddress_8bit_Read, reData , 1, 1000);return reData[0];}

main.c节选

// 串口打印printf(\"\\r\\nCST816T-State:\\r\\n\");printf(\"CST816T-ID:%x\\r\\n\",CST816T_GetChipID());printf(\"CST816T-Gesture:%x\\r\\n\",CST816T_GetGestureID());printf(\"CST816T-XYpos:%d,%d\\r\\n\",CST816T_GetXpos(),CST816T_GetYpos());// 字符串处理char string_id[30];char string_gesture[30];char string_xypos[30];sprintf(string_id,\"CST816T-ID:%x \",CST816T_GetChipID());sprintf(string_gesture,\"CST816T-Gesture:%x\",CST816T_GetGestureID());sprintf(string_xypos,\"CST816T-XYpos:%d,%d \",CST816T_GetXpos(),CST816T_GetYpos());// LCD显示// LCD_Fill(0,0,LCD_W,LCD_H,WHITE);LCD_ShowString(20,70,\"CST816T-State:\",RED,WHITE,16,0);LCD_ShowString(20,90,string_id,RED,WHITE,16,0);LCD_ShowString(20,110,string_gesture,RED,WHITE,16,0);LCD_ShowString(20,130,string_xypos,RED,WHITE,16,0);HAL_Delay(50);

图片

配置、测试现象以及模块实物的图片

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

工程

代码工程文件*1 + CST816T相关数据手册*2
链接: https://pan.baidu.com/s/1cHRa0DefYNnccHHSQnaHHg  提取码: bvjw