STM32 TFT学习笔记——触摸屏

发布者:画意人生最新更新时间:2019-03-11 来源: eefocus关键字:STM32  TFT  触摸屏 手机看文章 扫描二维码
随时随地手机看文章

主机环境:Windows 7 SP1


开发环境:MDK5.14


目标板:ST NUCLEO-F303RE


TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色


驱动IC:ILI9325


ST库版本:STM32Cube_FW_F3_V1.1.0


SD卡:Kingston 16GB Micro SDHC Class 10


触摸IC:XPT2046


关于XPT2016的说明可以从网上下载很多资料,XPT2046使用SPI通信接口,接口说明如下:



多出了一个BUSY脚和一个PENIRQ脚,BUSY信号指示XPT2046工作状态,但是在使用过程中发现其不起作用,所以就没用了,PENIRQ为中断指示脚,当触摸屏有接触时其信号会变成低电平。对于NUCLEO-F303RE来说SPI1接口在BSP里面用作了SD卡接口,因此这里使用SPI3接口来跟XPT2046进行通信,接口声明如下



/* Definition for SPI_XPT2046 clock resources */

#define SPI_XPT2046 SPI3

#define SPI_XPT2046_CLK_ENABLE() __SPI3_CLK_ENABLE()

#define SPI_XPT2046_CLK_DISABLE() __SPI3_CLK_DISABLE()

#define SPI_XPT2046_nCS_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()

#define SPI_XPT2046_SCK_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()

#define SPI_XPT2046_MISO_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()

#define SPI_XPT2046_MOSI_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()

 

#define SPI_XPT2046_FORCE_RESET() __SPI3_FORCE_RESET()

#define SPI_XPT2046_RELEASE_RESET() __SPI3_RELEASE_RESET()

 

/* Definition for SPIx Pins */

#define SPI_XPT2046_SCK_PIN                 GPIO_PIN_10

#define SPI_XPT2046_SCK_GPIO_PORT           GPIOC

#define SPI_XPT2046_SCK_AF                  GPIO_AF6_SPI3

#define SPI_XPT2046_MISO_PIN                GPIO_PIN_11

#define SPI_XPT2046_MISO_GPIO_PORT          GPIOC

#define SPI_XPT2046_MISO_AF                 GPIO_AF6_SPI3

#define SPI_XPT2046_MOSI_PIN                GPIO_PIN_12

#define SPI_XPT2046_MOSI_GPIO_PORT          GPIOC

#define SPI_XPT2046_MOSI_AF                 GPIO_AF6_SPI3

 

#define SPI_XPT2046_nCS_PIN GPIO_PIN_15

#define SPI_XPT2046_nCS_GPIO_PORT GPIOA

 

#define SPI_XPT2046_nCS_Set_Low() (GPIOA->BRR = GPIO_PIN_15)

#define SPI_XPT2046_nCS_Set_High() (GPIOA->BSRRL = GPIO_PIN_15)

 

#define SPI_XPT2046_TIMEOUT 1000


XPT2046通信时序如下

通信主时钟为2MHz据此编辑我们的spi3初始化以及读写代码



SPI_HandleTypeDef spi_xpt_Handle;

/**

  * @brief SPI MSP Initialization 

  *        This function configures the hardware resources used in this example: 

  *           - Peripheral's clock enable

  *           - Peripheral's GPIO Configuration  

  * @param hspi: SPI handle pointer

  * @retval None

  */

void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)

{

GPIO_InitTypeDef  GPIO_InitStruct;


if(SPI_XPT2046 != hspi->Instance)

{

return ;

}

   

/*##-1- Enable peripherals and GPIO Clocks #################################*/

/* Enable GPIO TX/RX clock */

SPI_XPT2046_SCK_GPIO_CLK_ENABLE();

SPI_XPT2046_MISO_GPIO_CLK_ENABLE();

SPI_XPT2046_MOSI_GPIO_CLK_ENABLE();

SPI_XPT2046_nCS_GPIO_CLK_ENABLE();

/* Enable SPI clock */

SPI_XPT2046_CLK_ENABLE(); 

 

/*##-2- Configure peripheral GPIO ##########################################*/  

/* SPI SCK GPIO pin configuration  */

GPIO_InitStruct.Pin       = SPI_XPT2046_SCK_PIN;

GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull      = GPIO_PULLDOWN;

GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

GPIO_InitStruct.Alternate = SPI_XPT2046_SCK_AF;

HAL_GPIO_Init(SPI_XPT2046_SCK_GPIO_PORT, &GPIO_InitStruct);

 

/* SPI MISO GPIO pin configuration  */

GPIO_InitStruct.Pin = SPI_XPT2046_MISO_PIN;

GPIO_InitStruct.Alternate = SPI_XPT2046_MISO_AF;

HAL_GPIO_Init(SPI_XPT2046_MISO_GPIO_PORT, &GPIO_InitStruct);

 

/* SPI MOSI GPIO pin configuration  */

GPIO_InitStruct.Pin = SPI_XPT2046_MOSI_PIN;

GPIO_InitStruct.Alternate = SPI_XPT2046_MOSI_AF;

HAL_GPIO_Init(SPI_XPT2046_MOSI_GPIO_PORT, &GPIO_InitStruct);

 

/* SPI nCS GPIO pin configuration  */

GPIO_InitStruct.Pin = SPI_XPT2046_nCS_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(SPI_XPT2046_nCS_GPIO_PORT, &GPIO_InitStruct);

 

}

 

/**

  * @brief SPI MSP De-Initialization 

  *        This function frees the hardware resources used in this example:

  *          - Disable the Peripheral's clock

  *          - Revert GPIO configuration to its default state

  * @param hspi: SPI handle pointer

  * @retval None

  */

void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)

{

if(SPI_XPT2046 != hspi->Instance)

{

return ;

}


/*##-1- Reset peripherals ##################################################*/

SPI_XPT2046_FORCE_RESET();

SPI_XPT2046_RELEASE_RESET();

 

/*##-2- Disable peripherals and GPIO Clocks ################################*/

/* Configure SPI SCK as alternate function  */

HAL_GPIO_DeInit(SPI_XPT2046_SCK_GPIO_PORT, SPI_XPT2046_SCK_PIN);

/* Configure SPI MISO as alternate function  */

HAL_GPIO_DeInit(SPI_XPT2046_MISO_GPIO_PORT, SPI_XPT2046_MISO_PIN);

/* Configure SPI MOSI as alternate function  */

HAL_GPIO_DeInit(SPI_XPT2046_MOSI_GPIO_PORT, SPI_XPT2046_MOSI_PIN);

/* Configure SPI nCS as alternate function  */

HAL_GPIO_DeInit(SPI_XPT2046_nCS_GPIO_PORT, SPI_XPT2046_nCS_PIN);

}

/**********************************************************************

函数:SPI3_Init()

函数作用:SPI3初始化

参数:无

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-31

说明: SPI3使用的时钟为APB1,在时钟初始化时该时钟为

32MHz,跟xpt2046通信设置成2MHz速率,CLK空闲状态为低

电平,数据在时钟上升沿锁存,8bit数据位,MSB,主模式

**********************************************************************/

void SPI3_Init(void)

{

/* Set the SPI parameters */

spi_xpt_Handle.Instance               = SPI_XPT2046;

 

spi_xpt_Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;

spi_xpt_Handle.Init.Direction         = SPI_DIRECTION_2LINES;

spi_xpt_Handle.Init.CLKPhase          = SPI_PHASE_1EDGE;

spi_xpt_Handle.Init.CLKPolarity       = SPI_POLARITY_LOW;

spi_xpt_Handle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLED;

spi_xpt_Handle.Init.CRCPolynomial     = 7;

spi_xpt_Handle.Init.DataSize          = SPI_DATASIZE_8BIT;

spi_xpt_Handle.Init.FirstBit          = SPI_FIRSTBIT_MSB;

spi_xpt_Handle.Init.NSS               = SPI_NSS_SOFT;

spi_xpt_Handle.Init.TIMode            = SPI_TIMODE_DISABLED;

spi_xpt_Handle.Init.NSSPMode          = SPI_NSS_PULSE_DISABLED;

spi_xpt_Handle.Init.CRCLength         = SPI_CRC_LENGTH_8BIT;

spi_xpt_Handle.Init.Mode   = SPI_MODE_MASTER;


HAL_SPI_Init(&spi_xpt_Handle);//初始化spi

return ;

}

 

/**********************************************************************

函数:SPI3_Write()

函数作用:SPI3发送一个字节数据

参数:

uint8_t value----------------------------待发送的字节数据

返回值:0:成功-1:失败

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-31

说明: SPI3通信超时时间为1S

**********************************************************************/

int8_t SPI3_Write(uint8_t value)

{

HAL_StatusTypeDef status = HAL_OK;

 

status = HAL_SPI_Transmit(&spi_xpt_Handle, &value, 1, SPI_XPT2046_TIMEOUT);

 

/* Check the communication status */

if(status != HAL_OK)

{

return (int8_t)-1;

}


return 0;

}

/**********************************************************************

函数:SPI3_Read()

函数作用:SPI3接收一个16bit数据

参数:

uint8_t *value------------------------------接收数据的地址

返回值:0:成功-1:失败

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-31

说明: SPI3通信超时时间为1S

**********************************************************************/

int8_t SPI3_Read(uint8_t *readvalue)

{

HAL_StatusTypeDef status = HAL_OK;

uint8_t writevalue = 0x00;

 

status = HAL_SPI_TransmitReceive(&spi_xpt_Handle, &writevalue, readvalue, 1, SPI_XPT2046_TIMEOUT);

 

/* Check the communication status */

if(status != HAL_OK)

{

return (int8_t)-1;

}

 

return 0;

}


SPI通信完成之后还有两个引脚接口BUSY和PENIRQ,声明如下


#define TOUCHPANEL_PEN_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()

#define TOUCHPANEL_BUSY_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()

#define TOUCHPANEL_PEN_PIN GPIO_PIN_2

#define TOUCHPANEL_PEN_GPIO_PORT GPIOC

#define TOUCHPANEL_BUSY_PIN GPIO_PIN_3

#define TOUCHPANEL_BUSY_GPIO_PORT GPIOC

 

#define TOUCHPANEL_BUSY_Read() (GPIOC->IDR & GPIO_PIN_3)

//#define TOUCHPANEL_PEN_Read() (GPIOC->IDR & GPIO_PIN_2)

 

#define TOUCHPANEL_BUSY (GPIO_PIN_3)

#define TOUCHPANEL_IDLE (0x00)


接口初始化如下


/**********************************************************************

函数:HAL_TouchPanel_MspInit()

函数作用:触摸屏端口资源初始化

参数:无

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-31

说明: 这里端口是PEN口和BUSY口其他口都是spi通讯口

**********************************************************************/

void HAL_TouchPanel_MspInit(void)

{

GPIO_InitTypeDef  GPIO_InitStruct;

   

/*##-1- Enable peripherals and GPIO Clocks #################################*/

/* Enable GPIO  clock */

TOUCHPANEL_PEN_GPIO_CLK_ENABLE();

TOUCHPANEL_BUSY_GPIO_CLK_ENABLE();

 

/*##-2- Configure peripheral GPIO #######################################*/  

/* PEN GPIO pin configuration  */

GPIO_InitStruct.Pin       = TOUCHPANEL_BUSY_PIN;

GPIO_InitStruct.Mode      = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull      = GPIO_PULLUP;

GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

GPIO_InitStruct.Pin   = TOUCHPANEL_BUSY_PIN;

HAL_GPIO_Init(TOUCHPANEL_BUSY_GPIO_PORT, &GPIO_InitStruct);

 

GPIO_InitStruct.Pin   = TOUCHPANEL_PEN_PIN;

GPIO_InitStruct.Mode   = GPIO_MODE_IT_FALLING;

HAL_GPIO_Init(TOUCHPANEL_PEN_GPIO_PORT, &GPIO_InitStruct);


/*Enable an set EXTI line 2 Interrupt to the lowest priority*/

HAL_NVIC_SetPriority(EXTI2_TSC_IRQn,2,0);

HAL_NVIC_EnableIRQ(EXTI2_TSC_IRQn);

return ;

}

/**********************************************************************

函数:TouchPanel_Init()

函数作用:触摸屏初始化

参数:无

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-31

说明: 

**********************************************************************/

void TouchPanel_Init(void)

{

HAL_TouchPanel_MspInit();//初始化io口资源

SPI_XPT2046_nCS_Set_High();//片选拉高

}


这里配置PENIQR为中断引脚,下降沿有效,XPT2046的命令只有一条


MSB一直为1,MODE=012bit转换模式,SER/DFR=0:差分模式转换,文档中提到在测量X、Y坐标时首选差分模式,PD1,PD0=0,A2、A1、A0说明如下



001是测量X坐标,101是测量Y坐标


构造一个采样点结构体,存储测量值,如下



typedef struct

{

uint16_t sample_x;

uint16_t sample_y;

}Touch_Point;


读取测量值如下


/**********************************************************************

函数:TouchPanel_GetPoint()

函数作用:获取触摸点

参数:无

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-31

说明: 

**********************************************************************/

int8_t TouchPanel_GetPoint(Touch_Point *touch_point)

{

uint8_t sample_value_h=0,sample_value_l=0;


SPI_XPT2046_nCS_Set_Low();

 

if(SPI3_Write(0x90) != 0)//测量Y-

{

return (int8_t)-1;

}

 

if(0 != SPI3_Read(&sample_value_h))

{

printf("read err1\r\n");

}

if(0 != SPI3_Read(&sample_value_l))

{

printf("read err1\r\n");

}

touch_point->sample_x = ((sample_value_h&0x7F)<


if(0 != SPI3_Write(0xD0))//测量X-

{

printf("write err2\r\n");

}

sample_value_h = 0;

sample_value_l = 0;

if(0 != SPI3_Read(&sample_value_h))

{

printf("read err2\r\n");

}

if(0 != SPI3_Read(&sample_value_l))

{

printf("read err2\r\n");

}

touch_point->sample_y = ((sample_value_h&0x7F)<


SPI_XPT2046_nCS_Set_High();

 

return 0;


}

uint8_t flag = 0;

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

{

switch(GPIO_Pin)

{

case TOUCHPANEL_PEN_PIN:

flag = 1;

break;

default:

break;

}

}

 

/**********************************************************************

函数:EXTI2_TSC_IRQHandler()

函数作用:EXTI2_TSC中断响应函数

参数:无

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-08-10

说明: 只处理EXTI2中断

**********************************************************************/

void EXTI2_TSC_IRQHandler(void)

{

HAL_GPIO_EXTI_IRQHandler (TOUCHPANEL_PEN_PIN);

}


在读取测量值时需要注意测量的结果是12bit,在时序图中可以看到,一共24个时钟,前8个时钟是发送控制命令,第9个时钟无效,接着的12个时钟为有效数据,最后3个时钟为空闲时钟,因此数据的高位和地位需要正确的组合。时序说明如下

在主循环中代码如下



while(1)

{

if(flag)

{

//PEN为低电平表示有触摸点

printf("get the touch!\r\n");

TouchPanel_GetPoint(&touch_point);

printf("sample y:%04X\r\n",touch_point.sample_y);

printf("sample x:%04X\r\n",touch_point.sample_x);

flag = 0;

}

}


测试结果如下:


现在只是获取了采样值还没有转换成X、Y坐标,同时对于电阻屏来说第一步就是校正,关于校正流程网上有很多资源,做完这些下面就可以使用STemWin来制作图形界面了,使用STemWin可以很方便我们做出丰富的界面。

关键字:STM32  TFT  触摸屏 引用地址:STM32 TFT学习笔记——触摸屏

上一篇:STM32 USB学习笔记1
下一篇:STM32 TFT学习笔记——刷图

推荐阅读最新更新时间:2024-03-16 16:25

STM32学习之:IAR中确认某段代码的执行时间
1.接出来一个I/O口,然后设置反转,用示波器查看反转周期。 2.软件仿真时计算两断点CYCLECOUNTER(在CPU registers中)的差值,乘以指令周期(MCLK)便是执行时间。
[单片机]
stm32定时器外部时钟3使用外部时钟源模式2进行定时的步骤
stm32中的通用定时器的计数时钟有三种,内部时钟、外部时钟源、内部触发输入这三种,其中内部时钟是大家都比较常用的,也是在应用中比较多的,我们现在主要来讲一下外部时钟源的模式2外部时钟模式2:外部触发输入。 编程步骤: 配置TIM3_ETR引脚为输入引脚PD2,硬件上需要将脉冲连接到该引脚,我这里是使用6.78MHz的晶振 配置定时器3:包括使能定时器3对应的时钟引脚,配置定时器3的周期、预分频参数 因为我们使用了定时器3中断,所以需要给定时器设置优先级,在timerx_nvic_init()中的关于TIM3部分操作 将SMCR中的ETF、ETPS、ETP和ECE进行配置 执行完了以上步骤之后还需要操作triggle中断
[单片机]
STM32学习手记②-USART中断
/************************************ * 文件名: main.c * 内容简述: 本例程演示如何操作USART的接收程序(中断模式)。 * 用串口调试软件向开发板发送一字节,开发板会将该字节反发回PC */ #include stm32f10x_lib.h /*************************************************** * 函数名称 :void RCC_Configuration() * 功能描述 : 复位和时钟控制 配置 * 参数 : 无 * 返回值 : 无 * 全局变量 : 无 * 全局静态变量: 无 * 局部静态变量: 无 ***
[单片机]
STM32STM32之LED
一、简介 本文介绍如何使用STM32控制LED,含亮、灭、定时亮、亮度取反四种模式。 本文IO口使用PB12。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板 仿真器:JLINK 三、版权声明 博主:甜甜的大香瓜 声明:喝水不忘挖井人,转载请注明出处。 原文地址:http://blog.csdn.NET/feilusia 联系方式:897503845@qq.com 香瓜BLE之CC2541群:127442605 香瓜BLE之CC2640群:557278427 香瓜BLE之
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>之LED
国内首条宽幅TFT偏光片正式投产
2011年10月28日上午,礼花绽放、锣鼓齐鸣,伴着蓝天白云,和着铿锵有力的乐曲节奏,国内首条宽幅(1490mm)TFT型偏光片生产线投产典礼在深圳市三利谱光电科技有限公司厂房内隆重举行。 来自国家相关部委领导、地方政府部门领导、相关院校研究机构代表、国内外知名企业代表以及三利谱光电科技供应商、客户代表约200多人共同出席了此次投产典礼。 根据三利谱光电科技股份有限公司董事长兼总经理张建军先生介绍,两年来,三利谱光电科技通过公司通过自主创新,不断打破各种技术壁垒,成功建成国内首条宽幅(1490mm)TFT型偏光片生产线。新的TFT偏光片项目主体设备全部自行设计,然后委外加工,拥有完全自主的技术及知识产权,相比全部采购进
[手机便携]
STM32 ADC转换时间
STM32F103XX的ADC的采样时钟最快14MHz,最快采样率1MHz。 ADC时钟: 这个ADC时钟是从哪来的呢。我们看下面这个STM32的时钟结构图: 我们大多使用STM32的最快PCLK2系统时钟72MHz。 ADCCLK的时钟由72MHz的6分频能瞒住14MHz以下的要求 为12MHz。 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M ADC转换时间: 有如下公式: TCONV = 采样时间+ 12.5 个周期 其中12.5个周期是采集12位AD时间是固定的,另外一个采样时间可以取下面几个参数由SMPx 寄存器控制,每个通道可以单独配置
[单片机]
<font color='red'>STM32</font> ADC转换时间
电容式触摸屏结构技术与工艺分析
  手机产品的智能化与平板电脑等新型应用产品的快速成长,使 触摸屏 需求呈现急剧上升,因而市场也正快速成长。技术方面,尤其由智能手机与平板电脑中使用的电容式(PROCAP; Projected Capacitive)触摸屏需求正直线上升。相关产业从表面来看正在平稳成长,但细细观察其内部不难发现其中隐藏着许多待解决的技术问题。尤其,对于多种 电容式触摸屏 的结构,各企业都采用不同的方法进行研发,以希望透过企业独有的顶尖且差异化的核心技术来拓展市场。   电容式触摸屏正向玻璃屏幕一体化触摸产品发展。G2(或者DPW、TOC)结构是触摸屏中 光学 与触摸性能最为理想的产品。但为了实现这个目标,不仅要满足其性能要求,也要同时具备提
[电源管理]
电容式<font color='red'>触摸屏</font>结构技术与工艺分析
STM32电源管理系统浅谈
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。 STM32的电源管理系统主要分为: 1、备份域 2、调压器供电电路 3、ADC电源电路 备份域电路 STM32的备份域包括LSE振荡器、RTC、备份寄存器及备份SRAM这些器件,这部分的电路可以通过STM32的VBAT引脚获取供电电源,在实际应用中一般会使用3V的钮扣电
[单片机]
<font color='red'>STM32</font>电源管理系统浅谈
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved