Урок 72
Часть 2
Touch panel FT5336
В предыдущей части занятия мы настроили проект, написали некоторые служебные функции, а также функцию инициализации нашего тачскрина.
Отключим прерывания в микросхеме
tsOrientation = TS_SWAP_XY;
//Configure the FT5336 device to stop generating IT on the given INT pin
regValue = (FT5336_G_MODE_INTERRUPT_POLLING & (FT5336_G_MODE_INTERRUPT_MASK >> FT5336_G_MODE_INTERRUPT_SHIFT)) << FT5336_G_MODE_INTERRUPT_SHIFT;
TS_IO_Write(TS_I2C_ADDRESS, FT5336_GMODE_REG, regValue);
}
Занесём в структуру усешную инициализацию контроллера тачскрина
TS_IO_Write(TS_I2C_ADDRESS, FT5336_GMODE_REG, regValue);
ft5336_handle.i2cInitialized = FT5336_I2C_INITIALIZED;
}
На этом функция инициализации завершена.
Давайте немного отдохнём от библиотеки тачскрина и напишем заготовку для теста в бесконечном цикле функции main(). Мы не будем трогать никакие наши прошлые тесты, а добавим тест вначале цикла, мы будем висеть в этом тесте, пока не нажмём синюю кнопку. Для этого сначала напишем функцию отслеживания нажатия этой кнопки до функции записи файла Bmp в SDRAM
/* USER CODE BEGIN 0 */
uint8_t CheckForUserInput(void)
{
if (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_11) != GPIO_PIN_RESET)
{
HAL_Delay(10);
while (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_11) != GPIO_PIN_RESET);
return 1 ;
}
return 0;
}
//---------------------------------------------------------------------------
uint32_t OpenBMP(uint8_t *ptr, const char* fname)
А вот теперь в бесконечном цикле напишем заготовку для нашего будущего теста
/* USER CODE BEGIN 3 */
//ts test
TFT_FillScreen(LCD_COLOR_BLACK);
TFT_SetFont(&Font20);
TFT_SetTextColor(LCD_COLOR_MAGENTA);
TFT_SetBackColor(LCD_COLOR_BLACK);
TFT_DisplayString(0, 5, (uint8_t *)"TS TEST", CENTER_MODE);
TFT_SetFont(&Font16);
TFT_SetTextColor(LCD_COLOR_DARKGREEN);
TFT_DisplayString(0, 27, (uint8_t *)"Click the custom button to continue", CENTER_MODE);
while(CheckForUserInput()==0)
{
HAL_Delay(10);
}
TFT_FillScreen(LCD_COLOR_BLACK);
//вывод на экран отдельных символов
TFT_SetFont(&Font24);
Соберём код, запустим его и убедимся, что наша кнопка работает.
Добавим ещё одну структуру в файл ft5336.h
} ft5336_handle_TypeDef;
//------------------------------------------
typedef struct
{
uint8_t touchDetected; /*!< Total number of active touches detected at last scan */
uint16_t touchX[TS_MAX_NB_TOUCH]; /*!< Touch X[0], X[1] coordinates on 12 bits */
uint16_t touchY[TS_MAX_NB_TOUCH]; /*!< Touch Y[0], Y[1] coordinates on 12 bits */
uint8_t touchWeight[TS_MAX_NB_TOUCH]; /*!< Touch_Weight[0], Touch_Weight[1] : weight property of touches */
uint8_t touchEventId[TS_MAX_NB_TOUCH]; /*!< Touch_EventId[0], Touch_EventId[1] : take value of type @ref TS_TouchEventTypeDef */
uint8_t touchArea[TS_MAX_NB_TOUCH]; /*!< Touch_Area[0], Touch_Area[1] : touch area of each touch */
uint32_t gestureId; /*!< type of gesture detected : take value of type @ref TS_GestureIdTypeDef */
} TS_StateTypeDef;
//------------------------------------------
Ещё добавим перечисление
} TS_StateTypeDef;
//------------------------------------------
typedef enum
{
TS_OK = 0x00, /*!< Touch Ok */
TS_ERROR = 0x01, /*!< Touch Error */
TS_TIMEOUT = 0x02, /*!< Touch Timeout */
TS_DEVICE_NOT_FOUND = 0x03 /*!< Touchscreen device not found */
}TS_StatusTypeDef;
//------------------------------------------
В файл ft5336.c добавим функцию считывания статуса тачскрина
//----------------------------------------
uint8_t TS_GetState(TS_StateTypeDef *TS_State)
{
static uint32_t _x[TS_MAX_NB_TOUCH] = {0, 0};
static uint32_t _y[TS_MAX_NB_TOUCH] = {0, 0};
uint8_t ts_status = TS_OK;
uint16_t x[TS_MAX_NB_TOUCH];
uint16_t y[TS_MAX_NB_TOUCH];
uint16_t brute_x[TS_MAX_NB_TOUCH];
uint16_t brute_y[TS_MAX_NB_TOUCH];
uint16_t x_diff;
uint16_t y_diff;
uint32_t index;
uint32_t weight = 0;
uint32_t area = 0;
uint32_t event = 0;
}
//----------------------------------------
Добавим на данную функцию прототип в заголовочном файле, затем перейдём в файл main.c, увеличим размер глобальной строковой переменной и добавим ещё одну глобальную переменную
char str1[30];
static TS_StateTypeDef TS_State;
/* USER CODE END PV */
Продолжим наш тест и добавим туда вызов только что написанной функции и условие с телами
while(CheckForUserInput()==0)
{
TS_GetState(&TS_State);
if(TS_State.touchDetected)
{
}
else
{
}
HAL_Delay(10);
Вернёмся в файл ft5336.c и добавим в там функцию отслеживания использования тачскрина после функции чтения идентификатора
//----------------------------------------
uint8_t TS_DetectTouch(uint16_t DeviceAddr)
{
volatile uint8_t nbTouch = 0;
nbTouch = TS_IO_Read(DeviceAddr, FT5336_TD_STAT_REG);
nbTouch &= FT5336_TD_STAT_MASK;
if(nbTouch > FT5336_MAX_DETECTABLE_TOUCH)
{
nbTouch = 0;
}
ft5336_handle.currActiveTouchNb = nbTouch;
ft5336_handle.currActiveTouchIdx = 0;
return (nbTouch);
}
//----------------------------------------
Вызовем её в функции TS_GetState, тем самым, если использование было, то запишем количество одновременных использований (сколько пальцев одновременно используют TS (давайте так будем в дальнейшем называть наш тачскрин)) в соответствующее поле структуры
uint32_t event = 0;
TS_State->touchDetected = TS_DetectTouch(TS_I2C_ADDRESS);
}
Дальше добавим условие обнаружения использования
TS_State->touchDetected = TS_DetectTouch(TS_I2C_ADDRESS);
if(TS_State->touchDetected)
{
}
Теперь пробежимся по нашему количеству одновременных использований TS
if(TS_State->touchDetected)
{
for(index=0; index < TS_State->touchDetected; index++)
{
}
}
В следующей части занятия мы добавим две интересные функции сбора координат и другой информации действий с TS и воспользуемся ими в функции определения статуса.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на драйвер TS FT5336
Отладочную плату можно приобрести здесь 32F746G-DISCOVERY
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий