【模块系列】STM321.69TFT屏幕
前言
在翻翻自己的器件盒的时候,发现这块好久之前买的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_GestureID 0x01 // 手势码
#define CST816T_Register_FingerNum 0x02 // 手指个数
#define CST816T_Register_XposH 0x03 // X坐标高4位
#define CST816T_Register_XposL 0x04 // X坐标低8位
#define CST816T_Register_YposH 0x05 // Y坐标高4位
#define CST816T_Register_YposL 0x06 // Y坐标低8位
#define CST816T_Register_ChipID 0xA7 // 工程编号
#define CST816T_Register_FwVersion 0xA9 // 软件版本号
#define CST816T_Register_FactoryID 0xAA // TP厂家ID
#define CST816T_Register_BPC0H 0xB0 // BPC0值的高8位
#define CST816T_Register_BPC0L 0xB1 // BPC0值的低8位
#define CST816T_Register_BPC1H 0xB2 // 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); // 获取芯片ID
uint8_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];
}// 获取芯片ID
uint8_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
相关文章:

【模块系列】STM321.69TFT屏幕
前言 在翻翻自己的器件盒的时候,发现这块好久之前买的TFT屏了,想起还没有用STM32点亮过,手头上正好有立创的梁山派STM32F4,就试着按照网上的文章教程顺便移植个LVGL看看,然后就有了就本文。 代码工程命名的是LvglDemo&…...

大模型辅助测试的正确打开方式?
测试的基本目的之一,是对被测对象进行质量评估。换言之,是要提供关于被测对象质量的“确定性”。因此,我们很忌讳在测试设计中引入“不确定性”,比如采用不可靠的测试工具、自动化测试代码逻辑复杂易错、测试选择假设过于主观等等…...
三相电的相电压、线电压、额定值、有效值,变比,零序电压,零序电流,三相三线制的三角形连接,三相四线制的星形连接
在二次设备配置中经常有根电压系统相关的名词,本身不是学电气的,有些名词经常查了忘,后续工作所有遇到跟电气相关的知识总结在此帖,便于后续直接查看,避免每次都要重新查、重新梳理。 相电压和线电压的关系是根号3倍&a…...
电商网站的基础用户数在100万,日活跃用户数在1万左右,系统下单TPS最大支持1000,应用服务要保证高可用。请预估该网站每天的使用成本。
要预估一个电商网站每天的使用成本,我们需要考虑多个因素,包括计算资源、数据库、缓存、存储、网络流量、负载均衡、安全服务、监控与日志等。以下是基于您提供的信息(基础用户数100万,日活跃用户数1万,系统下单TPS最大…...

线性代数期末总复习的点点滴滴(1)
一、可逆矩阵、行列式、秩的关系 1.行列式与可逆矩阵的关系 所以,不难看出矩阵可逆的充分必要条件是该矩阵的行列式不为0。 2.接着来看,满秩和矩阵行列式的关系 不难看出满秩和行列式不为0是等价的。 3.再来看,满秩和矩阵可逆的关系 说明了…...

python+reportlab创建PDF文件
目录 字体导入 画布写入 创建画布对象 写入文本内容 写入图片内容 新增页 画线 表格 保存 模板写入 创建模板对象 段落及样式 表格及样式 画框 图片 页眉页脚 添加图形 构建pdf文件 reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。 安装&…...
2024最新qrcode.min.js生成二维码Demo
找了一堆代码一堆GPT,终于给写对了: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

【Microi吾码】开源力量赋能低代码创新,重塑软件开发生态格局
我的个人主页 文章专栏:Microi吾码 一、引言 在当今数字化浪潮汹涌澎湃的时代,软件开发的需求呈现出爆发式增长。企业为了在激烈的市场竞争中脱颖而出,不断寻求创新的解决方案以加速数字化转型。传统的软件开发方式往往面临着开发周期长、技…...

Github - 如何提交一个带有“verified”标识的commit
Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现,有的commit记录带有verified绿色标识,有的带有橘色的Unverified标识,还有的什么都不显示。 既然我是根正苗红的作者(bushi)…...

HCIA笔记9--NAT、ACL与链路聚合
1. ACL ACL: 访问控制列表, Access Control List。 通过定义规则来允许或拒绝流量的通过。 1.1 ACL分类 1.2 配置实例 如图所示,对R2的访问只允许192.168.1.0/24网段。 我们可以配置基本acl来限制 acl 2000 acl number 2000 rule 5 permit source 192.168.1.0 0…...

SCSA:探索空间与通道注意力之间的协同效应
文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力:空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…...

深度学习助力股市预测:LSTM、RNN和CNN模型实战解析
作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:众所周知,传统的股票预测模型有着各种各样的局限性。但在我的最新研究中,探索了一些方法来高效预测股市走势,即CNN、RNN和LSTM这些深度学习…...

组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
碎碎念:有点难用,不丝滑(以下介绍的难点不是真的难,只是有点点点难用) 背景:需要实现表格的行列合并以及图标的嵌入,想到使用组件库组件来方便开发 链接:TDesign Web Vue Next 难点…...

jwt在express中token的加密解密实现方法
在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后,今天来详细学习一下token是如何生成的,secret密钥的加密解密过程是怎么样的。 安装依赖 express:用于创建服务器jsonwebtoken:用于生成和验证JWTbody-parser࿱…...
结构体、共用体的字节对齐
结构体 结构体嵌套时:先算一下嵌套的结构体大小 嵌套进来的结构体大小为16字节,仍然进行,8字节对齐 typedef struct {char name[20];//20字节//000开始 20字节 019 struct{int day; //000开始 4字节 003char swx; //004开始 1…...

【YOLOv3】源码(train.py)
概述 主要模块分析 参数解析与初始化 功能:解析命令行参数,设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能:初始化日志记录器,配置监控系统项目经理使用监控和记录工具,实时跟踪施工进度和质量…...

帧缓存的分配
帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…...

基于顺序表实现队列循环队列的处理
文章目录 1.假溢出的现象2.循环队列3.顺序表实现队列架构4.顺序表模拟实现队列5.设计循环队列(校招难度) 1.假溢出的现象 下面的这个就是我们的假溢出的这个现象的基本的来源: 我们的这个队列里面是有9个位置的,我们知道这个队列…...

磁珠选型规范
根据不同的应用场景,磁珠可以分为普通型磁珠,大电流型磁珠和尖峰型磁珠。 (1)普通型磁珠:主要用于电流比较小(小于600mA).无特殊要求的场景,普通型磁珠的直流电阻一般不超过1Ω&…...
linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置
inux USB声卡或耳机 基本配置 工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍 linux下alsa声音原件 工具使用方法,包括设备查询、声卡基本配置、录音放音等。 保证 alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视频 采集及推拉流功能的基础…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...