/STM32F103VET6-TFT-LCD-with-Resistive-Touch-Screen

STM32F103VET6, Control the ILI9341 driver using the FSMC (interface) and the XPT2406 touch controller using the SPI (interface)

Primary LanguageC

LCD Led On Off Test LCD Drawing Test LCD Rotation Test

일부 테스트 과정 영상입니다.
본 프로젝트는 해당 프로젝트를 참고하였으며 이를 STM32F103VET6 MCU에 포팅하였습니다.

22/04/15 : 추가적으로 SD 카드를 사용하여 BMP, JPEG 파일 출력과 한글 폰트 구현 등을 고려하고 있습니다.
22/04/18 : SPI 통신을 DMA 방식으로 수정하여 테스트를 시도해볼 수 있습니다.
22/04/22 : lvgl 라이브러리를 포팅하여 새로운 코드를 작성해볼 수 있습니다.


개발 환경

IDE

  • STM32CubeIDE 1.6.0
  • STM32CubeMX

개발 보드

  • STM32F103VET6 Custom Development Board
    • 📌 이미지 링크 및 구매처

    • 📌 개발보드 회로도

      • 제공되는 개발보드 회로도를 확인해 본 결과, 회로도에 표기되어있는 커넥터 및 핀 헤더명이 실제 보드의 커넥터 및 핀 헤더명과 서로 다른 것을 확인하였습니다. 이를 주의하시고 회로도를 보시길 바랍니다.

      • 사용된 개발보드에서는 FSMC 인터페이스와 FSMC용 TFT LCD 모듈을 쉽게 연결하여 사용할 수 있게 핀을 매핑하여 16X2 헤더로 따로 빼놓았습니다. 아래 그림을 참고하시길 바랍니다.

           


320*240 TFT LCD 모듈

  • 3.2inch 16BIT Module ILI9341 SKU-MRB3205
    • 📌 이미지 링크 및 구매처

    • 📌 해당 TFT LCD관련 자료 종합

      • 해당 LCD 위키 사이트로 가는 링크입니다. 링크를 접속하시면 해당 TFT LCD모듈에 대한 간단한 Overview 부터 User Manual. ILI9341 driver IC 데이터 시트, XPT2406 touch IC 데이터 시트 그리고 예제 등 까지 확인해보실 수 있습니다.
    • 사용한 TFT LCD 모듈의 간단한 스펙 설명은 다음과 같습니다. (자세한 스펙은 데이터시트를 참고하시길 바랍니다.)

      • 들어가기 앞서 FSMC는 FMC라고도 불리며 Flexible Static Memory Controller를 의미합니다. FSMC는 NOR/SRAM, NAND/PC CARD 같은 외부 메모리 칩들을 병렬 인터페이스하여 컨트롤 하는 페리페럴입니다. 참고로 LCD의 직렬 인터페이스 방식에서는 SPI가 많이 쓰이며, 병렬 인터페이스 방식에서는 FSMC가 많이 쓰입니다. 병렬 인터페이스가 직렬 인터페이스보다는 고속이게 됩니다.

      • STM32F10X FSMC에 상세한 내용은 아래 문서명을 참고하세요

        • TFT LCD interfacing with the high-density STM32F10xxx FSMC
        • RM0008 Reference Manual 507p~565p
        • FSMC 인터페이스는 적용되는 외부 메모리에 따라 파라미터나 확장 기능이 추가 될 수 있습니다. 본 프로젝트에서는 FSMC 인터페이스를 TFT LCD에 적용하므로 TFT LCD interfacing with the high-density STM32F10xxx FSMC 어플리케이션 노트를 통해 STM32F10XX MCU의 FSMC 인터페이스를 이용한 TFT LCD제어 방식의 흐름을 전반적으로 이해하실 수 있습니다.
      • TFT LCD모듈의 레귤레이터로 인해 VDD Pin에 3.3V 뿐만 아니라 5V로 전원공급이 가능합니다.

      • 해당 TFT LCD모듈은 8-bit/16-bit 데이터 버스의 인텔 808 (I80) 인터페이스를 지원하며 이를 통해 MCU의 FSMC 인터페이스로 ILI9341 driver IC (LCD 드라이버)를 병렬 제어할 수 있습니다. 기본적으로 16-bit 데이터 버스 이며 아래 그림과 같이 R8, R16 저항을 통해 8-bit로 FSMC 인터페이스 시킬 수 있습니다.


      • 해당 TFT LCD모듈은 감압식 터치 패널이며 이는 누른 좌표점을 얻어내어 터치를 제어하는 형식입니다. (보통 정전식을 더 많이 사용합니다.) 이를 위해 SPI 인터페이스의 XPT2406 touh IC를 이용하여 터치스크린을 제어합니다.

      • 또한 TFT LCD모듈에는 SDCS (SD카드 선택제어핀)이 있으므로 SD카드의 프로토콜 방식인 SDIO/SPI 중 SPI를 이용해 XPT2406에 SPI 슬레이브를 하나더 추가하여 SD카드를 사용한 비트맵, JPEG 출력 등을 시도해 볼 수 있습니다. 본 프로젝트에서는 SD카드 관련 제어를 구현하지 않았습니다.
    • 해당 TFT LCD 모듈의 User Manual을 통해 Pin Description를 이해하기 전에 FSMC 인터페이스에 대한 학습이 필요합니다.


TFT LCD 모듈과 STM32F103VET6 하드웨어 연결

  • 해당 초록색 박스 부분은 LCD의 인텔 808 인터페이스와 MCU의 FSMC 인터페이스 부분입니다. 이를 통해 ILI9341 Driver IC를 제어합니다.

    • FSMC [D0:D15] = FSMC 16bit 데이터 버스
    • FSMC NEx = FSMC Chip Select (LCD의 CS Pin과 연결)
    • FSMC NOE = FSMC Output Enable (LCD의 RD Pin과 연결)
    • FSMC NWE = FSMC Write Enable (LCD의 WR Pin과 연결)
    • FSMC Ax = LCD Register와 LCD Data를 선택하기 위한 Address line (0~25) (LCD의 RS Pin과 연결) High일때 레지스터 / Low일때 데이터
  • NEx, NOE, NWE 앞에 붙은 N은 Active Low를 의미합니다.

  • 본 프로젝트에서는 STM32F103VET6의 FSMC 컨트롤러의 NE1에 A16을 사용합니다. 즉, FSMC bank1 NOR/PSRAM 1을 사용하며, 서브 뱅크에 따라 주소 매핑은 아래와과 같습니다.

  • 참고로 뱅크1은 서브뱅크4개로 나눠지며 이와 관련된 자세한 사항은 RM0008 Reference Manual 511p 부터 참고하세요.

#define LCD_BASE0        		((uint32_t)0x60000000) //ILI9341_CMD_ADDR
#define LCD_BASE1        		((uint32_t)0x60020000) //ILI9341_DATA_ADDR
  • RST Pin은 STM32F103VET의 NRST Pin에 연결되며 개발 보드 회로도를 참고하시면 HW적으로 리셋 스위치에 달려있습니다. 따라서 SW적으로 따로 리셋을 구현하지 않았습니다.

  • 해당 주황색 박스 부분은 SPI 인터페이스 부분입니다. SPI2를 사용하며, 이를 통해 XPT2406 touh IC를 제어합니다.

    • PEN Pin은 터치 스크린의 인터럽트를 감지하며, 터치가 발생했을 때 Low로 떨어집니다.
  • 해당 노란색 색칠 부분은 SD 카드를 선택하여 제어하는 핀입니다.

    • 즉, SPI CS Pin 으로 사용 가능합니다. 만약 SD카드를 이용하여 확장 기능을 추가하고 싶다면 이 핀을 SPI2 CS 기능을 하는 핀으로 GPIO 셋팅을 하여 XPT2406과 같은 SPI 버스 라인에 슬레이브를 추가시키세요.
    • SD_CS Pin이 Low가 되면 SD카드가 선택됩니다.
    • 본 프로젝트에서는 SD카드를 이용하지 않습니다.
  • BL Pin은 LCD의 백라이트 핀으로 상태가 set이 되어야 켜집니다. 추가적으로 PWM을 지원하는 핀을 이용하여 BL핀을 연결한다면 백라이트의 밝기를 조절할 수 있습니다.

  • Dev Board Pin Name은 사용된 개발 보드 실크 스크린 레이어에 표기되어있는 핀 명을 의미합니다.


크게 보기



STM32CubeMX 설정

Clock Configuration

📌




Pinout

📌





Peripheral & Core Configuration

1. FSMC

📌


2. SPI2

📌


3. GPIO

📌
• PC6 (LED2), PC7 (LED1)은 개발 보드 내에 연결된 2개의 LED Pin을 의미합니다.



5. NVIC

📌




테스트 파일

구성 및 경로

  • 기본적으로 구현한 테스트 함수는 다음과 같습니다

    • stm32f103vet6_fsmc_lcd_test → src → ap → ap.c → void apBoardLedTest(void){...}
    • stm32f103vet6_fsmc_lcd_test → src → ap → ap.c → void apLcdDemoTest(void){...}
    • stm32f103vet6_fsmc_lcd_test → src → ap → ap.c → void apLcdTouchMenuTest(void){...}
    • stm32f103vet6_fsmc_lcd_test → src → ap → ap.c → void apLcdTouchBoardLedTest(void){...}
  • ap.c 함수에서 제공하는 테스트 외에 다양한 테스트 케이스를 구현하고자 하시면 ili9341_lcd.c/.hxpt2046_touch.c/.h의 함수를 참고하여 응용하세요.

  • 응용한 예제는 lcd_demo.c/.h를 참고하세요.


실행 방법

  • 기본 테스트 함수를 빌드하고 실행시키기 위해서는 stm32f103vet6_fsmc_lcd_test → src → common → def.h에서 (1). #define TEST_SELECT의 주석을 해제 또는 설정하여 테스트 함수 범위를 결정하고, (2). 활성화된 범위 내에 빌드 시킬 테스트 함수의 주석을 해제해야합니다.

//TODO: 테스트 함수 선택 (5)

/*
 *  @ 테스트 할 함수 범위 결정
 * - #define TEST_SELECT 주석 해제 시 menu를 사용하지 않는 테스트 함수 활성
 * - #define TEST_SELECT 주석 설정 시 menu를 사용하는 테스트 함수 활성
 *
 */
#define TEST_SELECT

#ifdef  TEST_SELECT
/* 활성화 되었다면 테스트할 함수의 주석을 해제하세요 */

#define BOARD_LED_TEST
//#define LCD_DEMO_TEST
//#define LCD_TOUCH_ROTATION_TEST

#endif /* TEST_SELECT */


#ifndef TEST_SELECT
/* 활성화 되었다면 테스트할 함수의 주석을 해제하세요 */

//#define LCD_TOUCH_MENU_TEST
//#define LCD_TOUCH_BOARD_LED_TEST

#endif /* TEST_SELECT */

참고

프로젝트를 빌드할 때는 다음 경로에 있는 폴더를 빌드 및 디버그 항목에서 제외해야 정상적으로 프로젝트가 빌드됩니다.

  • stm32f411ceu6_fw_module → src → lib → Core

How to exclude

📌
• Core 폴더를 클릭하고 다음 단계를 진행합니다.





• 최종적으로 아래와 같은 폴더 상태가 됩니다.





출처

개발 보드 이미지 출처 : https://coyoteugly.tistory.com/108