
آموزش (LTDC) استفاده از کنترلر نمایشگر LCD-TFT در میکروکنترلرهای STM32
- ارسال شده توسط Reza Mehrabani
- تاریخ آگوست 1, 2025
- دسته بندی دستهبندی نشده
- نظرات 0 نظر
پادکست LTDC:
آموزش کامل استفاده از کنترلر نمایشگر LCD-TFT (LTDC) در میکروکنترلرهای STM32
مقدمه
با پیشرفت روزافزون در کاربردهای موبایل، صنعتی و مصرفکننده، نیاز به رابطهای کاربری گرافیکی (GUI) با کیفیت بالا و منابع سختافزاری و نرمافزاری بیشتر به شدت افزایش یافته است. میکروکنترلرهای STM32 با بهرهگیری از کنترلر نمایشگر LCD-TFT (LTDC) تعبیهشده، امکان کنترل مستقیم پنلهای نمایشگر با وضوح بالا را بدون نیاز به دخالت مداوم CPU فراهم میکنند. این کنترلر قادر است بهصورت مستقل به حافظههای داخلی یا خارجی دسترسی پیدا کرده و دادههای پیکسلی را برای نمایشگرها فراهم کند. این آموزش بر اساس یادداشت کاربردی AN4861 تهیه شده و به شما کمک میکند تا با مفاهیم پایه، پیکربندی و بهینهسازی عملکرد LTDC آشنا شوید.۱. مفاهیم پایه گرافیک در LTDC
اجزای سیستم گرافیکی تعبیهشده
یک سیستم گرافیکی تعبیهشده شامل اجزای زیر است:- میکروکنترلر (MCU):
- مسئول محاسبه تصویر نمایش دادهشده در framebuffer با استفاده از عناصر گرافیکی (primitives) مانند آیکونها یا تصاویر است.
- این عملیات توسط CPU و با استفاده از کتابخانههای گرافیکی انجام میشود و میتواند با استفاده از سختافزارهایی مانند Chrom-Art Accelerator (DMA2D) تسریع شود.
- نرخ بهروزرسانی بالاتر framebuffer منجر به انیمیشنهای روانتر (بالاترین نرخ فریم در ثانیه یا fps) میشود.
- Framebuffer:
- حافظه فراری است که دادههای پیکسلی تصویر را ذخیره میکند (معمولاً به آن RAM گرافیکی یا GRAM گفته میشود).
- اندازه framebuffer به وضوح نمایشگر (تعداد پیکسلها) و عمق رنگ (bits per pixel یا bpp) بستگی دارد.
- تکنیک Double Buffering از دو framebuffer استفاده میکند تا از نمایش محتوای در حال نوشتن جلوگیری کند.
- کنترلر نمایشگر:
- بهطور مداوم نمایشگر را با نرخ تازهسازی (معمولاً 60 هرتز) بهروزرسانی میکند و دادههای framebuffer را به شیشه نمایشگر منتقل میکند.
- کنترلر نمایشگر میتواند در ماژول نمایشگر یا در MCU تعبیه شده باشد (مانند LTDC در STM32).
- شیشه نمایشگر (Display Glass):
- مسئول نمایش تصویر است و از ماتریسی از پیکسلها تشکیل شده است.
- ویژگیهای کلیدی نمایشگر شامل:
- وضوح (Resolution): تعداد پیکسلها در جهت افقی و عمودی (مثلاً 800×480).
- عمق رنگ (Color Depth): تعداد رنگهای قابلنمایش برای هر پیکسل (مثلاً 24 bpp برای 16.7 میلیون رنگ در فرمت RGB888).
- نرخ تازهسازی (Refresh Rate): تعداد دفعات بهروزرسانی نمایشگر در ثانیه (معمولاً 60 هرتز برای جلوگیری از اثرات بصری نامطلوب).
دستهبندی ماژولهای نمایشگر
ماژولهای نمایشگر به دو دسته تقسیم میشوند:- نمایشگرهای با کنترلر داخلی و GRAM:
- این نمایشگرها دارای کنترلر داخلی و حافظه گرافیکی (GRAM) هستند که دادههای پیکسلی را ذخیره میکند.
- نمایشگرهای بدون کنترلر داخلی و GRAM:
- این نمایشگرها تنها یک کنترلر زمانبندی سطح پایین دارند و نیاز به framebuffer خارجی دارند که میتواند در SRAM داخلی MCU یا حافظه خارجی (مانند SDRAM/SRAM) قرار گیرد.
فناوریهای نمایشگر
دو فناوری اصلی نمایشگر در بازار عبارتند از:- LCD-TFT (Liquid Crystal Display – Thin Film Transistor):
- از فناوری TFT برای کنترل دقیقتر پیکسلها استفاده میکند.
- زمان پاسخ سریع و کنترل دقیق رنگ را فراهم میکند.
- نیاز به نور پسزمینه دارد.
- OLED (Organic LED):
- از LEDهای ارگانیک تشکیل شده که مستقیماً نور ساطع میکنند.
- کنتراست بهتر، مصرف بهینهتر و امکان استفاده از نمایشگرهای انعطافپذیر را فراهم میکند.
- نیازی به نور پسزمینه ندارد و زاویه دید آزاد و زمان پاسخ سریعتری دارد.
استانداردهای رابط نمایشگر MIPI
MIPI Alliance استانداردهای رابط نمایشگر را برای دستگاههای موبایل تعریف کرده است:- MIPI-DBI (Display Bus Interface):
- برای نمایشگرهای دارای GRAM استفاده میشود.
- انواع:
- Type A: مبتنی بر گذرگاه Motorola 6800.
- Type B: مبتنی بر گذرگاه Intel 8080.
- Type C: مبتنی بر پروتکل SPI.
- دادههای پیکسلی در GRAM محلی نمایشگر بهروزرسانی میشوند.
- MIPI-DPI (Display Parallel Interface):
- برای نمایشگرهای بدون GRAM استفاده میشود.
- از سیگنالینگ RGB (16 تا 24 بیتی) با سیگنالهای همگامسازی (HSYNC, VSYNC, EN, LCD_CLK) استفاده میکند.
- نیاز به انتقال دادههای پیکسلی بهصورت بلادرنگ دارد که پهنای باند بالایی را میطلبد.
- MIPI-DSI (Display Serial Interface):
- از لینک تفاضلی چند لاین با پهنای باند بالا استفاده میکند.
- سیگنالهای DBI یا DPI را کپسوله کرده و از طریق پروتکل PPI به D-PHY منتقل میکند.
۲. معرفی کنترلر LTDC در STM32
کنترلر LCD-TFT (LTDC) در میکروکنترلرهای STM32 یک رابط قدرتمند و انعطافپذیر برای اتصال به نمایشگرهای LCD-TFT و OLED است. ویژگیهای کلیدی LTDC عبارتند از:- دسترسی مستقل به حافظه: LTDC بهعنوان یک master در معماری AHB عمل میکند و میتواند بهصورت مستقل دادههای گرافیکی را از حافظههای داخلی یا خارجی (مانند SRAM یا SDRAM) بخواند.
- پشتیبانی از دو لایه (Layer): LTDC از دو لایه مستقل پشتیبانی میکند که هر کدام میتوانند بهصورت جداگانه فعال، غیرفعال یا پیکربندی شوند.
- زمانبندی انعطافپذیر: LTDC از رزولوشنهای تا 4096×2048 پیکسل و زمانبندیهای قابلبرنامهریزی پشتیبانی میکند.
- مدیریت وقفهها: LTDC دو وقفه جهانی (Global Interrupt و Global Error Interrupt) را پشتیبانی میکند.
- حالتهای کممصرف: LTDC در حالت Sleep فعال باقی میماند و دادههای گرافیکی را به نمایشگر ارسال میکند، اما در حالت Stop یا Standby غیرفعال میشود.
مزایای استفاده از LTDC
- عملکرد بالا: دسترسی مستقل به حافظه و پشتیبانی از Chrom-Art Accelerator (DMA2D) برای تسریع پردازش گرافیکی.
- انعطافپذیری: پشتیبانی از رزولوشنها و زمانبندیهای مختلف.
- کاهش بار CPU: LTDC دادهها را مستقیماً از framebuffer خوانده و به نمایشگر ارسال میکند.
- پشتیبانی از نمایشگرهای متنوع: سازگاری با LCD-TFT و OLED با سیگنالهای مختلف (مانند RGB888).
۳. مراحل ایجاد یک اپلیکیشن گرافیکی با LTDC
برای توسعه یک اپلیکیشن گرافیکی با استفاده از LTDC، باید مراحل زیر را طی کنید:۱. تعیین اندازه و مکان Framebuffer
- اندازه Framebuffer: اندازه مورد نیاز به وضوح و عمق رنگ نمایشگر بستگی دارد. بهعنوان مثال، برای نمایشگر 480×272 با عمق رنگ 16 bpp، اندازه framebuffer برابر است با:
Framebuffer Size = 480 × 272 × 16 bits = 130,560 bytes ≈ 128 Kbytes
- مکان Framebuffer: میتواند در SRAM داخلی یا حافظه خارجی (SDRAM/SRAM) قرار گیرد. استفاده از SRAM داخلی برای نمایشگرهای کوچکتر مناسبتر است، در حالی که حافظه خارجی برای رزولوشنهای بالاتر توصیه میشود.
- Double Buffering: برای جلوگیری از نمایش محتوای در حال نوشتن، از دو framebuffer (frontbuffer و backbuffer) استفاده کنید.
۲. بررسی سازگاری نمایشگر با پهنای باند حافظه
- پهنای باند مورد نیاز: پهنای باند مورد نیاز برای LTDC به رزولوشن، عمق رنگ و نرخ تازهسازی بستگی دارد. برای مثال:
Bandwidth = Resolution × Color Depth × Refresh Rate
برای نمایشگر 800×480 با 24 bpp و 60 هرتز:Bandwidth = 800 × 480 × 24 × 60 = 552.96 Mbps
- محدودیتهای سختافزاری: حداکثر فرکانس پیکسل (Pixel Clock) برای STM32F4x9 یا STM32F7x7/8/9 را بررسی کنید (مراجعه به جداول 10، 11، 13 و 15 در سند AN4861).
- کنترل رقابت گذرگاه (Bus Concurrency): در صورت استفاده از حافظه خارجی، رقابت بین LTDC، DMA2D و CPU میتواند عملکرد را تحت تأثیر قرار دهد. برای کاهش این تأثیر، از حافظههای با پهنای باند بالا (مانند SDRAM با عرض 32 بیت) استفاده کنید.
۳. بررسی سازگاری رابط نمایشگر با LTDC
- رابطهای پشتیبانیشده: LTDC از رابطهای RGB (مانند RGB888، RGB565) و استانداردهای MIPI-DPI پشتیبانی میکند.
- پیکربندی پینها: پینهای GPIO مرتبط با LTDC باید بهعنوان Alternate Function پیکربندی شوند و در حالت Very High Speed تنظیم شوند (مراجعه به جدول 18 در سند AN4861).
- سیگنالهای زمانبندی: سیگنالهای HSYNC، VSYNC، EN و LCD_CLK باید با مشخصات نمایشگر مطابقت داشته باشند.
۴. همگامسازی LTDC با DMA2D و CPU
- استفاده از DMA2D: Chrom-Art Accelerator (DMA2D) برای پردازش گرافیکی سریعتر استفاده میشود، مانند ترکیب لایهها یا تبدیل فرمتهای رنگی.
- همگامسازی: برای جلوگیری از نمایش محتوای ناقص، از تکنیکهای چندگانه بافرینگ (مانند Double Buffering) استفاده کنید. بهروزرسانی framebuffer در دورههای Blanking انجام شود تا از تداخل جلوگیری شود.
۵. بهینهسازی عملکرد گرافیکی
- تخصیص حافظه: استفاده از SRAM داخلی برای کاهش تأخیر و افزایش عملکرد توصیه میشود. در صورت استفاده از حافظه خارجی، اطمینان حاصل کنید که عرض خط حافظه (مانند 64 یا 128 بایت) با اندازه خط framebuffer همتراز باشد تا از دسترسیهای غیربهینه جلوگیری شود.
- مدیریت مرز ۱ کیلوبایتی: اگر عرض خط framebuffer مضربی از 64/128 بایت نباشد، LTDC ممکن است دسترسیهای تکنوبتی انجام دهد که عملکرد را کاهش میدهد. برای حل این مشکل:
- روش اول: کاهش عرض لایه و framebuffer به مضرب 64/128 بایت (مثال: کاهش عرض از 480 به 448 پیکسل).
- روش دوم: افزودن بایتهای غیرفعال (dummy bytes) به انتهای هر خط برای رسیدن به مضرب 64/128 بایت.
- بهروزرسانی در دوره Blanking: بهروزرسانی محتوای framebuffer در دورههای Blanking (مانند VSYNC) برای جلوگیری از نمایش محتوای ناقص.
- استفاده از کش Cortex-M7: فعالسازی کش برای دسترسیهای CPU به حافظه خارجی (مانند SDRAM) عملکرد را بهبود میبخشد. پس از نوشتن دادهها به framebuffer، کش باید با استفاده از تابع
SCB_CleanDCache()پاک شود.
۶. پیکربندی LTDC با STM32CubeMX
الف) پیکربندی پینهای GPIO
- پینهای LTDC (مانند RGB، HSYNC، VSYNC، EN، LCD_CLK) را در STM32CubeMX بهعنوان Alternate Function پیکربندی کنید.
- سرعت خروجی پینها را روی Very High تنظیم کنید (مراجعه به شکل 38 در سند AN4861).
- پین LCD_DISP را برای فعالسازی نمایشگر روی سطح High تنظیم کنید.
ب) پیکربندی ساعت سیستم و پیکسل
- ساعت سیستم (HCLK): برای مثال، در STM32F7، ساعت سیستم را روی 200 مگاهرتز تنظیم کنید و ساعت SDRAM/FMC را روی 100 مگاهرتز با پیشتقسیمکننده HCLK/2 پیکربندی کنید (مراجعه به شکل 44).
- ساعت پیکسل (LCD_CLK): ساعت پیکسل باید با مشخصات نمایشگر (مانند ROCKTECH RK043FN48H) مطابقت داشته باشد. برای محاسبه:
LCD_CLK = Horizontal Total × Vertical Total × Refresh Rate
مقادیر زمانبندی (مانند HSYNC، VSYNC، Back Porch، Front Porch) را از دیتاشیت نمایشگر استخراج کرده و در تب Parameter Settings در STM32CubeMX وارد کنید (مراجعه به شکل 47).
ج) پیکربندی لایههای LTDC
- پارامترهای لایه (مانند وضوح، فرمت پیکسل، آلفا، آدرس framebuffer) را در تب Layer Settings تنظیم کنید.
- برای مثال، برای نمایشگر 480×272 با فرمت RGB888:
playerCfg.WindowX0 = 0; playerCfg.WindowX1 = 480; playerCfg.WindowY0 = 0; playerCfg.WindowY1 = 272; playerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888; playerCfg.Alpha = 255; playerCfg.Backcolor.Blue = 0; playerCfg.Backcolor.Green = 0; playerCfg.Backcolor.Red = 0; if (HAL_LTDC_ConfigLayer(&hldc, &playerCfg, 0) != HAL_OK) { Error_Handler(); }
د) نمایش تصویر از فلش داخلی
- تصویر را با استفاده از ابزار LCD-Image-Converter به فرمت C تبدیل کنید (مراجعه به شکل 49).
- در تب Options، فرمت RGB565 یا RGB888 را انتخاب کرده و Block Size را روی 32 بیت تنظیم کنید.
- آدرس شروع framebuffer لایه ۱ را به آدرس تصویر در فلش داخلی تنظیم کنید:
playerCfg.FBStartAddress = (uint32_t)image_data;
ه) پیکربندی MPU و کش
- MPU: برای حافظه SDRAM یا Quad-SPI، ویژگیهای MPU را بهعنوان Normal Cacheable با دسترسی خواندن/نوشتن و بدون اجرای کد (Execute Never) تنظیم کنید (مراجعه به شکل 52).
- کش: کش Cortex-M7 را برای دسترسی به حافظه خارجی فعال کنید و پس از نوشتن دادهها به framebuffer، از تابع
SCB_CleanDCache()برای پاکسازی کش استفاده کنید.
و) فعالسازی وقفههای LTDC
- وقفههای FIFO Underrun و Transfer Error را در تابع
HAL_LTDC_Init()فعال کنید. - وقفه جهانی LTDC را در تب NVIC Settings در STM32CubeMX فعال کنید (مراجعه به شکل 42).
۴. بهینهسازی مصرف توان
- حالت Sleep: در حالت بیکار، MCU را در حالت Sleep قرار دهید تا مصرف توان کاهش یابد. در این حالت، LTDC همچنان فعال است و دادهها را به نمایشگر ارسال میکند.
- حالت Self-Refresh برای SDRAM: در حالت بیکار، SDRAM را در حالت Self-Refresh قرار دهید تا مصرف توان کاهش یابد.
- خاموش کردن نمایشگر: در صورت عدم نیاز به نمایشگر، آن را غیرفعال کنید یا در حالت کممصرف قرار دهید.
۵. مثالهای کاربردی
مثال: پیکربندی LTDC برای نمایشگر ROCKTECH RK043FN48H
- مشخصات نمایشگر: رزولوشن 480×272، فرمت RGB888، نرخ تازهسازی 60 هرتز.
- پیکربندی پینها: پینهای RGB، HSYNC، VSYNC، EN و LCD_CLK را بهعنوان Alternate Function تنظیم کنید.
- پیکربندی ساعت: ساعت پیکسل را بر اساس دیتاشیت نمایشگر تنظیم کنید.
- پیکربندی لایه: لایه ۱ را برای رزولوشن 480×272 و فرمت RGB888 تنظیم کنید.
- نمایش تصویر: تصویر را از فلش داخلی یا SDRAM خارجی بخوانید و نمایش دهید.
- MPU و کش: منطقه SDRAM را بهعنوان Normal Cacheable با دسترسی خواندن/نوشتن پیکربندی کنید.
سختافزارهای مرجع
STM32 دارای بردهای مرجع متعددی مانند Nucleo، Discovery و Evaluation است که بسیاری از آنها نمایشگرهای LCD-TFT را پشتیبانی میکنند (مراجعه به بخش 6.3 در سند AN4861).۶. پرسشهای متداول
- حداکثر رزولوشن پشتیبانیشده توسط LTDC چیست؟رزولوشن حداکثر 4096×2048 پیکسل است، اما به پهنای باند حافظه و فرکانس پیکسل بستگی دارد.
- چگونه از وقفههای LTDC استفاده کنیم؟وقفههای FIFO Underrun و Transfer Error را در تابع HAL فعال کنید و وقفه جهانی را در NVIC تنظیم کنید.
- چگونه مصرف توان را کاهش دهیم؟از حالتهای کممصرف مانند Sleep و Self-Refresh برای SDRAM استفاده کنید.
۷. نتیجهگیری
کنترلر LTDC در میکروکنترلرهای STM32 یک راهحل انعطافپذیر و قدرتمند برای توسعه اپلیکیشنهای گرافیکی با هزینه کم و عملکرد بالا است. با پیکربندی صحیح LTDC، استفاده از DMA2D، مدیریت بهینه حافظه و فعالسازی کش، میتوانید عملکرد گرافیکی سیستم را به حداکثر برسانید. این آموزش شما را با مراحل کلیدی پیکربندی و بهینهسازی LTDC آشنا کرد تا بتوانید اپلیکیشنهای گرافیکی پیشرفتهای را با STM32 توسعه دهید.منابع
- یادداشت کاربردی AN4861: LCD-TFT display controller (LTDC) on STM32 MCUs
- دیتاشیتهای میکروکنترلرهای STM32
- ابزار STM32CubeMX و LCD-Image-Converter
ما کنار هم رشد می کنیم.
شما همچنین ممکن است دوست داشته باشید
اتصال سنسور دمای LM35 به آردوینو
جولای 21, 2025
آموزش LabView
می 13, 2025
