STM32 – TFT Display #1

  • Post author:
  • Post category:STM32

https://istarik.ru/blog/stm32/149.html

ILI9341 드라이버 기반 디스플레이를 SPI 버스를 통해 stm32 마이크로컨트롤러에 연결합니다. 항상 그렇듯이 BluePill 보드에 대한 예가 만들어졌습니다. F3

시리즈 의 스톤을 가지고 계신 분들을 위한 주의사항 . 프로젝트 폴더에는 For_STM32F3 폴더가 있으며 여기 에는 하나의 파일이 포함되어 있습니다.ILI9341_GFX.c. 라이브러리로 작업할 때 Src 폴더에 있는 파일 대신 이 파일을 사용하십시오 .

ILI9341에서는 대각선이 다른 디스플레이가 만들어지지만 모두 320 x 240 픽셀의 동일한 해상도를 갖습니다. 픽셀 치수는 대각선 크기에 따라 다릅니다. 16비트 색상 – 픽셀당 2바이트 (RGB565) . 8비트 또는 16비트 병렬 버스에서 데이터를 출력하는 디스플레이가 있지만 이것은 다릅니다. 여기에서는 SPI에 대한 작업을 고려합니다.

8비트 병렬 버스에 대해

일반적으로 이러한 디스플레이에는 SPI를 통해서도 작동하는 터치 패널도 장착되어 있습니다. 별도의 칩이 “수레”의 작동을 담당하며 대부분 TSC2046과 같은 것입니다 (문자가 다를 수 있음) . 그리고 여기에 흥미로운 점이 있습니다.

결론은 가능한 한 빨리 데이터를 디스플레이로 전송해야 한다는 것입니다.(이미지가 더 빨리 렌더링되도록), 그래서 가능한 최대 SPI 속도를 지정합니다.(BluePill의 경우 18Mbps입니다. 디스플레이 자체가 지원하는 최대 속도는 모르겠지만 최대 50Mbps인 것 같습니다.). 터치 패널을 동일한 SPI에 연결할 수 있고 CS (Chip Select) 핀을 사용하여 현재 작업 중인 디스플레이 또는 “터치”를 선택할 수 있습니다. 그러나 “터치”드라이버는 1-2Mbit / s의 속도에서만 올바르게 작동하며 더 많이 지정하면 문제가 시작됩니다. 따라서 디스플레이와 터치를 동일한 SPI에 연결하면 즉시 SPI 속도를 직접 전환해야 합니다.

또 다른 옵션은 디스플레이를 연결하고 다른 SPI에 터치하는 것입니다. 한편으로는 쉬워보이지만 다른 한편으로는 이미지를 저장하기 위한 플래시 드라이브 (별도의 플래시 메모리 칩을 의미함) 나 SD 카드가 필요할 수도 있고, 이 두 가지도 SPI를 통해 작동하는데, BLuePill에는 이러한 인터페이스가 두 개뿐입니다.

명확하게 하기 위해 그림은 16비트 컬러, 전체 화면 크기입니다.(320×240)의 무게는 153600바이트입니다. 즉, 간단한 마이크로 컨트롤러 내부에 저장하는 것에 대해 이야기할 수 없습니다.

위의 내용에 따라 디스플레이와 “터치”를 하나의 SPI에 연결하는 것이 가장 좋습니다. 프로그램이 제대로 구성되어 있으면 서로 잘 어울리고 서로 간섭하지 않기 때문입니다. 두 번째 SPI는 저장 (플래시) 드라이브 또는 SD 카드) 또는 다른 것 -그.

이제 하나의 SPI 디스플레이와 스토리지에 매달리면 안 되는 이유에 대한 질문입니다. 사실 플래시 드라이브 / 카드에서 읽고 디스플레이에 표시하는 과정에는 일정 시간이 걸립니다. 저장소에서 데이터를 하나씩 읽어 중간 버퍼(예: 10Kb)를 만들어야 합니다.(BluePill에는 20Kb의 RAM만 있고 그 중 일부는 프로그램 자체에 필요함), 먼저 이 버퍼로 데이터를 읽은 다음 디스플레이로 보냅니다. 즉, 모든 오버헤드를 감안하면 약 200ms 동안 전체 화면에 영상이 출력되는데, 아시다시피 5FPS는  

의 내용을 기준으로 SPI 플래시 드라이브에 저장된 데이터를 화면에 표시하기 위함입니다. 가능한 한 빨리 먼저 다른 인터페이스에 표시하고 두 번째로 플래시 드라이브에서 동시에 데이터를 읽고 디스플레이로 전송하는 방식으로 DMA를 사용해야 합니다. 즉, 버퍼의 절반을 채우고 전송을 시작하고, 전반부는 전송되고, 후반부는 채워지는 식입니다.결과적으로 가능한 최고 속도를 얻을 수 있습니다. 전체 화면 이미지는 14FPS에 해당하는 ~ 70ms 내에 표시됩니다. 이것은 SPI 플래시 드라이브에 적용되며, SD 카드 작업은 추가 시간이 필요한 FATFS를 사용하기 때문에 더 오래 걸립니다 .

SPI 플래시 드라이브로 작업하기 위한 계산: 18Mbps의 SPI 속도에서 각각 1ms에 2250바이트를 전송할 수 있고, 153600바이트는 68ms(153600 / 2250 = 68)에 전송하고 오버헤드에 2ms를 더합니다. 음, 1000ms / 70ms = 14FPS입니다.

사진이 전체 화면이 아니면 자연스럽게 더 빨리 읽고 표시되므로 더 많은 FPS를 얻을 수 있습니다. 여기에 예가 있습니다…


200×214 크기의 13개 사진을 반복 출력합니다. 각 사진은 41ms, 즉 24FPS로 표시됩니다. 화면 크기 2.4″.

플래시 드라이브 또는 SD 카드 작업은 이 기사에서 설명하지 않고 다음 기사에서 설명합니다. 위의 모든 것은 SPI 인터페이스를 사용해야 하는 이유와 방법을 설명하기 위해 수행됩니다.


연결

모든 디스플레이가 다르므로 연결할 디스플레이 연락처를 나열하겠습니다. SPI (모시, 미소, CLK) . 이 핀에 낮은 수준을 공급하는 CS (Chip Select)는 우리가 디스플레이로 작업할 것임을 나타냅니다.(많은 장치를 SPI 버스에 연결할 수 있으며 각 장치에는 통신할 대상을 선택하는 자체 CS가 있습니다.)이 핀에 대한 낮은 수준의 DC 공급은 디스플레이에 명령을 보낼 것임을 나타내고 높은 수준의 공급은 데이터를 보낼 것임을 의미합니다. RST (RESET) 디스플레이 재설정 라이브러리가 이 모든 작업을 자체적으로 수행함) .

또한 물론 전원을 공급하고 백라이트를 켜야 합니다. 백라이트는 PWM 모드에서 타이머를 사용하는 트랜지스터를 통해 일정하게 만들거나 조정 가능하게 배열할 수 있습니다. 나는 별도의 전원, 즉 보드 자체가 아닌 전원과 백라이트를 공급했습니다. 터치스크린을 디스플레이와 동일한 SPI

에 연결합니다 . 그는 자신의 CS 와 연락처를 가지고 있습니다.(IRQ와 같은 이름)누를 때 낮게 나타납니다. 무한 루프에서 이 연락처를 조사합니다.


구성

구성 SPI1…

최대 SPI 속도 (18.0MBits/s) 를 설정합니다 . 이것은 72MHz의 시스템 주파수를 위한 것입니다. 스톤이 더 높은 주파수를 지원하는 경우 SPI 속도를 높일 수 있지만 먼저 이 속도를 테스트하십시오.

핀 설정 중…

터치스크린이 없으면 TOUCH_CS 및 IRQ 가 필요하지 않습니다. 핀 IRQ는 다음과 같이 설정됨GPIO_입력, 나머지 (SPI 제외) 는 다음과 같습니다.GPIO_출력. 이 연락처를 편리한 레그에 할당할 수 있으며 표시된 대로 이름을 지정해야 합니다. 그러면 라이브러리에서 아무 것도 변경할 필요가 없습니다.

이름은 GPIO 섹션에 입력됩니다 …

User Label

그리고 정보를 표시하도록 USART를 설정했습니다.

모든 것을 연결하고 백라이트가 작동하면 코딩을 진행합니다.


프로그램 라이브러리를

다운로드 하고 프로젝트에 파일을 추가합니다.

ILI9341_GFX.c
xpt2046_touch.c
글꼴.c

ILI9341_GFX.h
xpt2046_touch.h
글꼴
.h img.h

수레가 없으면xpt2046_touch.c그리고xpt2046_touch.h필요하지 않습니다.

SPI 번호와 핀은 파일에 정의되어 있습니다.ILI9341_GFX.h그리고xpt2046_touch.h.

안에main.c포함하다…

다음으로 무한 루프 전에 다음 코드를 추가하십시오 …

이 모든 것이 예제에 있지만 그럼에도 불구하고 복제하겠습니다.

다음은 마이크로 컨트롤러의 내부 메모리에서 텍스트, 다양한 모양 및 그림을 표시하는 데 필요한 모든 사용자 기능을 나열하고 설명합니다.

이제 화면을 수평 위치에서 사용한다는 데 동의합시다. 수직 위치에서 화면을 사용하려면 파일의 너비와 높이 값을 바꿔야 합니다.ILI9341_GFX.h…

동일한 파일에서 다른 색상이 정의되고 자신만의 색상을 만들기 위한 리소스가 지정됩니다.

프로그램 시작 부분에서 화면 방향을 설정합니다 …

이 함수의 인수는 초기 좌표가 계산되는 각도를 나타냅니다. 이 예에서는 마지막에 시연됩니다. 이미지와 텍스트의 초기 좌표는 모든 곳에서 동일하며 시작 각도가 다릅니다.

실제로 플래시를 켜고 무슨 일이 일어났는지 볼 수 있습니다. 내 로고가 나오면 그거야 

이제 배열에서 이미지를 표시하는 기능에 대해 …

MK의 내부 메모리에 저장된 이미지를 어레이 형태로 표시하기 위해 사용합니다. 특히, 내 로고는 파일에 있습니다.img.h12800바이트의 “무게”입니다. 큰 사진이 많이 필요하지 않은 경우 마이크로컨트롤러의 플래시 메모리가 허용하는 만큼 많은 사진을 만들 수 있으며 외부 저장소 없이도 가능합니다.

함수의 첫 번째 인수는 배열에 대한 포인터이고 두 번째와 세 번째는 초기 좌표이고 네 번째와 다섯 번째는 이미지의 너비와 높이이며 마지막은 크기(바이트)입니다.

변환기

이미지에서 올바른 형식의 배열을 만들려면 특별한 온라인 리소스를 사용할 수 있습니다 …


파일 선택, 지정코드 형식그리고사용그림과 같이 버튼을 누르면C 문자열 가져오기. 결과 배열을 파일에 삽입img.h내 대신 그림의 너비와 높이를 함수에 입력하고 시도하십시오.이미지의 너비와 높이는 리소스의 동일한 위치인 하단에 작성됩니다.

향후 그림의 크기를 추정하려면 너비에 높이를 곱하고 여기에 2를 곱합니다(그림은 16비트, 즉 각 픽셀에 대해 2바이트임). 내 로고의 예에서는 다음과 같습니다. 80 * 80 * 2 = 12800바이트.

다른 이미지도 이 파일에 추가할 수 있으며 어레이의 이름만 변경하면 됩니다.

아래 같은 위치에서 바이너리 형식으로 파일을 다운로드할 수 있습니다.데이터 다운로드변환된 데이터를 바이너리 파일로 저장합니다. 이 파일은 SD 카드로 작업할 때 사용할 수 있습니다.

리소스가 작동하지 않는 것으로 판명될 경우를 대비하여 나만의 온라인 변환기를 만들었습니다 . 그것은 매우 간단하게 작동합니다 – 파일을 선택하고 업로드하고 모든 것이 정상이면 몇 초 안에(처리에 시간이 걸립니다)다운로드 버튼이 나타납니다. 다운로드한 아카이브에는 배열이 있는 바이너리 및 헤더 파일이 포함됩니다.

또한 라이브러리에는 컴퓨터에서 사용할 PHP 스크립트가 포함된 Converter 폴더가 있습니다

(php7+가 설치되어 있어야 함) . 사용 예…

실행 후 위에서 설명한 파일이 나타납니다.

터치스크린

터치스크린은 무한 루프 또는 터치스크린이 아니라 누름 신호를 보내는 IRQ 핀에서 조사됩니다. 무한 루프 전에 몇 가지 변수를 추가하십시오…

그리고 루프에 다음 코드를 추가합니다…

“터치스크린이 눌리면” 조건이 트리거되면 (IRQ 핀이 낮아짐) SPI가 더 낮은 속도로 전환됩니다.ILI9341_TouchGetCoordinates(&x, &y)터치스크린에서 받은 데이터를 읽은 후 SPI가 원래 속도로 돌아갑니다.

중요한! 다른 돌이 있는 경우 큐브에서 등록해야 하는 칸막이를 살펴보세요.SPI_BAUDRATEPRESCALER_x.

이제 화면을 깜박이고 찌를 수 있습니다.

USART와 화면에 클릭 좌표가 표시됩니다. 이것은 디버깅 인파이며 향후 주석 처리될 수 있습니다. 이 좌표를 사용하는 방법에 대한 예도 있습니다. 즉, 화면에 어떤 버튼을 그리고 이 버튼의 모서리를 찌르고 영역의 좌표를 가져오고 조건으로 작성한다고 가정해 보겠습니다. 그럼 우리는 뭔가를” .

“바운스” 유형으로부터 보호하는 것과 같이 데이터가 미친 듯이 쏟아지지 않도록 “다음 누를 때까지 지연”이라는 조건이 필요합니다.

글쎄, “버튼을 누르고 있는 것”은 그 자체로 말하며, 보류 시간은 필요에 따라 설정할 수 있습니다. 이 경우 사이클의 어떤 것도 느려지지 않습니다.이 버튼을 짧게 누르면 아무 일도 일어나지 않습니다. 즉, 이것은 하나의 버튼에 두 가지 작업 옵션을 갖기 위해서가 아니라 실수로 누르는 것을 방지하기 위해 갑자기 ” AZ-5 “와 같은 버튼이 있습니다 .

XPT2046 칩과 함께 터치 스크린 자체는 진부한 ADC이며 누르면 두 개의 16 비트 값 (수평 및 수직) 이 생성되어 기능으로 변환됩니다.ILI9341_TouchGetCoordinates()수학적 계산을 사용하여 좌표로. 이 함수에는 이러한 값을 표시하는 주석 처리된 줄이 있습니다. 그것들을 받으면 파일의 숫자를 찌르고 수정하여 화면의 가장자리를 더 정확하게 결정할 수 있습니다 (터치 스크린은 사람마다 다릅니다)xpt2046_touch.c…

경험적으로 어떤 값이 어떤 가장자리에 속하는지 알아낼 것입니다. 나는 그들을 직접 반올림했습니다. 모서리에 십자 표시가 있는 캘리브레이션을 수행할 수 있지만, 나는 이것을 하고 싶지 않으며 특별히 필요하지 않습니다.

위에서 언급했듯이 지금은 이것이 전부일 것입니다. 다음 부분에서는 대용량 이미지를 외부 미디어에 저장하고 DMA를 사용하여 표시하는 방법에 대해 설명합니다.

라이브러리는 여기 와 여기 에서 가져온 두 개로 구성됩니다 .