Найти в Дзене
VadRov

Драйвер контроллера тачскрина XPT2046 для микроконтроллеров серии STM32G0

Драйвер контроллера XPT2046 (совместим с HR2046 и другими аналогами) поддерживает весь функционал контроллера: работа с сенсорным резистивным экраном, измерение температуры встроенным датчиком, измерение напряжения на входах VBAT и AUX. Драйвер реализован на CMSIS и может быть использован в программах пользователя независимо от уровней абстракции (HAL, LL) иных участков кода. Функции и особенности: #include "xpt2046.h" 2. Добавьте в обработчик прерывания SysTick_Handler вызов: XPT2046_TIMCallback(touch); 3. Добавьте в обработчик внешнего прерывания EXTIxx_IRQHandler (xx определяет линию прерывания) вызов: XPT2046_EXTICallback(touch); 1. Подключите заголовочный файл драйвера: #include "xpt2046.h" 2. Объявите переменную обработчика XPT2046 (в зависимости от варианта использования, возможно, потребуется сделать ее глобальной переменной): XPT2046_Handler touch1; 3. Определите параметры подключения контроллера XPT2046 к микроконтроллеру: //Будем обмениваться данными с XPT2046 на скорости

Драйвер контроллера XPT2046 (совместим с HR2046 и другими аналогами) поддерживает весь функционал контроллера: работа с сенсорным резистивным экраном, измерение температуры встроенным датчиком, измерение напряжения на входах VBAT и AUX.

Драйвер реализован на CMSIS и может быть использован в программах пользователя независимо от уровней абстракции (HAL, LL) иных участков кода.

Функции и особенности:

  • Опрос сенсорного экрана (в прерывании и в программе пользователя) с получением информации о координатах и ​​длительности касания;
  • Определение статуса текущего касания сенсорного экрана: нет касания, клик, удержание;
  • Измерение температуры встроенным в чип контроллера датчиком;
  • Измерение напряжения аккумуляторной батареи на входе контроллера VBAT (7 вывод м/с в корпусе TSSOP-16);
  • Измерение напряжения на входе AUX контроллера (8 вывод м/с в корпусе TSSOP-16).
  • Допускает подключение к одному SPI нескольких устройств.

Как использовать:

  • В среде STM32CubeIDE (или иной) создайте новый проект для вашего микроконтроллера stm32G0x. Выполните общую настройку проекта (тактирование, периферия, отладка и т. д.). Определите spi для работы с контроллером XPT2046. Если к этому spi будет подключено еще одно устройство, например дисплей, то настройте spi (задайте параметры spi) для этого устройства. Настройки spi для XPT2046 применит сам драйвер. При этом помните, что XPT2046 требует 4-проводной spi (полнодуплексный режим). Определите выводы микроконтроллера T_CS (выход, режим GPIO -> Output Push Pull) и T_IRQ (вход с внешним прерыванием по заднему фронту, режим GPIO -> внешний режим прерывания с триггером по заднему фронту). Подтяните вывод T_CS к питанию с помощью внутренней подтяжки (Pull-up). Если к одному spi подключено несколько устройств, то также подтяните выводы CS других устройств к питанию (Pull up). Кроме того, установите начальный высокий уровень на всех выходах CS (GPIO output level -> High). Подтяните вывод T_IRQ к питанию с помощью внутренней подтяжки (Pull-up), если на вашей плате нет резистора, который подтягивает вывод PENIRQ контроллера XPT2046 к питанию (как правило, это резистор номиналом 40-50 кОм). Установите скорость выводов CS на High, скорость линий spi (MOSI, MISO, SCK) на Very High.
  • В файле stm32g0xx_it.c
  1. Подключите заголовочный файл драйвера:
#include "xpt2046.h"

2. Добавьте в обработчик прерывания SysTick_Handler вызов:

XPT2046_TIMCallback(touch);

3. Добавьте в обработчик внешнего прерывания EXTIxx_IRQHandler (xx определяет линию прерывания) вызов:

XPT2046_EXTICallback(touch);
  • В вашей программе:

1. Подключите заголовочный файл драйвера:

#include "xpt2046.h"

2. Объявите переменную обработчика XPT2046 (в зависимости от варианта использования, возможно, потребуется сделать ее глобальной переменной):

XPT2046_Handler touch1;

3. Определите параметры подключения контроллера XPT2046 к микроконтроллеру:

//Будем обмениваться данными с XPT2046 на скорости 2 Мбит/с: 64 MHz / 32 = 2 MHz (по спецификации максимум 2.0 Мбит/с).
XPT2046_ConnectionData cnt_touch = {
.spi = SPI1, //Используемый spi
.speed = 4, //Скорость spi 0...7 (0 - clk/2, 1 - clk/4, ..., 7 - clk/256)
.cs_port = T_CS_GPIO_Port, //Порт для управления T_CS
.cs_pin = T_CS_Pin, //Вывод порта для управления T_CS
.irq_port = T_IRQ_GPIO_Port, //Порт для управления T_IRQ
.irq_pin = T_IRQ_Pin, //Вывод порта для управления T_IRQ
.exti_irq = T_IRQ_EXTI_IRQn //Канал внешнего прерывания
};

4. Инициализируйте обработчик XPT2046:

XPT2046_InitTouch(&touch1, 20, &cnt_touch);

Параметр 20 определяет период счета внутреннего таймера обработчика. Таймер обработчика привязан к системному счетчику/таймеру (SysTick), который должен быть настроен на генерацию прерываний 1000 раз в секунду:

//настраиваем системный таймер (прерывания 1000 раз в секунду)
SysTick_Config(SystemCoreClock/1000);

Таким образом, сенсорный экран будет опрашиваться в прерывании 1000/20 = 50 раз в секунду.

5. Откалибруйте сенсорный экран:

XPT2046_CalibrateTouch(&touch1, lcd); //запуск калибровки

Сенсорный экран может быть опрошен в прерывании драйвера (touch1.fl_interrupt = 1) или в пользовательской программе (touch1.fl_interrupt = 0). Если опрос выполняется вне прерывания драйвера, то в пользовательской программе перед получением статуса и координат касания необходимо периодически осуществлять вызов:

uint8_t res = XPT2046_GetTouch(&touch1); //res = 0 - опрос выполнен успешно, res = 1 - нет касания, res = 2 - spi занято другим устройством
  • Чтобы получить координаты касания:
tPoint point_d; //координата точки на дисплее, соответствующая точке касания тачскрина
XPT2046_ConvertPoint(&point_d, &touch1.point, &touch1.coef); //преобразование координат тачскрина в дисплейные координаты

Текущий статус касания определяется переменной touch1.status:

- Если touch1.status = XPT2046_STATUS_NOCLICK, то нет касания;

- Если touch1.status = XPT2046_STATUS_CLICK - есть клик;

- Если touch1.status = XPT2046_STATUS_HOLD - есть удержание.

Время для перехода касания из статуса «клик» в состояние «удержание» определяется параметром XPT2046_TOUCH_HOLD_TIME (см. файл xpt2046.h).

То есть типовая форма опроса тачскрина в прерывании выглядит так:

Типовая форма опроса тачскрина в прерывании
Типовая форма опроса тачскрина в прерывании

Соответственно, типовая форма опроса тачскрина вне прерывания выглядит так:

Типовая форма опроса тачскрина вне прерывания
Типовая форма опроса тачскрина вне прерывания

Изображение на дисплейном модуле с контроллерами ILI9341 и XPT2046 при выполнении программы рисования стилусом.
Изображение на дисплейном модуле с контроллерами ILI9341 и XPT2046 при выполнении программы рисования стилусом.
Проект собран для микроконтроллера stm32G031F6P6 ( STM32G0xx Core Board ).
Проект собран для микроконтроллера stm32G031F6P6 ( STM32G0xx Core Board ).

Прилагаемый проект собран в STM32CubeIDE для микроконтроллера STM32G031F6P6. Использовалась плата разработки STM32G0xx Core Board от WeAct на базе данного м/к.

Ниже приведена таблица подключений дисплейного модуля ILI9341 к плате разработки на базе микроконтроллера STM32G031F6P6:

Таблица подключений дисплейного модуля ILI9341 к плате разработки на базе микроконтроллера STM32G031F6P6
Таблица подключений дисплейного модуля ILI9341 к плате разработки на базе микроконтроллера STM32G031F6P6

Проект с драйверами тачскрина и дисплея с демонстрационными подпрограммами доступен на гитхабе:

GitHub - vadrov/stm32g031f6p6_spi_dma_ili9341_xpt2046_demo: XPT2046 controller driver (HR2046 and other compatible) for STM32G0 series. Supports all the functionality of the controller: work with the touchscreen, temperature measurement by an internal sensor, voltage measurement at the VBAT and AUX inputs.