stm32驱动xpt2046触摸屏

XPT2046触摸屏驱动 以下是一个基本的XPT2046驱动库设计,包括初始化、读取X轴、Y轴位置、读取压力、坐标转换和检测触摸的函数。请注意,这是一个基本的驱动库实现,具体细节(如SPI引脚配置、坐标转换和校准等)需要根据GD32H759I-EVAL开发板和XPT2046触摸屏的实际连接和参数进行调整和完善。// 根据具体的显示屏分辨率和校准数据,将原始坐标转换为屏幕坐标。// 根据读取的压力值或T_IRQ引脚的状态判断是否有触摸发生。// 根据Z1和Z2的值计算压力。// 选择XPT2046。// XPT2046 命令。 阅读详情

上次我们使用的那块2.4寸ILI9341芯片LCD是带触摸的,触摸驱动芯片为xpt2046。这次我们来看如何使用stm32获取触摸屏的信息。

XPT2046

xpt2046是一款4线制电阻式触摸屏控制器芯片。它的核心功能是将触摸屏上的物理按压位置转换成数字信号,以便单片机读取和处理。与单片机的接口主要由以下几个引脚

  • VCC: 电源正极
  • GND: 电源地
  • CLK:SPI时钟信号,在我使用的板子上为和LCD的时钟区分,标记为T_CLK
  • DIN:SPI数据输入,接受单片机来的控制命令,在我使用的板子上对应的是MOSI
  • DOUT: SPI数据输出,向单片机发送转换后的数字数据,在我使用的板子上对应的是MISO
  • PEN:接触中断信号
  • CS: 片选,低电平有效,我使用板子上为了和LCD的CS区分,标记为T_CS

在这里插入图片描述

同样我们使用STM32F103RB,将引脚做以下连接

  • T_CLK:PB3
  • MISO:PB4
  • MOSI:PB5
  • T_CS: 连接到PC5
  • PEN: 连接到PC0

并且在STM32 CubeMX中做以下操作

  • 将SPI1设置为Full Duplex Master模式,对应PB3、PB4、PB5的设置
  • 将PC5设置为GPIO_OUTPUT, 并命名为T_CS
  • 将PC0设置为GPIO_EXTI0,并且GPIO mode设置为External Interrupt Mode with Falling edge trigger detection(下降沿触发), 并命名为T_PEN_INT
  • 在NVIC设置中,确保EXTI line0 interrupt 被勾选上
    在这里插入图片描述

我们就可以生成代码并实现相关驱动的代码了,部分关键代码如下所示:

#include "touch_xpt2046.h"


#define SAMPLE_TIMES 10 // 采样次数,因为触摸点会漂移,所以我们每次需要采样多次,然后取平均值返回

uint16_t Touch_Read_Data(uint8_t cmd) {
	uint8_t txData[3] = {cmd, 0, 0};
	uint8_t rxData[3] = {0};   // 这里rxData与rxData用同一个数组也是可以的
	
	__disable_irq(); // 在操作读取数据的时候需要禁止中断
	HAL_GPIO_WritePin(TOUCH_CS_PORT, TOUCH_CS_PIN, GPIO_PIN_RESET); // 片选使能
	HAL_SPI_TransmitReceive(&TOUCH_SPI_HANDLE, txData, rxData, 3, 1000);
	HAL_GPIO_WritePin(TOUCH_CS_PORT, TOUCH_CS_PIN, GPIO_PIN_SET);
	__enable_irq();
	
	uint16_t data = (rxData[1] << 8) | rxData[2]; //第一个字节是发送字节,可以丢弃,第二第三个字节需要合并
	return data >> 3; // 返回数据是12位的,最后3位无效值,丢弃
}

// 总是长边为x, 短边为y,需要根据实际情况转换为屏幕坐标
void Touch_Get_Pos(uint16_t* x, uint16_t* y) {
    uint16_t x_sum = 0, y_sum = 0;

	for (int i = 0; i < SAMPLE_TIMES; i++) { // 多次采样
		x_sum += Touch_Read_Data(0x90); // 0x90为读取x坐标的命令
		y_sum += Touch_Read_Data(0xD0); // 0xD0为读取y坐标的命令
	}
	
	*x = x_sum/SAMPLE_TIMES;
	*y = y_sum/SAMPLE_TIMES;

}

在实际应用中,还需要根据屏幕的朝向进行坐标转换。

在main.c中,添加全局变量touch_screen_pressed,初始化为false,并且添加中断处理函数

bool touch_screen_pressed = false;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  if (GPIO_Pin == T_PEN_INT_Pin) {
    if (!touch_screen_pressed) {
      log_write(LOG_LEVEL_DEBUG, "Touch screen pressed");
      touch_screen_pressed = true;
    }
  }
}

在main.c的主循环中

  while (1)
  {

    if (touch_screen_pressed) {
      uint16_t x = 0;
      uint16_t y = 0;
      Touch_Get_Pos(&x, &y);
      if (x == 4095 || y == 0) { // 当x为4905或y为0的时候,表示触摸结束
        touch_screen_pressed = false;
        log_write(LOG_LEVEL_DEBUG, "touch unpressed");
      } else {
        log_write(LOG_LEVEL_DEBUG, "X: %d, Y: %d", x, y);
      }
    }
    ...
  }

启动板子,用串口连接查看数据,就可以看到读取的触摸信息

在实际应用中,我们还需要考虑屏幕四个角坐标的偏移,所以通常需要做一个屏幕坐标与触摸坐标的映射功能,引导用户依次点击屏幕四角和中点的特定位置,即可得到转换的公式。
结合上一篇文章的屏幕显示方法,我们就可以在屏幕上用手绘制图案了

完整项目工程在这里:https://github.com/sqlxx/stm32-workshop/ (lcd_driver分支)

STM32F4_触摸屏 支持多点触控,检测精度高,电容屏通过和导电物体产生的电容效应来检测触摸动作(电容屏可以用手指触摸,因为手指是导电的),只能感应导电物体的触摸,湿度较大或屏幕表面有水珠时会影响电容屏的检测效果。造价便宜,能够适应较恶劣的环境,但只是支持单点触控(一次只能检测面板上一个触控的位置),触摸时需要一定的压力(通常指甲触摸的屏幕,需要给一定的压力),使用久了容易造成表面磨损,影响寿命。,X-极接地,所以在X+与X-处形成了匀强电场,此时触点处的电压可以通过Y+电极采集得到,由于ITO层均匀导电,那么。 阅读详情

相关推荐

XPT2046程序例程(STM32F103C8T6)

一、前言 本例程是使用XPT2046 AD转换IC采集电位器的数值,并通过串口调试助手打印数据。所使用的是库函数进行编写。 二、XPT2046 概述 (一)功能说明 XPT2046是一款4线制电阻屏控制器,内含12位分辨率125KHz转换速率逐频逼近型A/D转换器。XPT2046支持从1.5V到5.2V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置,除此之外,还可以测量加在触摸屏上的压力。内部自带2.5v参考电压,可以作为辅助输入温度测量...

Me-Space的博客 1万+

[GUI] ESP32(idf)触摸屏(XPT2046)驱动及驱动校准

1. XPT2046简介 XPT2046是一款4线电阻式触摸屏控制器,包含12位125 kHz采样SAR型a /D转换器。 XPT2046可以通过执行两个A/D转换来检测按下的屏幕位置。 … 下面简单的了解下吧 内部逻辑电路 引脚描述 基础应用电路 读写时序 2. XPT2046驱动 XPT2046 用的是SPI驱动,不过这里使用的是模拟的spi,原因有三: 1. XPT2046 不支持太高的SPI速率 2. ESP32上没有足够的SPI了,一个60MHzSPI用来驱动LCD屏、一个16MH

slimmm的博客 9534

STM32实战指南:XPT2046电阻触摸屏驱动开发与校准技巧

本文详细介绍了STM32驱动XPT2046电阻触摸屏的完整流程,涵盖硬件连接、SPI通信、坐标采集滤波以及核心的屏幕校准算法。通过实战代码解析两点校准法,帮助开发者解决触摸不准的常见问题,实现精准的坐标映射,适用于工业控制、仪器仪表等嵌入式触控应用场景。

weixin_29173777的博客 338

简单易懂的XPT2046触摸屏驱动

触摸屏宽度240,高度320,IO引脚为正点原子f103的2.4寸电阻触摸屏同款,修改引脚时修改LGPIO结构体和XPT2046_init()函数即可。 #include "xpt2046.h" #include "xpt2046_command.h" #define TOUCHPAD_WDITH 240 #define TOUCHPAD_HEIGHT 320 #define REPEATED_SAMPLING_TIMES 5 //重复取样次数,可以根据实际情况修改 //IO定义,引脚不同直

u011781073的博客 5029

STM32实战指南:XPT2046电阻触摸屏驱动开发与坐标校准全解析

简单来说,当你用手指按压屏幕时,XPT2046会通过四根线(XP、XN、YP、YN)检测电压变化,然后把触摸位置转换成数字坐标。我做过对比测试,用普通ADC芯片和XPT2046同时测量同一个触摸点,XPT2046的稳定性明显更好,特别是在屏幕边缘区域。调试时有个坑要注意:XPT2046的SPI时序比较特殊,需要在时钟下降沿改变数据,上升沿采样。我第一次没注意这个细节,结果读回来的数据全是乱的。记得第一次调试时,我犯了个低级错误——没接PENIRQ中断线,结果只能轮询检测触摸,白白浪费了CPU资源。

weixin_29174385的博客 442

STM32实战指南:基于XPT2046的电阻触摸屏驱动开发与坐标校准详解

本文详细介绍了基于STM32和XPT2046芯片的电阻触摸屏驱动开发与坐标校准方法。内容涵盖模拟SPI接口实现、差分/单端模式选择、坐标校准算法、抗干扰滤波处理以及低功耗优化技巧,并提供了常见问题排查指南和智能温控面板实战案例,帮助开发者快速掌握电阻触摸屏驱动开发的核心技术。

weixin_28292761的博客 200

STM32驱动XPT2046电阻触摸屏的工程实践

电阻式触摸屏是一种基于分压原理的模拟位置传感器,其核心是将物理按压转化为X/Y轴电压信号,并通过ADC量化为数字坐标。理解其模拟传感本质与SPI通信时序约束,是实现稳定驱动的前提。XPT2046作为主流触摸控制器,依赖精确的8位控制字触发12位SAR ADC采样,对时序鲁棒性、软件消抖和坐标校准提出系统性要求。在资源受限的STM32平台,常需权衡硬件外设占用、中断实时性与数据持久化需求,采用软件模拟SPI、轮询状态机与外部SPI Flash存储校准参数等工程策略。本文围绕XPT2046与STM32协同设计,

weixin_32306683的博客 300

STM32F1与STM32CubeIDE编程实例-XPT2046电阻触摸屏驱动

XPT2046 是一款 4 线电阻式触摸屏控制器,包含一个 12 位 125 kHz 采样 SAR 型 A/D 转换器。XPT2046支持1.5V到5.25V的低电压I/O接口。XPT2046通过两次A/D转换就可以确认被按的屏幕位置。

视觉与物联智能 1337

linux平台xpt2046驱动,XPT2046触摸屏实验过程详解与STM32代码解析

1.XPT2046的初始化XPT2046说起来其实就是一个AD转换器,所以它适合不需要什么初始化设置的,而具体的初始化其实也就是单片机IO的初始化和SPI的初始化。这次STM32是使用SPI1来进行操作,SPI的设置其实在前几节课已经讲过了,这里就不重复讲了,初始化的具体代码如下:/**********************************************************...

weixin_32233571的博客 993

基于STM32、HAL库的XPT2046触摸屏控制器驱动程序设计

/ 读取内部温度传感器。// XPT2046使用SPI模式3。// 转换为实际温度值(需要根据实际校准)// 10ms采样间隔。// 设置校准参数(根据实际校准结果调整)// ...其他初始化代码...// 设置中断优先级并使能。// 配置IRQ引脚中断。// XPT2046设备结构体。// 根据方向调整坐标。// 初始化触摸控制器。// XPT2046控制命令。// 初始化CS引脚。// 读取XPT2046数据。

corlin6688的博客 487

基于STM32L4XX、HAL库的4.3寸TFT LCD 触摸屏(XPT2046)驱动程序设计

define XPT2046_SPI_PORT hspi1 // 根据你的硬件配置修改。// 例如:显示坐标到TFT LCD。// 在这里处理触摸坐标。// 使能SPI1时钟。// 配置SPI1引脚。// 定义XPT2046的SPI接口。// 定义XPT2046的IRQ引脚。// 定义XPT2046的CS引脚。// 初始化XPT2046。// SPI1初始化代码。// 初始化IRQ引脚。// 系统时钟配置代码。// 初始化CS引脚。

zhusl6688的博客 1358

STM32实战:XPT2046触摸屏驱动开发与坐标校准全解析

本文详细解析了STM32驱动XPT2046触摸屏的开发与坐标校准全过程,涵盖硬件连接、SPI通信优化、多重采样滤波算法及四点校准法等关键技术。通过实战案例展示如何解决电阻式触摸屏的精度问题,提供完整的抗干扰方案和驱动实现示例,帮助开发者快速实现高精度触摸控制。

weixin_29178069的博客 309

XPT2046电阻触摸屏驱动原理与STM32实战

电阻式触摸屏是一种基于四线分压原理的模拟人机交互器件,其坐标检测本质是通过ADC对X/Y层触点分压比进行采样。XPT2046作为专用触摸控制器,集成了12位SAR ADC、可编程参考源和模拟开关矩阵,以SPI接口实现硬件加速的坐标采集。该芯片广泛应用于STM32嵌入式系统中,尤其适配野火指南者/霸道等开发板的软件模拟SPI方案。其核心价值在于将复杂的GPIO时序与模拟切换逻辑封装为标准控制字(如0x90/0xD0),显著降低驱动开发门槛。典型应用场景包括工业HMI、便携设备及教育开发平台,需结合中断触发、滑

weixin_42400643的博客 95

STM32驱动4英寸电阻触摸屏:NT35510与XPT2046实战指南

在嵌入式人机交互(HMI)开发中,显示与触摸是核心交互界面。电阻触摸屏因其高可靠性、环境适应性强和成本优势,在工业控制、医疗设备等领域广泛应用。其工作原理基于压力感应,通过控制器将模拟电压转换为数字坐标。8080并行接口提供高速数据传输,常用于驱动显示芯片,而SPI接口则用于读取触摸坐标,两者协同实现高效的人机交互。本文聚焦于基于STM32微控制器,驱动4英寸电阻触摸屏的完整方案,涵盖NT35510显示驱动与XPT2046触摸控制的硬件设计、驱动开发、校准算法及与LVGL等GUI库的整合,为嵌入式图形界面开

weixin_42520573的博客 350

STM32 HAL库驱动ILI9341 TFT LCD与XPT2046触摸屏实战指南

在嵌入式系统开发中,显示与交互模块是提升设备可用性的关键环节。SPI总线因其引脚少、速率高,成为连接主控与显示屏的常用接口。本文从TFT LCD的基本工作原理出发,讲解ILI9341驱动芯片的初始化流程、窗口设置、像素填充等核心技术,并深入解析XPT2046触摸屏的ADC采样、坐标校准与事件检测方法。结合HAL库的分层设计思想,帮助开发者构建可复用的显示驱动框架。针对实际工程中常见的白屏、花屏、触摸漂移等问题,提供系统化的排查思路,并探讨基于DMA与LVGL的性能优化方向。内容适合STM32入门者快速上手,

weixin_30572613的博客 296

xpt2046驱动,xpt2046驱动程序,C,C++

14压缩包包含xpt2046.c xpt2046.h

STM32电阻触摸屏驱动:XPT2046软SPI与坐标校准实战

电阻式触摸屏是嵌入式HMI中成本敏感、环境鲁棒的基础输入设备,其工作原理依赖模拟电压分压与ADC量化,核心挑战在于原始ADC值(0–4095)到LCD像素坐标的非线性映射。实现可靠触摸需协同硬件时序控制(如GPIO模拟SPI)、抗噪数据滤波(去极值平均)、抖动消除状态机及仿射变换校准算法。XPT2046作为典型四线SPI触摸控制器,广泛应用于STM32等Cortex-M系列平台,配合IL9341等TFT驱动可构建完整GUI事件链。本文围绕野火STM32F103平台,详解从底层位操作通信、多级滤波优化、Fla

weixin_35749545的博客 102

XPT2046驱动TFT液晶屏电路及说明-电路方案

此项目为液晶触摸屏典型应用电路设计分享,LCD的尺寸为2.8/3.2寸,分辨率为240*320,LCD显示部分由ILI9341驱动。LCD集成电阻触摸屏,由板载触摸芯片XPT2046驱动。XPT2046驱动TFT液晶屏电路参数: 工作电压:2.5V ~ 3.3V ILI9341通信方式:16位并口、8位并口、4/3线SPI FPC连接器:可更换LCD屏 实物截图:

上一篇: 2.4寸SPI串口ILI9341芯片彩色LCD驱动
帅帅兔子
博客等级 码龄24年 7粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅帅兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值