반응형
아래 테스트는 STM32CubeIDE 1.6.1/STM32Cube_FW_F7_V1.16.1를 사용하여 테스트 되었습니다.
STM32F746G-DISCO 보드의 터치 스크린은 I2C를 사용하여 동작됩니다.
정전식 터치 스크린이 사용되는데 컨트롤러로 FT5336GQQ를 사용하고 있으며 120Hz의 응답속도로 최대 5개의 멀티 터치를 지원합니다.
관련 회로 부분을 찾아 보았습니다.
I2C3번의 인터페이스인 PH7(SCL), PH8(SDA) 포트와 연결되어 있습니다.
STM32CubeIDE에서 새 프로젝트를 생성 후이전 게시글과 마찬가지로 핀 초기화 후 SYS/USART1/I2C3 부분만 설정하여 테스트하였습니다.
NVIC/USART1/I2C3는 아래와 같이 설정하였습니다.
STM32746G-Discovery의 예제 중 터치스크린 관련 예제를 참고하여 작성하였습니다.
Touchscreen_demo함수는 while 문에서 반복 호출하시면 됩니다.
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "stm32746g_discovery_ts.h"
/* USER CODE END Includes */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define CIRCLE_RADIUS 30
static TS_StateTypeDef TS_State;
/* USER CODE END PM */
/* USER CODE BEGIN 0 */
int __io_putchar(int ch) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
void Touchscreen_demo (void)
{
uint8_t status = 0;
uint16_t x, y;
uint8_t text[30];
uint8_t radius;
status = BSP_TS_Init(480, 272);
if (status != TS_OK) {
printf("ERROR - Touchscreen cannot be initialized.\r\n");
}
while (1)
{
if (status == TS_OK)
{
/* Check in polling mode in touch screen the touch status and coordinates */
/* if touch occurred */
BSP_TS_GetState(&TS_State);
if(TS_State.touchDetected)
{
/* Get X and Y position of the touch post calibrated */
x = TS_State.touchX[0];
y = TS_State.touchY[0];
sprintf((char*)text, "Touch detected : %d", TS_State.touchDetected);
printf("%s\r\n", text);
/* Display 1st touch detected coordinates */
printf("1[%d,%d]\r\n", x, y);
if (TS_State.touchDetected >= 2) /* Display 2nd touch detected coordinates if applicable */
{
printf("2[%d,%d]\r\n", TS_State.touchX[1], TS_State.touchY[1]);
}
if (TS_State.touchDetected >= 3) /* Display 3rd touch detected coordinates if applicable */
{
printf("3[%d,%d]\r\n", TS_State.touchX[2], TS_State.touchY[2]);
}
if (TS_State.touchDetected >= 4) /* Display 4th touch detected coordinates if applicable */
{
printf("4[%d,%d]\r\n", TS_State.touchX[3], TS_State.touchY[3]);
}
if (TS_State.touchDetected >= 5) /* Display 5th touch detected coordinates if applicable */
{
printf("5[%d,%d]\r\n", TS_State.touchX[4], TS_State.touchY[4]);
}
/* Calculate circle radius to fill according to finger pressure applied on screen (weight) */
radius = TS_State.touchWeight[0]/3;
if (radius > CIRCLE_RADIUS) {
radius = CIRCLE_RADIUS;
} else if (radius < 1) {
radius = 1;
}
printf("touchWeight : %d\r\n", radius);
} /* of if(TS_State.touchDetected) */
}
HAL_Delay(10);
}
}
/* USER CODE END 0 */
위 코드를 테스트 하기 위해서는 STM32Cube_FW_F7_V1.16.1 Repository에서 아래 파일들을 프로젝트에 추가해야 줘야 합니다. 파일을 추가 후 빌드시 참조할 수 있도록 프로젝트 설정에서 각 각의 패스를 추가 해 줍니다.
패스 설정이 완료되면 빌드 후 실행을 해 봅니다.
LCD의 터치스크린을 터치시 터치 인식 개수, 좌표, 터치를 누르는 압력의 정보가 출력됩니다.
최대 5개의 멀치 터치가 인식되며, 터치압이 잘 동작됨을 확인할 수 있었습니다.
반응형
'Hardware > STM32' 카테고리의 다른 글
[STM32F746G-DISCO] SPI 사용하기 (feat. OLED) (0) | 2024.07.06 |
---|---|
[STM32F746G-DISCO] I2C 사용하기 (feat. OLED) (0) | 2024.07.06 |
[STM32F746G-DISCO] USART 사용하기 (1) | 2024.07.05 |
STM32CubeIDE에서 시리얼 터미널 설치하기 (0) | 2024.07.05 |
[STM32F746G-DISCO] 하드웨어 살펴보기 (0) | 2024.07.03 |
댓글