【海东青电子原创文章,转载请注明出处:https://www.jianshu.com/p/b13d06dcf4a6】
在《使用STM32CubeMX创建TouchGFX应用程序(三)-- 从零配置》中,完成了从零配置TouchGFX、显示一幅图片的任务,遗留了最后的工作:驱动触摸屏。STM32F746G-DISCO开发板板载的是型号为 RK043FN48H 的显示器、触屏模组,触屏IC型号为 FT5336GQQ:
FT5336通过I2C接口与MCU通讯(报告触点的x、y坐标),并且通过一根INT中断线可以向MCU产生中断(在IIC中,触屏是slave地位,作为master的MCU可以利用中断触发IIC通讯、读取x、y坐标),参见746G-DISCO 原理图:
注意:触屏的I2C地址是0x70(见本文末尾对该地址的讨论)。看看I2C使用了哪些pin:
用了PH7、PH8,查询它们的I2C功能复用知,使用的746芯片的I2C3 。INT中断信号接的是PI13,其外部中断源是EXTI[15:10]。
触屏的复位信号见下:
由图可见触屏的复位信号与MCU公用,不需单独处理。了解了硬件连接原理后,我们需要做2件事情:1)使用CubeMX配置I2C3和EXTI;2)移植 FT5336触屏驱动;3)添加一个按钮,验证触屏可以正常工作。
打开《使用STM32CubeMX创建TouchGFX应用程序(三)-- 从零配置》中生成的CubeMX文件,添加I2C3的配置:
修改I2C3的管脚映射:
使能EXTI中断(事后对TouchGFX生成的按钮应用验证,此中断不配置也可)。查看 FT5336手册,INT低电平有效:
/INT代表低电平有效,配置管脚 PI13:
NVIC看起来是这个样子滴:
在CubeMX中生成IAR代码。然后,启动 TouchGFX Designer 编辑本工程中显示的图片,添加一个 Toggle Button 控件:
至此,准备工作做好了,下面移植触屏驱动代码。ST在Cube库中已经为我们写好了这些驱动,放在F7 Cube库的BSP目录下:
我们需要的文件在上图中的 STM32746G-Discovery 和 Components 2个目录中。 STM32746G-Discovery 目录下使用4个文件:
其中,stm32746g_discovery.c 是BSP主文件,是使用BSP时的首选文件。因为我们要驱动触屏,所以 stm32746g_discovery_ts.c 也是必须。此外,还需要FT5336芯片的驱动文件:
以及触屏的头文件 ts.h,它包含有关于触屏声明的数据类型:
在IAR工程中的Drivers 目录下,对应地创建上述BSP等目录、并对应地copy 文件:
并将这些 .c文件添加到IAR工程中:
添加头文件路径:
编译,可能会报错,因为 stm32746g_discovery.c 文件中包含了串口等通用外设的初始化函数,如 BSP_COM_Init中() 等,本工程中并未用到、注释掉即可。生成目标文件、烧写目标板,会发现点击按钮没有反应!因为还有一步工作要做:处理TouchgGFX框架中的 STM32F7TouchController.cpp 文件:
该文件对触屏做初始化、并采样触点坐标。但是,TouchGFX Designer 自动生成此文件时,是不知道用户具体的工程是否一定使用触屏,所以初始化和采样函数是被注释掉的:
就是说,触屏处理函数没起作用,所以点击按钮无效!去除这些注释,并添加一个头文件:
再次编译、烧写,按下按钮的 ON 和 OFF,按钮做相应变化,说明触屏工作正常了:
按下 ON:
按下 OFF:
完整的代码下载地址:https://github.com/haidongqing/cube-tgfx-ts 。
(完)
补充:关于触屏I2C的地址。
由图二知道I2C地址为0x70,但在图五最后一行的 Primary slave address 中,保留了系统默认值0x00,而不是0x07,为什么TouchGFX仍然可以正确访问触屏呢?原来在移植触屏驱动时,ST给出的BSP中已经约定了I2C的地址:
严格来讲,在图五中配置I2C时,应该将 Primary slave address 设置为 0x70。
延申阅读:《STM32基础--I2C与触摸屏驱动》。
(完)