Giao tiếp với màn hình TFT

Trên MCU STM32F429xx/439xx có bộ điều khiển LCD-TFT (LTDC).

Bộ điểu khiển hiển thị LCD-TFT (Liquid Crystal Display - Thin Film Transistor) cung cấp một tín hiệu số song song RGB và các tín hiệu cho việc đồng bộ ngang, dọc, xung clock Pixel và Data Enable như ngõ ra để giao tiếp trực tiếp tới panel LCD và TFT.

Kiến trúc LCD-TFT

Bộ nhớ LCD cần thiết

  • Kích thước bộ nhớ đệm Frame
    • Kích thước panel và các bit trên pixel định ra số lượng bộ nhớ cần thiết để lưu các bộ đệm graphic.
    • Bộ nhớ cần thiết (KB) = (bpp chiều rộng chiều cao)/8
Độ phân giải Tổng pixel bpp (bit per pixel) Bộ nhớ yêu cầu (KB)
320x240 (QVGA) 76.8K 16bpp 153.6
8bpp 76.8
480x720 (WAVGA) 130.5K 16bpp 261.12
640x480 (VGA) 307.2K 16bpp 614.4
  • Trong hầu hết mọi trường hợp, càng nhiều bộ nhớ càng cần thiết. Ví dụ như Double buffering: một bộ đệm graphic để lưu hình ảnh hiện tại trong khi bộ đệm thứ 2 sử dụng để chuẩn bị cho hình ảnh tiếp theo.

Các tín hiệu LCD-TFT

Tín hiệu LCD-TFT Mô tả
LCD_CLK Ngõ ra xung clock pixel
LCD_HSYNC Đồng bộ hàng ngang
LCD_VSYNC Đồng bộ hàng dọc
LCD_DE Data enable
LCD_R[7:0] 8-bit dữ liệu màu Red
LCD_G[7:0] 8-bit dữ liệu màu Green
LCD_B[7:0] 8-bit dữ liệu màu Blue

Các đặc điểm chính LTDC

  • Ngõ ra 24-bit RGB Parallel Pixel; 8 bit trên pixel (RGB888)
  • AHB 32-bit Master với việc truy cập của 16 word vào bất kỳ bộ nhớ hệ thống nào: Dành riêng FIFO mỗi Layer (độ dày 64 word)
  • Lập trình được thời gian để thích ứng với các panel hiển thị mục tiêu: Độ rộng HSYNC, VSYNC...
  • Chỉ hỗ trợ TFT (không có STN)
  • Lập trình được với các kích thước hiển thị: hỗ trợ lên tới 800x600 (SVGA)
  • Lập trình màu nền: 24-bit RGB, sử dụng cho việc pha trộn màu với lớp dưới.
  • Hỗ trợ Multi-layer với việc trộn màu, 2 layer + màu nền cơ sở.
  • Việc phối màu (2-bit trên kênh màu (2,2,2 cho RGB)): phù hợp cho hiển thị 18 bit màu, dựa theo 24 bit màu.
  • Giá trị được lập trình mới có thể được tải ngay lập tức tại lúc đang chạy.
  • 2 ngắt được tạo trên 4 Cờ sự kiện.
  • Kênh Alpha tượng trưng cho mức trong suốt của 1 pixel.
  • Các giá trị R, G, B và các địa chỉ tương ứng của chúng được lập trình thông qua thanh ghi LTDC_LxCLUTWR.

    Các thành phần layer có thể lập trình được

    Window

    Window có vị trí và kích thước:

  • Pixel đầu tiên và cuối cùng có thể thấy được được cấu hình trong thanh ghi LTDC_LxWHPCR

  • Đường đầu tiên và cuối cùng có thể thấy được được cấu hình trong LTDC_LxWVPCR

Bộ đệm khung màu sắc (Color Frame Buffer)

Kích thước bộ đệm khung, độ dài đường và số đường cần phải được cấu hình phù hợp:

  • Nếu set ít byte hơn so với yêu cầu bởi layer, thì gây ra lỗi FIFO chạy thiếu.
  • Nếu set nhiều byte hơn so với yêu cầu thực tế của layer, việc đọc dữ liệu vô ích bị bỏ qua. Dữ liệu vô ích không được hiển thị.
  • Pitch = bắt đầu của một đường và bắt đầu của 1 đường tiếp theo.

  • Chỉ là thay đổi lúc bắt đầu của bộ đệm khung layer là có thể cuộn hình ảnh qua các lớp. Hình ảnh được lưu trong bộ nhớ phải lớn hơn với kích thước thật của layer.

Trộn nhiều lớp (Multi-layer blending)

  • Blending luôn hoạt động khi sử dụng giá trị alpha
  • Hệ số trộn mà được cấu hình thông qua thanh ghi LTDC_LxBFCR.
  • Các bậc blending được cố định và nó ở dưới cùng.

Bitmap

Bitmap là một mảng tượng trưng của một hình ảnh. Nó sẽ có ít nhất các thuộc tính sau:

  • Độ rộng (pixel)
  • Độ cao (pixel)
  • Mode màu (direct, indirect, ARGB8888, RGB565...)

Bộ điều khiển Chrom-Art Accelerator (DMA2D)

Chrom-Art Accelerator (DMA2D) là đặc trưng riêng của DMA thao tác ảnh. Nó có thể thực hiện:

  • Đổ đầy một bộ phận hay toàn bộ ảnh đích với màu sắc xác định.
  • Copy một phần hoặc toàn bộ ảnh nguồn tới một phần hoặc toàn bộ ảnh đích.
  • Copy một phần hoặc toàn bộ một ảnh đích tới một phần hoặc toàn bộ một ảnh đích với một bộ chuyển đổi định dạng pixel.
  • Blending một phần và/hoặc hai ảnh nguồn hoàn toàn với định dạng pixel khác nhau và copy kết quả vào một phần hoặc toàn bộ tới một ảnh đích với một định dạng màu sắc khác.

Mọi sự phối hợp màu kinh điển được hỗ trờ từ 4-bit lên tới 32-bit trên pixel với chế độ màu sắc tra bảng hoặc trược tiếp. DMA2D có bộ nhớ chuyên cho CLUTs (bảng tra cứu màu).

Những đặc điểm chính của DMA2D

Những đặc điểm chính của DMA2D:

  • Kiến trúc bus master AHB đơn.
  • Interface lập trình AHB slave hỗ trợ truy câp 8/16/32-bit (ngoại trừ truy cập CLUT là 32-bit).
  • Người dùng lập trình được làm việc với vùng kích thước.
  • Người dùng lập trình được việc offset cho các vùng nguồn và đích.
  • Người dùng lập trình được địa chỉ của nguồn và đích trên toàn bộ vùng bộ nhớ trống.
  • Lên tới 2 nguồn với thao tác blending.
  • Giá trị Alpha có thể được thay đổi (giá trị của nguồn, giá trị cố định hoặc giá trị điều chế).
  • Người dùng lập trình được định dạng màu nguồn và đích.
  • Hỗ trợ lên tới 11 định dạng màu từ 4-bit tới 32-bit trên pixel với việc mã hóa màu gián tiếp hoặc trực tiếp.
  • 2 bộ nhớ nội cho lưu trữ CLUT ở chế độ màu trực tiếp.
  • Tự động tải CLUT hoặc lập trình CLUT thông qua CPU.
  • Người dùng lập trình được kích thước CLUT.
  • Bộ timer nội cho điều khiển băng thông AHB.
  • 4 chế độ hoạt động: thanh ghi - bộ nhớ, bộ nhớ - bộ nhớ, bộ nhớ - bộ nhớ với sự chuyển đổi định dạng pixel, và bộ nhớ - bộ nhớ với sự chuyển đổi định dạng pixel và blending.

Chức năng DMA2D

Điều khiển DMA2D

Bộ điều khiển DMA2D được cấu hình thông qua thanh ghi điều khiển DMA2D (DMA2D_CR) nó cho phép các lựa chọn sau:

  • Chọn chế độ hoạt động.
  • Cho phép hoặc chặn ngắt DMA2D.
  • Start/suspend/abort quá trình chuyển dữ liệu.

DMA2D foreground và background FIFOs

DMA2D foreground (FG) FG FIFO và background (BG) FIFO đưa dữ liệu ngõ vào để sao chép hoặc xử lý.

FIFO tìm pixel theo đình dạng màu được định nghĩa trong bộ chuyển đổi định dạng pixel tương ứng của chúng (Pixel Format Converter - FPC).

Khi DMA2D hoạt động trong chế độ thanh ghi - tới - bộ nhớ, không có FIFO nào được hoạt động.

Khi DMA2D hoạt động ở chế độ memory-to-memory (không có việc chuyển đổi định dang pixel hoặc việc thực hiện blending), chỉ FG FIFO được hoạt động và hoạt động như 1 buffer.

Khi DMA2D hoạt động ở chế độ memory-to-memory với chuyển đổi định dạng pixel (không có việc thực thi blending), BG FIFO không được hoạt động.

DMA2D foreground và bộ chuyển đổi định dạng pixel (PFC)

Bộ chuyển đổi định dạng pixel foreground DMA2D và bộ chuyển đổi định dạng pixel background thực thi việc chuyển đổi định dạng pixel để tạo ra giá trị 32-bit trên pixel. PFC cũng có thể thay đôi kênh alpha.

Giai đoạn đầu của bộ chuyển đổi chuyển đổi định dạng màu. Các định dạng ngõ vào được hỗ trợ cho trên bảng sau.

Định dạng màu được mã hóa như sau:

  • Trường giá trị Alpha: độ trong suốt, giá trị 0xFF tượng trưng một pixel đục và 0x00 là trong suốt.
  • Trường R cho màu đỏ. (Red)
  • Trương G cho màu xanh lá cây (Green).
  • Trường B cho màu xanh nước biển (Blue).
  • Trường L: độ chói, trường này chỉ rõ cho CLUT để lấy lại các thành phần RGB/ARGB.

Nếu định dạng gốc đã là chế độ màu trực tiếp, thì mở rộng 8-bit trên kênh được thực hiện bằng việc copy MSB tới LSB. Việc này đảm bảo sự tuyến tính hoàn toàn của việc chuyển đổi.

Nếu định dạng gốc không bao gồm một kênh Alpha, alpha.value tự động set giá trị 0xFF (đục).

Nếu định dạng gốc là chế độ màu gián tiếp, CLUT được yêu cầu và mỗi bộ định dạng pixel được cấp phát 256 mục 32-bit CLUT.

Để xác định chế độ alpha A4 và A8, không thông tin màu nào được lưu trữ hay dầu hiệu. Màu được sử dụng để tạo hình ảnh được cố định.

DMA2D foreground và background CLUT interface

Interface CLUT quản lý bộ nhớ truy cập CLUT và tự động tải CLUT.

3 loại truy cập sẵn có:

  • CLUT đọc bởi PFC trong khi thực hiện việc chuyển đổi định dạng pixel.
  • CLUT được truy cập thông qua port AHB slave khi CPU đọc hay ghi dữ liệu vào CLUT.
  • CLUT được ghi thông qua port AHB master khi việc tải tự động của CLUT được thực thi.

Định dạng CLUT có thể là 24 hoặc 32 bit.

Cấu hình DMA

Cả việc truyền dữ liệu nguồn và đích có thể là mục tiêu ngoại vi và bộ nhớ trong vùng bộ nhớ 4GB.

DMA2D có thể hoạt động ở bất kỳ chế nào trong 4 chế độ:

Register-to-memory

Chế độ register-to-memory được sử dụng để làm đầy vùng người dùng định nghĩa với màu xác định trước.

Memory-to-memory

Trong chế độ memory-to-memory. DMA2D không thực thi chuyển đổi bất kỳ dữ liệu graphic nào.

Memory-to-memory với PFC

Trong chế độ này, DMA2D thực thi việc chuyển đổi định dạng pixel của dữ liệu nguồn và lưu chúng trong vùng bộ nhớ đích.

Nếu định dạng pixel gốc là chế độ màu trực tiếp, thì mọi kênh màu được mở rộng thêm 8 bit.

CLUT cũng có thể được làm đầy bằng CPU hay bởi bất kỳ master nào khác thông qua port APB. Việc truy cập vào CLUT không sẵn sàng khi một chuyển đổi DMA2D đang chạy và sử dụng CLUT (định dạng màu gián tiếp).

Trong quá trình chuyển đổi màu song song, giá trị alpha có thể được thêm hoặc thay đổi được. Nếu ảnh gốc không có kênh alpha, giá trị alpha 0xFF mặc định tự đông thêm vào đạt được một pixel đục đầy đủ.

Việc cấu hình phát hiện lỗi

DMA2D kiểm tra rằng việc câu hình chính xác trước khi truyền bất kỳ dữ liệu nào. Cờ ngắt lỗi cấu hình được set bằng phần cứng khi 1 cấu hình sai bị phát hiện lúc bắt đầu tải transfer mới.

STemWin

STemWin Library được STMicroelectronic cung cấp dựa trên thư viện graphic Segger emWin.

STemWin Library là một bộ xếp thư viện graphic chuyên nghiệp cho phép xây dựng giao diện người dùng (GUIs) với bất kì MCU STM32 nào, bất kỳ LCD/TFT nào.

Mô tả thư viện

Hình trên trình bày STemWin được xây dựng bên trong như thế nào và nó có thể thực thi như thế nào trong project.

STemWin Library bao gồm 2 bộ điều khiển được tối ưu:

  • Driver truy cập tuyến tính trực tiếp (LIN) cho bộ điều khiển STM32F429 TFT-LCD với kỹ thuật gia tốc graphic DMA2D ChromART.
  • Driver FlexColor (truy cập gián tiếp) cho bus nối tiếp và song song cho bộ điều khiển LCD ngoại vi.

Cấu hình

Việc cấu hình cơ bản chia thành 2 phần: cấu hình GUI và cấu hình LCD:

  • Cấu hình GUI bao gồm cấu hình mặc định màu và phông chữ của bộ nhớ sẵn có.
  • Cấu hình LCD phụ thuộc vào phần cứng hơn và cho phép người dùng định nghĩa kích thước vật lý của màn hình, driver màn hình và thủ tục chuyển đổi màu được sử dụng.

Khi một bộ điều khiển LCD mới cần được xác minh, 2 file cần thiết phải được tạo ra: GUIConf.c và LCDConf.c

GUIConf.c

Trong file này, người dùng nên thực thi hàm GUI_X_Config() mà nó là thủ tục gọi đầu tiên trong quá trình khởi tạo. Tác vụ chính của nó là cài đặt bộ nhớ sẵn có cho GUI và để ấn định cho hệ thống quản lý bộ nhớ động.

Hoạt động này hoàn thành qua hàm GUI_ALLOC_AssigMemory(). Bộ nhớ phải truy cập được và phải có độ rộng 8/16/32-bit. Việc truy cập bộ nhớ được kiểm tra trong lúc khởi tạo.

LCDConfig.c

Hàm chính ở đây là LCD_X_Config(), được gọi trực tiếp sau khi GUI_X_Config() được thực thi. LCD_X_Config() cho phép tạo và cấu hình driver hiển thị cho mỗi lớp.

GUI_X.c hoặc GUI_X_OS.c

  • GUI_X.c cho việc thực thi tác vụ đơn: "Single task" nghĩa là project sử dụng chỉ STemWin từ trong một tác vụ đơn. Mục đích chính là để cung cấp STemWin với một thời gian nền. OS_TimeMS cần được tăng lên mỗi ms.
  • GUI_X_OS.c cho thực thi đa tác vụ: Nếu STemWin được sử dụng trong hệ thống đa tác vụ, file này bao gồm các thủ tục yêu cầu cho việc đồng bộ các tác vụ (cho mục đích này, file GUI_X_FreeRTOS.c có thể được sử dụng).

Các hàm lõi (Core function)

Hiển thị file ảnh

STemWin hiện tại hỗ trợ các định dạng file BMP, JPEG, GÌ và PNG. Thư viện bao gồm rất nhiều API cho mỗi định dạng file.

Alpha blending

Alpha blending là một phương pháp tổ hợp kênh alpha với các lớp khác trong một hình.

Bộ nhớ thiết bị

Một thiết bị bộ nhớ là 1 thiết bị đích phụ thuộc phần cứng cho các hoạt động vẽ.

Nếu một thiết bị bộ nhớ được tạo (bởi gọi GUI_MEMDEV_Create()) sau đó phê chuẩn (bằng cách gọi GUI_MEMDEV_Select()), mọi toán tử vẽ được thự thi trong bộ nhớ. Kết quả cuối cùng được hiển thị trên màn hình chỉ khi mọi toán tử đã kết thúc. Hành động này hoàn thành bằng cách gọi GUI_MEMDEV_CopyToLCD().

Các thiết bị bộ nhớ có thể sử dụng:

  • Ngăn ngừa hiện tượng lòe (do vẽ trực tiếp để hiện thị).
  • Như một bộ chứa cho giảm sức ép hình ảnh.
  • Để xoay (GUI_MEMDEV_Rotate()) và các hoạt động phân chia.
  • Cho hoạt động mờ.
  • Cho hình hoạt cửa sổ.
  • Cho hiệu ứng trong suốt.

Anti-Aliasing (chống răng cưa)

Các đường cong mượt mà và đường chéo bằng "blending" màu background với một foreground. Điều này hoàn thành bằng cách thêm màu ở giữa giữa vật thể và background.

Quản lý cửa sổ (Window Manager)

Quản lý cửa sổ được mô tả như:

  • Một hệ thống quản lý cho một cấu trúc cửa sổ có thứ tự: mỗi lớp có desktop window của chúng. Mỗi desktop window có thể có các nhánh cửa sổ con.
  • Một hệ thống dựa vào kỹ thuật "Callback": Giao tiếp được dựa vào một kỹ thuật gọi hàm sự kiện điều khiển. Mọi hoạt động vẽ nên hoàn thành với sự kiện WM_PAINT.
  • Nền tảng của thư viện widget: Mọi widget được dựa trên các hàm của bộ quản lý cửa sổ.

Thư viện Widget

Widget (Window + Gadget) là các cửa sổ với các thuộc tính object-type. Chúng yêu cầu Window Manager.

Khi một widget được tạo, nó được coi như bất kỳ cửa sổ nào khác. Window Manager đảm bảo rằng nó hiển thị chính xác bất cứ lúc nào.

GUIBuilder

GUIBuilder là một tool dễ dàng cho việc tạo ra các dialog: thay thế việc viết code, người dùng có thể đặt và sắp xếp widget bằng cách kéo thả.

Mô hình thực thi: Đơn tác vụ / Đa tác vụ

Các mô hình hỗ trợ

Chúng ta chia ra 3 mô hình cơ bản:

Hệ thống tác vụ đơn (superloop)

Toàn bộ chương trình chạy trong một vòng siêu lặp. Thông thường, tất cả các thành phần phần mềm được gọi một cách định kỳ.

void main (void) { HARDWARE_Init(); /* Init software components */ XXX_Init(); YYY_Init(); /* Superloop: call all software components regularily */ while (1) { /* Exec all compontents of the software */ XXX_Exec(); YYY_Exec(); } }

Ưu Điểm: không có sử dụng kernel thời gian thực -> kích thước ROM nhỏ, chỉ có 1 stack -> ít RAM hơn, không có vấn đề quyền ưu tiên hoặc đồng bộ.

Nhược điểm: siêu vòng lặp của chương trình có thể trở nên khó khăn bảo trì nếu nó có kích thước chương trình lớn lên. Trạng thái thời gian thực là xấu, cho khi một thành phần phần mềm không thể bị ngắt bởi bất kỳ một thành phần khác (chỉ bằng các ngắt). Điều này nghĩa là thời gian phản ứng lại của một thành phần phần mêm phụ thuộc vào thời gian thực thi của mọi thành phần khác trong hệ thống.

Sử dụng emWin: không có sự hạn chế thực tế nào về việc sử dụng emWin. Lúc nào cũng thế, GUI_Init() được gọi trước khi bạn sử dụng phần mềm. Từ khi đó, mọi hàm API có thể được sử dụng. Nếu kỹ thuật callback Window Manager được sử dụng, thì một hàm cập nhập emWin được gọi thường xuyên. Đây là đặc trưng hoàn thành bởi gọi hàm GUI_Exec() từ bên trong siêu vòng lặp. Các hàm ngăn chặn như GUI_Delay() và GUI_ExecDialog không nên được sử dụng trong vòng lặp khi chúng muốn ngăn chặn các modun phần mềm khác.

Cấu hình mặc định, khi không hỗ trợ đa tác vụ (#define GUI_OS 0) được sử dụng; các thủ tục kernel không được yêu cầu.

void main (void) { HARDWARE_Init(); /* Init software components */ XXX_Init(); YYY_Init(); GUI_Init(); /* Init emWin */ /* Superloop: call all software components regularily */ while (1) { /* Exec all compontents of the software */ XXX_Exec(); YYY_Exec(); GUI_Exec(); /* Exec emWin for functionality like updating windows */ } }

Hệ thống đa tác vụ: một tác vụ gọi emWin

RTOS được sử dụng. Người lập trình chia chương trình thành nhiều phần, mà nó thực thi trong những tác vụ khác nhau và có những độ ưu tiên điển hình khác nhau. Thông thường các tác vụ tới hạn thời gian thực (chúng yêu cầu thời gian phản hồi nào đó) sẽ có độ ưu tiên cao nhất. Một tác vụ đơn được sử dụng cho giao diện người dùng, chúng gọi các hàm emWin. Tác vụ này thường có độ ưu tiên thấp nhất trong hệ thống hoặc ít nhất là một trong những tác vụ có độ ưu tiên thấp nhất.

Ưu điểm: cách xử lý thời gian thực của hệ thống rất nổi trội. Cách xử lý thời gian thực của một tác vụ chỉ ảnh hưởng bởi những tác vụ đang chạy ở độ ưu tiên cao hơn. Điều này nghĩa là thay đổi một thành phần chương trình đang chạy ở một tác vụ có độ ưu tiên thấp không ảnh hưởng tới mọi xử lý thời gian thực. Nếu giao diện người dùng được thực thi từ một tác vụ có độ ưu tiên thấp, điều này nghĩa là thay đổi giao diện người dùng không ảnh hưởng tới xử lý thời gian thực. Loại hệ thống này dễ dàng ấn định những thành phần khác nhau của phần mềm cho những thành viên khác nhau của nhóm phát triển.

Nhược điểm: Bạn cần một RTOS, mà chúng có chi phí và sử dụng nhiều ROM và RAM. Thêm nữa, bạn sẽ nghĩ về việc đồng bộ tác vụ và truyền thông tin như thế nào từ tác vụ tới tác vụ khác.

results matching ""

    No results matching ""