پروژه راه اندازی TFT LCD توسط STM32

با سلام خدمت همه دوستان

در این مطلب قصد دارم اموزشی جامع از راه اندازی انواع lcd tft ها با انواع stm32 هارو خدمتتون عرض کنم.

در ابتدا یک دید کلی بهتون بدم که ما دو نوع lcd داریم:

1-lcd tft ها با درایور داخلی (ای سی های درایور lcd مثل ili9325 , ili9341,ILI9486 ,ST7789V ,HX8352B , SSD1963 و …)

این مدل از lcd ها با درایور داخلی(گاها درایور داخل lcd است و در ظاهر ای سی آن دیده نمی شود)با هر میکرویی میتوان انها را راه اندازی کرد توسط gpio که دارای 16خط دیتا(یا 8 خط دیتا) و چند پایه کنترلی هستند.اما اگر سرعت بیشتری از lcd بخواین هنگام ریفرش و … میتوانید lcd را توسط واحد fsmc میکرو stm 32 نیز راه اندازی کنید.

2-lcd tft های بدون درایور داخلی و خام که این lcd عموما سایزشون بزرگتر و گرون تر و با کابل fpc موجود هستند و برای راه اندازی انها از میکروهایی باید استفاده کنید که واحد کنترلر lcd داشته باشن مثل میکرو lpc1788 و stm32f429 که دارای واحد ltdc هستش.

به صورت کلی:

در میکرو های کمتر از 100 پایه باید با GPIO این TFT رو راه بندازین.
در میکرو های 100 پایه تا 144 پایه با واحد کنترلر رم خارجی (FSMC) راه بندازین(ال سی دی به جای واحد sram به میکرو وصل میشه).
و در میکرو های بالای 144 پایه یا بعضی از 144 پایه با واحد LTDC و tft های بالای 4.3 اینچ تا 10.1 اینچ راه بندازین.

کلمه fsmc مخفف flexible static memory controller هستش که به انواع حافظه‌های NOR – sram و کنترلرهای ال سی دی که عملا یه sram هستند و … متصل میشود، واحد fsmc در واقع باس داخلی میکرو هستش که اوردنش روی پینهای میکرو .

این‌قابلیت رو هم داره که با dma بشه‌ نقل و انتقالات دیتا رو انجام داد، ابته اگر بخواهید ال‌سی‌دی رو به واحد fsmc وصل کنید باید یه کنترلر ال سی دی این‌ وسط باشه مثل ssd1963 و یا ili9325 و… یا اینکه خود میکرو واحد ltdc داشته باشه که سری ۱۰۳ فکر کنم نداره و از سری ۴ شروع میشه و اون میکرو ها دیگه fsmc ندارن … اونا fmc دارن که sdram رو ساپورت میکنه مثل سری ۴۲۹.

راه اندازی lcd n96 توسط GPIO میکرو stm32f103c8t6 و توابع هال در cubeMx و keil:

 

در ابتدا ما قصد داریم توسط میکروی stm32f103c8t6 ال سی دی با درایور ili9325 ( معروف به N96) را توسط gpio  راه اندازی کنیم.

برای استفاده از حداکثر سرعت تمام پین های دیتای lcd را مستقیما به پورت B بدهید(کل پورت B در کیوب خروجی شده است)

اگر از هدر برد زیر استفاده میکنید تمام پین های پورت B روی برد بیرون کشیده شده اند به جز پین B.2 که به صورت پین هدر روی برد قرار دارد (میتونید ازش سیم بگیرید به صورت شکل زیر و حتما جامپر اون (جامپر بوت 2) رو هم بردارید. )

به صورت شکل زیر:

ال سی دی مورد استفاده ما هدر برد ECA می باشد که به LCD N96 با درایور ILI9325 معروف است:

 

کانکشن پین های دیتا به صورت زیر باشند:

LCD D1-D8 => MICRO B0-B7

LCD D10-D17=>MICRO B8-B15

و پین های کنترلی هم به صورت زیر متصل می شوند:

#define RST_LOW HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,0)
#define RST_HIGH HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,1)
#define RS_LOW HAL_GPIO_WritePin(LCD_RS_GPIO_Port,LCD_RS_Pin,0)
#define RS_HIGH HAL_GPIO_WritePin(LCD_RS_GPIO_Port,LCD_RS_Pin,1)
#define CS_LOW HAL_GPIO_WritePin(LCD_CS_GPIO_Port,LCD_CS_Pin,0)
#define CS_HIGH HAL_GPIO_WritePin(LCD_CS_GPIO_Port,LCD_CS_Pin,1)
#define RD_LOW HAL_GPIO_WritePin(LCD_RD_GPIO_Port,LCD_RD_Pin,0)
#define RD_HIGH HAL_GPIO_WritePin(LCD_RD_GPIO_Port,LCD_RD_Pin,1)
#define WR_LOW HAL_GPIO_WritePin(LCD_WR_GPIO_Port,LCD_WR_Pin,0)
#define WR_HIGH HAL_GPIO_WritePin(LCD_WR_GPIO_Port,LCD_WR_Pin,1)

به راحتی میتوانید عکس روی LCD نمایش بدهید که برای این کار ابتدا باید عکس را به فرمت BMP 24 بیت تبدیل کنید بعد با نرم افزار زیر به ارایه تبدیل کنید و بعد نمایش بدهید.

عکس مورد نظرتون را لود کنید(تنظیمات سمت راست رو تغییر ندید)

در مرحله بعد عبارت short را به int  تغییر بدهید و طول و عرض تصویر را به خاطر بسپارید و در نهایت روی جنریت کلیک کنید تا فایل h. برای شما تولید شود،در ادامه فایل دات اچ را با نوت پد باز کنید و مقدار طول و عرض تصویر را به واحد پیکسل در ابتدای ارایه مانند شکل زیر وارد کنید:

 

فایل h. را ذخیره کنید  و آن را به پوشه پروژه خود اضافه کنید و در برنامه اینکلود کنید

با دستور زیر میتوانید عکس را روی lcd در مختصات دلخواه نمایش دهید:

lcd_write_pic(x,y,name);

توسط تابع زیر میتوانید رنگ پس زمینه دلخواه ایجاد کنید:

lcd_background_color(RED);

با استفاده از دیفاین زیر میتوانید مشخص کنید که lcd  به صورت افقی اجرا شود یا عمودی:

#define LANDSCAPE OR #define PORTRAIT

تصاویری از پروژه های درحال انجام :

 

فیلم راه اندازی و سرعت ریفرش شدن lcd و نمایش عکس و اشکال هندسی و متن انگلیسی با بخش GPIO میکرو STM32f103c8t6 را در زیر مشاهده میکنید:

کد با توابع هال cube mx و کامپایلر keil نوشته شده است.

کدش رو در پایین پست جهت دریافت قرار میدم.

فیلم راه اندازی و سرعت ریفرش شدن lcd و نمایش عکس و اشکال هندسی و متن فارسی و انگلیسی با بخش GPIO میکرو STM32f103c8t6 را در زیر مشاهده میکنید:

کد با توابع هال cube mx و کامپایلر keil نوشته شده است.

کدش رو در پایین پست جهت دریافت قرار میدم.

در ادامه همانطور که میدانید سرعت gpio برای راه اندازی lcd tft بسیار کند است و اگر بخواهیم منویی ایجاد کنیم یا عکسی نمایش دهیم عکس به کندی لود میشود.

دقت کنید که حافظه فلش میکرو stm32f103c8t6 برای ذخیره یک عکس 320 در 240 کافی نیست برای همین در ویدئو بالا ما یک عکس با سایز کوچکتر نمایش دادیم (در ادامه عکس را از sd کارت می‌خوانیم تا مشکل حافظه نداشته باشیم) و کندی سرعت آن چندان احساس نمی شود،در زیر ما از یک میکرو stm32f103vet6 استفاده میکنیم که حافظه فلش ان 512 کیلو بایت است و یک عکس 320 در 240 با فرمت bmp تقریبا 250 کیلو بایت آن را اشغال میکند،ابتدا عکس را واحد gpio از روی فلش میکرو خوانده و روی lcd نمایش می دهیم تا سرعت ریفرش را ببینید:

راه اندازی lcd n96 ili9325 توسط GPIO میکرو stm32f103vet6 و توابع هال در cubeMx و keil:

کد با توابع هال cube mx و کامپایلر keil نوشته شده است.

کدش رو در پایین پست جهت دریافت قرار میدم.

راه اندازی lcd n96 ili9325 توسط واحد fsmc میکرو stm32f103cvet6 و توابع هال در cubeMx و keil:

کد با توابع هال cube mx و کامپایلر keil نوشته شده است.

کدش رو در پایین پست جهت دریافت قرار میدم.

مشاهده میکنید که سرعت ریفرش عکس بسیار بیشتر از حالت gpio شده است و این طبیعیه چون میکرو 16 خط دیتارو همزمان و با حداکثر فرکانس کاری میکرو روی lcd منتقل می‌کند.

در ادامه lcd سایز بزرگتر با تراکم پیکسلی بیشتر و خواندن بایت به بایت عکس bmp از روی sd کارت را بررسی میکنیم

راه اندازی “lcd tft ili9486 3.2 با استفاده از میکروی stm32f103vet6

برنامه به زبان سی در IDE KEIL نوشته شده است و از توابع HAL و CUBE MX استفاده شده است.

 

نمایش عکس از روی sd card با واحد sdio روی lcd ili9325 توسط میکرو stm32f103vet6

کد به زبان سی در ide کیل نوشته شده و از توابع هال و کیوب استفاده شده است.

در کد بالا بایت به بایت عکس bmp از روی sd کارت خوانده می شود و روی lcd نمایش داده می شود(سرعت بالاتر نیز میتوان داشت)

BMP PICTURE

تصاویر خودتان را با نرم افزار PAINT به صورت فرمت BMP 24BIT ذخیره کنید، ترجیحا 60 در 60 پیکسل باشد.

فرمت BMP یا بیتمپ یک نوع فایل تصویری است که در آن عمل کد کردن صورت نگرفته و به راحتی می توان رنگ هر پیکسل دست پیدا کرد. در صورتی که تصویر بیتمپ به صورت فرمت 24بیتی ذخیره شود، تا بایت 54 ام هدر تصویر است که یک سری توضیحات در مورد فایل قرار دارد. از بایت 54 ام به بعد بایت های رنگ هر پیکسل قرار دارد. به این صورت که هر سه بایت پشت سر هم رنگ یک پیکسل را تشکیل می دهد. برای نمونه بایت 55 ام رنگ آبی ، بایت 56 رنگ سبز و بایت 57 ام رنگ قرمز را مشخص می کند تا ترکیب رنگ RGB برای نمایش یک پیکسل درست شود.

در LCD N96 فرمت رنگ بندی به صورت 16بیتی است یعنی رنگ قرمز 5بیت ، رنگ سبز 6بیت و رنگ آبی 5بیت را در بر میگرد. بنابراین برای نمایش تصویر بیتمپ باید آن را از فرمت رنگ 24بتی به صورت 16بیتی در آوریم. بدین منظور باید رنگ قرمز را از رنج 0 تا 255(8بیتی) به رنج 0 تا 31 (5بیتی) ، رنگ سبز را از رنج 0 تا 255(8بیتی)به رنج 0 تا 63 (6بیتی) و رنگ آبی را از رنج 0 تا 255 به رنج 0تا31 بیت ببریم. که با یک عمل تناسب ساده این کار صورت میگیرد.

تابعی مناسب برای این کار نوشتم

uint16_t color565(uint8_t r, uint8_t g, uint8_t b)
{
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}

SD CARD SDIO

پین اوت SD کارت به صورت شکل زیر است:

و نحوه اتصال SD کارت به میکروکنترلر STM32 در مد SDIO به صورت زیر است:

http://aimagin.com/blog/wp-content/uploads/2015/02/7.png

 

نمایش عکس از روی sd card با واحد sdio روی lcd ili9486 توسط میکرو stm32f103vet6

رزولوشن LCD ILI9486  بسیار بالا و 320 در 480 پیکسل است با سایز 3.5  اینچ که کیفیت بالایی دارد.

برنامه به زبان سی در IDE KEIL نوشته شده است و از توابع HAL و CUBE MX استفاده شده است.

 

راه اندازی تاچ و “4.3 lcd SSD1963  توسط میکرو stm32f407

در این بخش از LCD 4.3 اینچ با IC درایور SSD1963 استفاده شده است.

جهت راه اندازی TOUCH از IC درایور تاچ XPT2046  استفاده شده است.

برای راه اندازی راحت تر از برد کاتالیست ECA  استفاده شده که اصلا پیشنهاد نمیکنم و بهتره خودتون برد بزنید برای خودتون.

LCD با واحد FSMC میکرو راه اندازی شده که سرعت خوبی در نمایش دستورات اعمالی دارد و همچنین عکسی را از روی حافظه فلش میکرو روی LCD نمایش خواهیم داد.

در ویدئو زیر راه اندازی lcd را مشاهده میکنید

برنامه با کیل و کیوب و توابع هال نوشته شده است که در انتها سورس کد کامل را جهت دانلود قرار خواهم داد

نکته:برای پروگرام کردن این میکرو پورت جی تگ روی برد قرار داده شده است که با جی لینک میتوانید برد را پروگرام کنید

اما اگر جی لینک ندارید با استفاده از دو پین میتوانید با St-link برد را پروگرام کنید، برای این کار میتوانید از شماتیک زیر استفاده کنید:

 

mehdi sehati

در این سایت پروژه و آموزش های انواع ماژول ها و میکروکنترلر ها و نحوه ارتباط سخت افزار با نرم افزار (برنامه نویسی اندروید برای گوشی و برنامه نویسی سی شارپ برای کامپیوتر) و برنامه نویسی پایتون و رسبری پای و ماژول های وای فای قرار میگیرد همچنین دوستان برای توضیحات بیشتر و سفارش پروژه میتوانند به آی دی تلگرام بنده مراجعه کنند

مطالب مرتبط

دیدگاه بگذارید

avatar
فارسی سازی پوسته توسط: همیار وردپرس