در میکرکنترلرهای سری stm32f7 واحد LTDC دارای دو لایه است که هر کدام میتوانند بصورت مستقل فعال و برنامه ریزی شوند. هنگامیکه لایهها با یکدیگر همپوشانی داشته باشند، ترتیب نمایش آنها همیشه از یک ثابت پیروی میکند. بطوریکه که همیشه لایه دو بر روی لایه یک نمایش داده میشود. همانطور که در بخش قبل بیان شد، LTDC دارای قابلیت Blending است که امکان ترکیب تصویر هر لایه با لایه دیگر و تصویر پس زمینه را فراهم میکند. در حالت دو لایه ابتدا تصویر لایه اول با تصویر پس زمینه ترکیب شده و نتیجه آن با تصویر دوم ترکیب میشود. در شکل 1 نحوه ترکیب دو لایه و تصویر پس زمینه نشان داده شده است.
LTDC این امکان را فراهم می آورد که در زمان Runtime مکان و اندازه هر لایه تصویر را تغییر داد.
وقفه های LTDC
LTDC دارای دو وقفه عمومی زیر است:
وقفه عمومی LTDC
وقفه عمومی خطای LTDC
منابع وقفه LTDC در جدول 1 نشان داده شده است. سیگنالهای وقفه دو به دو با یکدیگر AND شده اند. در این پروژه از وقفه Line استفاده شده است. این وقفه هنگامی روی میدهد که LTDC به خط مشخصی از تصویر برسد.
نحوه تنظیم LTDC در نرم افزار STM32CubeMX
در بخش قبل نحوه تنظیم LTDC در حالت یک لایه نشان داده شد. لذا از تکرار آن در این بخش خوداری شده است. در این بخش نحوه تنظیم آن در حالت دو لایه و با تصویر پس زمینه و وقفه بیان شده است. یادآوری میشود که در این پروژه از بورد stm32f7discovery استفاده شده است که دارای یک LCD گرافیکی با ابعاد 480×272 پیکسل است.
برای تنظیم LTDC بصورت دو لایه در نرم افزار STM32CubeMX در بخش LTDC سربرگ Layer Settings ابتدا مقدار فیلد Number of Layers را برابر 2 Layer قرار دهید. سپس در قسمت Window Position اندازه و مکان هر لایه را تنظیم کنید. در این پروژه این بخش بصورت شکل زیر تنظیم شده است. در این پروژه کل صفحه نمایشگر به دو قسمت مساوی بین لایهها تقسیم شده است.
لازم به ذکر است در اینجا از فرمت پیکس RGB565 استفاده شده است. در صورتی که از فرمت دیگری استفاده میکنید، این فیلد را با توجه فرمت موردنظر تنظیم نمایید.
چگونگی ترکیب لایهها با یکدیگر در قسمت Blending تنظیم میشود. فیلد Alpha constant for blending ضریب ترکیب هر لایه را با لایههای دیگر و تصویر پس زمینه را مشخص میکند. مقدار این فیلد عددی بین 0 تا 255 است. در شکل زیر چگونگی تنظیم این بخش که در این پروژه استفاده شده است، نشان داده شده است.
در بخش Frame Buffer تنظیمات بافر هر لایه انجام میشود. در شکل زیر نحوه تنظیم این بخش نشان داده شده است.
در فیلد Background نیز مقدار تصویر پس زمینه مشخص میشود. در این پروژه از تصویر کاملا مشکی که مقادیر هر سه فیلد R، G و B آن صفر است استفاده شده است. چگونگی تنظیم این فیلد در شکل 5 نشان داده شده است.
نحوه فعال نمودن وقفه LTDC در نرم افزار STM32CubeMX
برای فعال نمودن وقفه LTDC تنها کافیست در قسمت LTDC سربرگ NVIC Settings تیک LTDC global interrupt را بزنید و جهت تغییر اولویت وقفه آن در قسمت NVIC اولویت آن تنظیم کنید. با توجه به اینکه در این پروژه فقط یک منبع وقفه وجود دارد لذا از همان مقدار پیشفرض آن استفاده شده است. در شکل 6 چگونگی فعال نمودن این واحد نشان داده شده است.
بعد از انجام تنظیمات فوق به سربرگ Project Manager رفته و مسیر و نام پروژه را تنظیم کرده و بر روی GENERATE CODE کلیک کرده تا پروژه جدید ایجاد شود.
تبدیل تصویر به فایل C
در بخش قبل نحوه تبدیل تصویر به فایل .h و یا .c با استفاده از نرم افزار lcd_convertor بیان شد. لذا در این قسمت از بیان مجدد آن پرهیز شده است. لازم به ذکر است که حتما فرمت پیکسل که در این نرم افزار انتخاب میکنید با فرمت پیکسل که در نرم افزار STM32CubeMX انتخاب کردهاید، مطابقت داشته باشد. در این پروژه از فرمت پیکسل RGB565 استفاده شده است.
نرم افزار پروژه
همانطور که در بخش قبل بیان شد، جهت نماش تصویر ابتدا با در تابع MX_LTDC_Init که نرم افزار STM32CubeMX تولید میکند، آدرس شروع فریم را تنظیم نمود. برای این منظور کافیست تا دستورات زیر تغییر داد.
لازم به ذکر است که image_data_pic1 و image_data_pic2 تصاویر موردنظر هستند که با استفاده از نرم افزار lcd_convertor ایجاد شده اند.
سپس برای فعال نمودن وقفه Line باید تابع HAL_LTDC_ProgramLineEvent را فراخوانی نمود. الگوی این تابع بصورت زیر است.
در این تابع آرگومان hltdc پورت LTDC و آروگومان Line شماره Line موردنظر را مشخص میکند.
در وقفه LTDC نیز همانند سایر وقفههای میکروکنترلر باید تابع Callback متناظر با وقفه آن باید overwrite شود. در این پروژه در روتین وقفه LTDC بصورت زیر است.
در روتین وقفه فلگ ReloadFlag یک میشود و در حلقه بینهایت برنامه هنگامی که یک فلگ یک شود موقعیت تصویر را جابجا میکند.
تابع main
تابع main این پروژه بصورت زیر است.
در این برنامه از تابع PicturesPosition برای تنظیم موقعیت تصویر استفاده شده است که بدنه آن بصورت زیر است.
از تابع HAL_LTDC_SetWindowPosition_NoReload نیز برای ست کردن موقعیت تصویر بر روی نمایشگر استفاده شده است. الگوی این تابع بصورت زیر است.
آروگومان hltdc واحد LTDC موردنظر و X0 و Y0 موقعیت نقطه شروع لایه و LayerIdx شماره لایه را مشخص میکنند.