پروژه راه اندازی TFT LCD درایور دار سری ili توسط STM32
با سلام خدمت همه دوستان
در این مطلب قصد دارم اموزشی جامع از راه اندازی انواع lcd tft ها با انواع stm32 هارو خدمتتون عرض کنم.
در ابتدا یک دید کلی بهتون بدم که ما دو نوع lcd داریم:
۱-lcd tft ها با درایور داخلی (ای سی های درایور lcd مثل ili9325 , ili9341,ILI9486 ,ST7789V ,HX8352B , SSD1963 و …)
این مدل از lcd ها با درایور داخلی(گاها درایور داخل lcd است و در ظاهر ای سی آن دیده نمی شود)با هر میکرویی میتوان انها را راه اندازی کرد توسط gpio که دارای ۱۶خط دیتا(یا ۸ خط دیتا) و چند پایه کنترلی هستند.اما اگر سرعت بیشتری از lcd بخواین هنگام ریفرش و … میتوانید lcd را توسط واحد fsmc میکرو stm 32 نیز راه اندازی کنید.
۲-lcd tft های بدون درایور داخلی و خام که این lcd عموما سایزشون بزرگتر و گرون تر و با کابل fpc موجود هستند و برای راه اندازی انها از میکروهایی باید استفاده کنید که واحد کنترلر lcd داشته باشن مثل میکرو lpc1788 و stm32f429 که دارای واحد ltdc هستش.
به صورت کلی:
در میکرو های کمتر از ۱۰۰ پایه باید با GPIO این TFT رو راه بندازین.
در میکرو های ۱۰۰ پایه تا ۱۴۴ پایه با واحد کنترلر رم خارجی (FSMC) راه بندازین(ال سی دی به جای واحد sram به میکرو وصل میشه).
و در میکرو های بالای ۱۴۴ پایه یا بعضی از ۱۴۴ پایه با واحد LTDC و tft های بالای ۴٫۳ اینچ تا ۱۰٫۱ اینچ راه بندازین.
کلمه 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 که به صورت پین هدر روی برد قرار دارد (میتونید ازش سیم بگیرید به صورت شکل زیر و حتما جامپر اون (جامپر بوت ۲) رو هم بردارید. )
به صورت شکل زیر:
ال سی دی مورد استفاده ما هدر برد 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 برای ذخیره یک عکس ۳۲۰ در ۲۴۰ کافی نیست برای همین در ویدئو بالا ما یک عکس با سایز کوچکتر نمایش دادیم (در ادامه عکس را از sd کارت میخوانیم تا مشکل حافظه نداشته باشیم) و کندی سرعت آن چندان احساس نمی شود،در زیر ما از یک میکرو stm32f103vet6 استفاده میکنیم که حافظه فلش ان ۵۱۲ کیلو بایت است و یک عکس ۳۲۰ در ۲۴۰ با فرمت bmp تقریبا ۲۵۰ کیلو بایت آن را اشغال میکند،ابتدا عکس را واحد gpio از روی فلش میکرو خوانده و روی lcd نمایش می دهیم تا سرعت ریفرش را ببینید:
راه اندازی lcd n96 ili9325 توسط GPIO میکرو stm32f103vet6 و توابع هال در cubeMx و keil:
کد با توابع هال cube mx و کامپایلر keil نوشته شده است.
کدش رو در پایین پست جهت دریافت قرار میدم.
راه اندازی lcd n96 ili9325 توسط واحد fsmc میکرو stm32f103cvet6 و توابع هال در cubeMx و keil:
کد با توابع هال cube mx و کامپایلر keil نوشته شده است.
کدش رو در پایین پست جهت دریافت قرار میدم.
مشاهده میکنید که سرعت ریفرش عکس بسیار بیشتر از حالت gpio شده است و این طبیعیه چون میکرو ۱۶ خط دیتارو همزمان و با حداکثر فرکانس کاری میکرو روی lcd منتقل میکند.
در ادامه lcd سایز بزرگتر با تراکم پیکسلی بیشتر و خواندن بایت به بایت عکس bmp از روی sd کارت را بررسی میکنیم
راه اندازی “lcd tft ili9341 3.2 و رزولوشن ۲۴۰×۳۲۰ با استفاده از میکروی stm32f103vet6
برنامه به زبان سی در IDE KEIL نوشته شده است و از توابع HAL و CUBE MX استفاده شده است.
نمایش عکس از روی sd card با واحد sdio روی lcd ili9325 توسط واحد fsmc میکرو stm32f103vet6
کد به زبان سی در ide کیل نوشته شده و از توابع هال و کیوب استفاده شده است.
در کد بالا بایت به بایت عکس bmp از روی sd کارت خوانده می شود و روی lcd نمایش داده می شود(سرعت بالاتر نیز میتوان داشت)
BMP PICTURE
تصاویر خودتان را با نرم افزار PAINT به صورت فرمت BMP 24BIT ذخیره کنید، ترجیحا ۶۰ در ۶۰ پیکسل باشد.
فرمت BMP یا بیتمپ یک نوع فایل تصویری است که در آن عمل کد کردن صورت نگرفته و به راحتی می توان رنگ هر پیکسل دست پیدا کرد. در صورتی که تصویر بیتمپ به صورت فرمت ۲۴بیتی ذخیره شود، تا بایت ۵۴ ام هدر تصویر است که یک سری توضیحات در مورد فایل قرار دارد. از بایت ۵۴ ام به بعد بایت های رنگ هر پیکسل قرار دارد. به این صورت که هر سه بایت پشت سر هم رنگ یک پیکسل را تشکیل می دهد. برای نمونه بایت ۵۵ ام رنگ آبی ، بایت ۵۶ رنگ سبز و بایت ۵۷ ام رنگ قرمز را مشخص می کند تا ترکیب رنگ RGB برای نمایش یک پیکسل درست شود.
در LCD N96 فرمت رنگ بندی به صورت ۱۶بیتی است یعنی رنگ قرمز ۵بیت ، رنگ سبز ۶بیت و رنگ آبی ۵بیت را در بر میگرد. بنابراین برای نمایش تصویر بیتمپ باید آن را از فرمت رنگ ۲۴بتی به صورت ۱۶بیتی در آوریم. بدین منظور باید رنگ قرمز را از رنج ۰ تا ۲۵۵(۸بیتی) به رنج ۰ تا ۳۱ (۵بیتی) ، رنگ سبز را از رنج ۰ تا ۲۵۵(۸بیتی)به رنج ۰ تا ۶۳ (۶بیتی) و رنگ آبی را از رنج ۰ تا ۲۵۵ به رنج ۰تا۳۱ بیت ببریم. که با یک عمل تناسب ساده این کار صورت میگیرد.
تابعی مناسب برای این کار نوشتم
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 به صورت زیر است:
نمایش عکس از روی sd card با واحد sdio روی lcd ili9486 توسط واحد fsmc میکرو stm32f103vet6
رزولوشن LCD ILI9486 بسیار بالا و ۳۲۰ در ۴۸۰ پیکسل است با سایز ۳٫۵ اینچ که کیفیت بالایی دارد.
برنامه به زبان سی در IDE KEIL نوشته شده است و از توابع HAL و CUBE MX استفاده شده است.
سرعت اجرا و بارگذاری عکس بسیار بهینه شده است.
نمایش عکس از روی sd card با واحد sdio و flash توسط بخش usb host روی lcd ili9486 توسط واحد fsmc میکرو stm32f407VGTx
در این بخش علاوه بر خواندن و نوشتن فایل متنی بر روی SD CARD و FLASH نمایش عکس هم بر روی LCD انجام می شود.
کد توسط توابع هال و کیوب و کیل نوشته نوشته شده است.
بایت به بایت عکس ابتدا از روی SD CARD خوانده می شود و روی LCD نمایش داده می شود و در ادامه کد فلش توسط میکرو مانت می شود و بایت به بایت عکس از روی حافظه فلش USB خوانده می شود و روی LCD نمایش داده می شود.
میکروی سری F407 از قابلیت USB هاست پشتیبانی میکند
نکته : دوستان من علاقه ای به برد های اماده ندارم و یک هدر برد ۱۰۰ پین از ایران میکرو تهیه کردم به همراه انواع میکرو ها و درنهایت روی برد بورد تست ها را گرفته و با شما به اشتراک میگذارم و سپس برد مورد نظر را در التیوم طراحی میکنم.
فیلم عملکرد پروژه در در زیر قرار دارد:
همانطور که در ویدئو بالا میبینید من IC محافظی برای فلش قرار ندادم اما در تولید محصولاتتون بهتره که حتما قرار بدید .چون فلش یک دیوایس خارجی است و توسز هر کاربری میتواند به سیستم شما متصل شود تا اگر اتصالی صورت گرفت این ای سی فلش را از مدار خارج کند،شماتیک ان به صورت زیر است:
در تصویر بالا محل اعداد ۱ و ۲ به پین های مخصوص usb میکرو متصل میشوند. و ic محافظ بالا دو کانالست یعنی دوتا محافظ در یک Ic قرار دارند و وقتی اتصالی رخ بده جریان فلش قطع میشه پین flag برای شما صفر میش که توسط میکرو میتونید بفهمید که جریان کشی رخ داده و با صفر کردن پین enable فلش رو از مدار خارج کنید تا به برد و میکروی شما در اثر اتصال و جریان کشی آسیبی نرسد. و پین pa9 هم اختیاری هستش که توسط میکرو میتونید بفهمید ولتاژ روی باس usb هست یا نه برای مواقعی که دستگاه با باتری کار میکنه به درد میخوره.پیشنهاد میکنم داکیومنت های st برای بخش usb رو مطالعه بفرمایید.
میتونید هم از این ای سی بالا استفاده نکنید و دوتا پین میکرو رو مستقیم به دوتا پین D+ و D- فلش بزنید اما :
- در حالت USB هاست پین D+ با مقاومت ۱٫۵ کیلو به زمین متصل شود.
- در حالت USB دیوایس پین D+ با مقاومت ۱٫۵ کیلو به ۳٫۳ متصل شود.
پین های اتصال LCD به واحد FSMC به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
FSMC ------ LCD TFT---- FSMC_D4 ------> LCD_D4 FSMC_D5 ------> LCD_D5 FSMC_D6 ------> LCD_D6 FSMC_D7 ------> LCD_D7 FSMC_D8 ------> LCD_D8 FSMC_D9 ------> LCD_D9 FSMC_D10 ------> LCD_D10 FSMC_D11 ------> LCD_D11 FSMC_D12 ------> LCD_D12 FSMC_D13 ------> LCD_D13 FSMC_D14 ------> LCD_D14 FSMC_D15 ------> LCD_D15 FSMC_A16 ------> LCD_RS FSMC_D0 ------> LCD_D0 FSMC_D1 ------> LCD_D1 FSMC_D2 ------> LCD_D2 FSMC_D3 ------> LCD_D3 FSMC_NOE ------> LCD_RD FSMC_NWE ------> LCD_RW FSMC_NE1 ------> LCD_CS LCD RESET PIN CONNECT TO MICRO RESET PIN |
این هم پین های واحد SDIO که طبق شماتیکی که در بالا گذاشتم باید SD CARD رو به میکرو متصلش کنید(پول اپ یادتون نره)
PC8 ——> SDIO_D0
PC9 ——> SDIO_D1
PC10 ——> SDIO_D2
PC11 ——> SDIO_D3
PC12 ——> SDIO_CK
PD2 ——> SDIO_CMD
دوستان عزیز به جای توضیحات کامل ویژگی های پروژه کلمات کلیدی ویژگی هر پروژه رو مینویسم:
En:کد ال سی دی زبان انگلیسی پشتیبانی میکند.
Pe:کد دارای فونت فارسی است
fsmc:برای راه اندازی ال سی دی از واحد fsmc میکرو استفاده شده است.
gpio : برای راه اندازی ال سی دی از پین io استفاده شده است.
sdio:واحد اتصال کارت sd راه اندازی شده است و عکس و تصویر از روی مموری روی lcd نمایش داده می شود.
تمامی بخش ها تست شده هستند که ویدویی جهت مقایسه قرار دادم.
جهت تهیه میتوانید اقدام کنید و همچنین سوالی داشتید تلگرام در خدمتم.
سلام لطفا یه شماره تلفن بفرمایید در خصوص نحوه تهیه آموزش ها سوال داشتم
سلام، تلگرام میتونید پیام بدید
Microdroidprj@
سلام خسته نباشین میخاستم ببینم ili9488 هم راه اندازی میکنین؟؟
سلام بله .میتونید تلگرام به من پیام بدین
سلام آیا به همراه فایل های دانلود شده، کتابخانه ها نیز موجود می باشند
سلام آیا به همراه فایل های دانلود شده، کتابخانه ها نیز موجود می باشند
چون که من به کتابخانه ها هم خیلی نیاز دارم و اینکه آیا فایل های پروژه هم موجود می باشند
سلام، بله البته سورس کد کامل پروژه به همراه فایل کتابخونه ها هستش، همچنین سوالی هم داشتین تلگرام میتونید بپرسید.
ممنون
شاید باورتون نشه که من ۱۳ سالم هست و یک کتابخانه ال سی دی کاراکتری به صورت ۸ بیتی با تمام امکانات و بسیار عالی نوشتنم
stm۳۲ با کامپایلر کیل و iar منظورم هست فکر نکنید که آردوینو😌
بسیار عالی موفق باشید و همین روند رو پیش برید همچنین میتونید در تلگرام با من در ارتباط باشید و اگر ساکن تهران بودین تشریف بیارید در شرکت بنده تا همکاری کنیم آایندتون تضمین بشه.
سلام خیلی مفید بود
فقط یک سوال این پروژه رو با lcd رزولیشن پایین تر ولی رنگی میشه با stm32f03xxx یا stm8sxxxx راه انداخت در حد ننایش اشکال گرافیکی مثلا نمایش یک مربع؟؟؟
سلام . بله میشه خصوصا سری ۹۳۴۱ که واحد SPI هم داره و راحت با هر میکرویی میشه راش انداخت
سلام. lcd n96 با درایور ili9325 رو با میکرو ST و واحد SPI هم کار کردین؟ سرعتش خیلی پایین میشه؟
سلام بله ۹۳۴۱ رو هم با spi کار کردم نه سرعتش اصلا کم نیست و راضی کننده هست.
سلام آقای مهندس صحتی. برای پرداخت به درگاه بانک وصل نمیشه و مشکل داره
سلام، احتمالا مشکل موقت هستش، اگر عجله دارید تلگرام پیام بدید اونجا براتون میفرستم