前面的文章MCU编程9:在STM32F429上移植LVGL,我们通过LVGL的移植说明移植了几个简单的显示例程,暂时未添加LVGL的输入功能。所以这次我们来把触摸屏的输入功能添加到我们之前的工程中,以便可以实现通过触摸屏的输入信号来触发LVGL的输入事件,实现更多功能。
STM32F429I-DISCO开发板上使用的电阻式触摸屏的触摸控制芯片是STMPE811,我们可以直接从ST的官方例程代码中移植该芯片对应的触摸屏驱动代码。
我们依然在自己工程STM32F429I_PRJ上移植对应的代码。具体的移植操作步骤如下。
stmpe811.c和stmpe811.h从ST的官方例程目录Drivers\BSP\Components\stmpe811拷贝到我们自己工程的Drivers\BSP\STM32F429I-Discovery目录下。这2个文件包含了触摸屏触摸控制芯片STMPE811所有操作接口。stm32f429i_discovery_ts.c和stm32f429i_discovery_ts.h文件也拷贝到我们自己工程的Drivers\BSP\STM32F429I-Discovery目录下。这2个文件封装了STMPE811芯片操作的一些接口,我们后续对该芯片进行初始化以及读取芯片的坐标时,直接调用这里的接口即可。stm32f429i_discovery_io.c和stm32f429i_discovery_io.h文件,所以我们还需要将ST的官方例程目录Drivers\BSP\STM32F429I-Discovery下的这2个文件也移植到我们的STM32F429I-Discovery目录下。这2个文件主要用于操作STMPE811芯片的GPIO口。io.h和ts.h文件拷贝到我们自己工程的Drivers\BSP\STM32F429I-Discovery目录下。这2个头文件包含了触摸屏和IO驱动的相关类型定义和函数声明。前面移植的文件需要依赖这2个头文件。通过以上步骤的操作,我们所需要的触摸屏触摸驱动的代码文件就已经准备就绪,接着我们继续实现触摸屏触摸输入的功能。
为了实现触摸屏触摸输入的功能,我们还需要编写一些代码。对应的操作如下所述。
main.c文件的vInitPeripheral()函数中调用BSP_TS_Init()函数进行初始化即可。该函数需要输入TFT LCD显示屏的分辨率。具体代码如下。void vInitPeripheral(void){// 此处省略其他设备的初始化/* Initialize the Touch screen */BSP_TS_Init(TFT_HOR_RES, TFT_VER_RES);}
lcd_func.c文件中预留了触摸屏输入的接口函数。这里需要实现这些函数的实际功能。先在该文件中包含头文件#include "stm32f429i_discovery_ts.h",接着修改my_touch_is_pressed()和my_touch_read_cb()函数即可。修改后的函数代码如下。int32_tmy_touch_is_pressed(TS_StateTypeDef *TsState){BSP_TS_GetState(TsState);return TsState->TouchDetected;}staticvoidmy_touch_read_cb(lv_indev_t * indev, lv_indev_data_t * data){TS_StateTypeDef TsState = {0};if (my_touch_is_pressed(&TsState)){data->point.x = (int32_t)TsState.X;data->point.y = (int32_t)TsState.Y;data->state = LV_INDEV_STATE_PRESSED;}else{data->state = LV_INDEV_STATE_RELEASED;}}
my_touch_is_pressed()函数通过调用BSP_TS_GetState()接口函数来获取触摸屏的触摸输入状态和触摸输入的坐标位置。my_touch_read_cb()函数通过调用my_touch_is_pressed()函数将触摸屏的触摸状态和触摸坐标传递给LVGL。
完成以上函数修改后,我们就可以实现触摸屏的输入功能了。然后我们再把vLvglCfg()函数中的checkbox对应的代码打开,方便我们后面验证触摸屏的输入是否生效。
为了确保编译链接能够正常执行,需要对CMakeLists.txt进行修改,主要添加触摸屏驱动所需的源代码路径。
我们只需要在DRV_SRCS中添加以下源文件路径即可。
file(GLOB DRV_SRCS# 此处省略其他源文件包含${PROJECT_SOURCE_DIR}/../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c${PROJECT_SOURCE_DIR}/../Drivers/BSP/STM32F429I-Discovery/stmpe811.c${PROJECT_SOURCE_DIR}/../Drivers/BSP/STM32F429I-Discovery/stm32f429i_discovery_io.c${PROJECT_SOURCE_DIR}/../Drivers/BSP/STM32F429I-Discovery/stm32f429i_discovery_ts.c)
使用Ctrl+Shift+B的快捷键或者Terminal/Run Build Task...菜单执行代码的编译链接操作。
如果想了解详细的编译和运行操作,可以参考之前的文章MCU编程3:使用VS Code+GCC+OpenOCD搭建MCU程序开发环境(下)。
开发板通过USB线连接到电脑的USB口,这时开发板正常上电,按下F5快捷键或Run/Start Debugging菜单执行代码在线调试,VS Code会自动通过ST-Link将代码下载到开发板的MCU上,并暂停在main()函数的开始处,再次按下F5按键全速运行代码即可。
这里运行了LVGL的复选框checkbox的例程代码,我们可以在触摸屏上点击对应的复选框,复选框的选择状态会跟着变化,说明触摸屏输入正常。对应的执行结果如下。
更新后的工程代码依然保存在gitee的以下路径。
https://gitee.com/goodrenze/STM32F429I_PRJ