STM32 TouchPad 테스트 - STMPE811

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

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

 

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

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

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

I2C_STMPE811.pdf
0.50MB

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

그리고, 터치패드 입력을 인터럽트 방식으로 처리하기 위해 아래와 같이 인터럽트 핸들러를 작성해야 한다. 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