STM32 TouchPad 테스트 - STMPE811

지난 포스트를 이어서 STM32F429I-DISC1 데모보드에서 LCD 기능을 검증 및 테스트하고 있다. 이번 포스트에서는 LCD 터치패드를 검증하고자 한다. 그동안 구글링을 통해 참고 자료나 예제코드를 찾았는데, 알고보니 STM32 라이브러리 디렉토리에 ST에서 판매하는 데모보드에 대한 예제 코드가 있는 것이 아닌가...?

etc-image-0etc-image-1etc-image-2

구글링에서 찾은 예제 코드들의 출처가 궁금하였는데, 등잔 밑이 어둡다고 STM32 CMSIS 라이브러리 디렉토리에 있을 것이라곤 생각치 못하였다. 어쨌든, 이 예제 코드를 참고하여 인터럽트 방식의 터치패드를 간단히 검증하였다.

 

STM32F429I 데모보드의 LCD 모듈은 LCD IC인 ili9341과 터치패드 및 온도센서 IC인 STMPE811으로 구성되며, 이것을 통하여 이미지 및 터치패드를 제어한다.

etc-image-3

터치패드 입력을 폴링방식으로 간단히 검증하고자 한다면, 터치패드 인터럽트 핀(PA15)을 설정할 필요가 없지만, 인터럽트 방식으로 터치패드 입력을 받고자 한다면, 아래와 같이 CubeIDE 설정을 해야 한다.

etc-image-4

STMPE811 인터럽트를 아래 데이터시트를 참고하여 SCL 클럭이 High인 상태에서 SDA가 High -> Low로 변경될 때 인터럽트가 발생하기 때문에 인터럽트 모드를 Falling Edge로 설정하도록 한다.

I2C_STMPE811.pdf
0.50MB

그리고, ST 예제코드에서 STMPE811 드라이버(BSP) 코드는 그대로 사용하였고, STM32F429I-Discovery 디렉토리 코드는 사용하지 않고, 아래와 main() 함수와 같이 CubeIDE로 생성한 코드에서 필요한 부분만 추가하여 기능을 검증하였다.

etc-image-5

그리고, 터치패드 입력을 인터럽트 방식으로 처리하기 위해 아래와 같이 인터럽트 핸들러를 작성해야 한다. STMPE811에서 제공하는 X, Y 값은 변환 작업이 필요하며, 변환 코드는 예제 코드를 그대로 복사하여 인터럽트 핸들러에서 처리하도록 하였다.

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin  == LCD_TS_INT1_Pin)
    {
        uint32_t _x = 0, _y = 0;
        uint16_t TsYBoundary = 320;
        uint16_t TsXBoundary = 240;
        uint16_t xDiff, yDiff , x , y, xr, yr;

        stmpe811_TS_GetXY(STMPE811_DEVICE_ID, &x, &y);

        /* Y value first correction */
        y -= 360;  
        /* Y value second correction */
        yr = y / 11;

        /* Return y position value */
        if(yr <= 0)
        {
            yr = 0;
        }
        else if (yr > TsYBoundary)
        {
            yr = TsYBoundary - 1;
        }
        y = yr;

        /* X value first correction */
        if(x <= 3000)
        {
            x = 3870 - x;
        }
        else
        {
            x = 3800 - x;
        }

        /* X value second correction */  
        xr = x / 15;

        /* Return X position value */
        if(xr <= 0)
        {
            xr = 0;
        }
        else if (xr > TsXBoundary)
        {
            xr = TsXBoundary - 1;
        }
        x = xr;
        xDiff = x > _x? (x - _x): (_x - x);
        yDiff = y > _y? (y - _y): (_y - y); 

        if (xDiff + yDiff > 5)
        {
            _x = x;
            _y = y; 
        }

        printf("x = %ld, y = %ld\r\n", _x, _y);
        stmpe811_TS_ClearIT(STMPE811_DEVICE_ID);
    }
}

이 포스트의 전체 코드는 LCDTest2Touch 디렉토리를 참고하도록 한다. 이제 그림을 그려봐야 하는데, 이건 노가다성 작업이 많아 살짝 걱정이긴 하다.

 

highgon2/STM32

STM32 TestCode. Contribute to highgon2/STM32 development by creating an account on GitHub.

github.com