ARM, توصیه شده

کار با f1c100 به صورت baremetal – قسمت دوم (LVGL)

در قسمت قبلی یاد گرفتیم که چطور یک کد ساده blink را به‌صورت بدون سیستم‌عامل (baremetal) بر روی f1c100 اجرا کنیم و دراین‌باره یک کتابخانه بسیار مفید را به شما معرفی کردیم. در این آموزش می‌خواهیم به سراغ راه‌اندازی گرافیک روی f1c100s با lvgl برویم و در این راستا یک نرم‌افزار کاربردی را هم برای طراحی گرافیک به کمک lvgl معرفی کنیم.

 

بررسی کد LVGL

در قسمت قبل گفتیم که کتابخانه F1C100s_projects شامل چه بخش‌هایی می‌باشد. بخش موردنیاز ما در این آموزش lvgl_demo می‌باشد که شامل یک مثال کامل برای راه‌اندازی گرافیک روی lcd است. ما در این بخش به بررسی آن می‌پردازیم.

ابتدا کد main.c را بررسی می‌کنیم:

به هدرها فقط هدر lv_demo_widgets.h اضافه‌شده که گرافیک اصلی آنجا طراحی‌شده است. خود کتابخانه lvgl برای نمایش انیمیشن‌ها و زمان‌بندی داخلی نیاز داره که تابع lv_tick_inc رو هرچند میلی‌ثانیه یک بار صدا بزنیم، برای این کار هم از تایمر استفاده‌شده و در وقفه تایمر این تابع صدا زده میشه. تابع بعدی که عملیات اصلی طراحی گرافیک را اجرا می‌کند تابع lv_demo_widgets می‌باشد که درواقع از هدر lv_demo_widgets.h فراخوانی می‌شود.

 

کامپایل و اجرای کد

کامپایل و اجرای این کد کاملاً مثل کامپایل و اجرای کد blink میمونه که در قسمت قبلی مفصل بررسی کردیم فقط این بار باید حواسمون باشه که به‌جای اسم‌های پروژه blink اسم‌های پروژه lvgl_demo رو وارد کنیم.

این هم یک تصویر از خروجی برنامه روی lcd

 

lvgl baremetal f1c100s

تصویر خروجی برنامه

معرفی نرم افزار برای کتابخانه lvgl

همیشه طراحی خود گرافیک جزو بخش‌های زمان‌بر یک پروژه دارای گرافیک هست. اما به کمک نرم‌افزار طراحی گرافیک این کار با سرعت خیلی بیشتری انجام میشه، خود lvgl نرم‌افزاری برای طراحی گرافیک نداره اما نرم‌افزارهایی هستند که به ما این قابلیت رو ارائه می‌دهند (مثل SquareLine و GUIGuider) ما در اینجا برای راه‌اندازی گرافیک روی f1c100s از نرم‌افزار GUIGUIDER شرکت nxp استفاده می‌کنیم.

ابتدا نسخه لینوکس نرم‌افزار را از این لینک دانلود کرده و با این دستور نصب می‌کنیم:

احتمالاً بعد از نصب نیاز به زدن این دستور هم هست

 

خب بعد از نصب gui guider یک محیط خیلی ساده‌ای برای کاربر باز می‌شود که به این صورت هست:

بعد از انتخاب پروژه جدید و انتخاب ورژن 7 lvgl روی simulator و با مشخص کردن اسم پروژه و سایز lcd پروژه جدیدمون رو درست می‌کنیم. محیط پروژه نرم‌افزار خیلی ساده است و با عملیات درگ و دراپ می‌شود انواع widgets ها رو استفاده کرد.

می‌توانید توی قسمت help و با انتخاب user guide توضیحات مربوط به نحوه طراحی گرافیک رو بخوانید که خیلی مفید هست.

بعد از ساختن گرافیک  با کلیک روی دکمه سبزرنگ بالا کدتون کامپایل و اجرا میشه. توی قسمت code viewer میتونید تبدیل گرافیک به کد C تون رو ببینید و با باز کردن پروژه توی vscode میتونید کد ساخته‌شده رو ادیتش کنید.

پوشه پروژه ما شامل چند فولدر هست که لازمه یک توضیحی در مورد آن‌ها بدهیم:

فولدر ها:

  • generated: شامل screen های ساخته‌شده توسط نرم‌افزار (درون این پوشه نباید به‌صورت دستی چیزی ادیت کنیم، چراکه با کامپایل کد در نرم‌افزار تغییرات ما از بین می‌ره)
  • custom: تمام کدهای خودمون رو باید در این بخش وارد کنیم
  • lvgl-simulator: کدهای شبیه‌ساز
  • lvgl: کتابخانه اصلی lvgl

 

استفاده از نرم افزار برای F1c100s

تا اینجای کار کد برای محیط دسکتاپ ساخته شد که همونطور که گفتیم میتونید با زدن دکمه سبزرنگ شبیه‌سازی کد را اجرا کنید اما برای اجرا و کامپایل کد روی f1c100 باید کد را برای اون کاستوم کنید که برای این کار از این پروژه در گیت هاب من میتونید استفاده کنید که تغییرات لازم رو در اون انجام دادم.

خب با دانلود کردن پروژه و با import فایل bare_metal_v7.guiguider در نرم‌افزار میتونید یک گرافیک ساده را مشاهده کنید که حاوی widgets های مختلفی هست ازجمله, sreen, button و chart در ادامه به بررسی کد f1c100_baremetal_lvgl می‌پردازیم.

 

بررسی کد انیمشن

گفتیم که کد گرافیکی ساخته‌شده به‌وسیله نرم‌افزار gui guider در پوشه generated اعمال می‌شود و اگر ما بخواهیم تغییر در کد انجام بدهیم باید آن را درجایی غیر از پوشه generated انجام بدهیم تا با تغییر و ذخیره تغییرات نرم‌افزار کد اعمالی ما حذف نشود. برای این کار ما تغییراتمان را در custom.c اعمال کردیم. این کد انیمشنی را برای چرخاندن needle یا همان شمارنده عدد gauge طراحی می‌کند:

در تابع custom_init اول یک شی از animation به نام a می‌سازیم سپس آن را init می‌کنیم مقدار آن را به gauge نسبت می‌دهیم بعد تابع صدازدنش را به تابع gauge_anim نسبت می‌دهیم سپس مقدار مینیمم و ماکزیمم آن را بین 0 تا 180 قرار می‌دهیم. در آخر، زمان طی کردن و تکرار انیمیشن را به ترتیب 2.5 و 1 ثانیه قرار می‌دهیم و آن را درنهایت start می‌کنیم.

 

بررسی کد uart و وقفه آن

در این کد سعی شده که با استفاده از وقفه Uart عددی که ما با استفاده از پورت سریال می‌فرستیم را بخواند و نتیجه عدد را روی یک نمایشگر gauge نشان دهد. تغییرات مربوط به یورات در فایل main.c نوشته‌شده و تغییرات مربوط به تکان دادن needle در هنگام ارسال عدد به‌وسیله پورت سریال در کد set_scr_screen.c نوشته‌شده است. که اول کد main رو بررسی می‌کنیم:

تابع muart_init وظیفه راه اندازی اولیه وقفه یوارت را برعهده دارد. تابع uart_irq_handler کار اصلی خواندن پورت سریال و ذخیره ورودی بر روی uart_buffer را انجام میدهد که در نهایت یک رشته کاراکتری به ما ارسال میکند ولی ما برای نشان دادن عدد برروی gauge نیاز به int داریم که با استفاده از دستورات:

تبدیل به int میشود و با استفاده از دستور printf روی پورت سریال نشان داده میشود، تابع dosm(&guider_ui,BufferToInt) که در خط 116 فراخوانی شده در فایل set_scr_screen.c تعریف شده که دو ورودی می‌گیرد:

این تابع عدد ورودی ارسالی را دریافت کرده و به‌جای متغیر buffer در تابع lv_gauge_set_value می‌گذارد که نهایتاً مقدار needle را روی گرافیک مشخص می‌کند.

توجه: نرم‌افزار guiguider تنها قابلیت طراحی گرافیک را دارد و کارهایی از قبیل ساخت انیمیشن باید به‌صورت دستی انجام گردد. دقت کنید که تغییرات نرم‌افزار در فایل‌های setup_scr_screen.c و setup_scr_screen2.c اعمال می‌شود.

بعدازاینکه کدمان را بررسی کردیم نوبت به کامپایل و اجرای آن می‌شود برای این کار باید به پوشه lvgl-simulator رفته و با دستور make فایل makefile که در آن قرار دارد را کامپایل کنیم:

 

نحوه اجرای برنامه روی spi nor flash دقیقاً مانند قسمت قبلی است و باید با دستور sunxi-fel انجام شود:

 

با توجه به اعمالی که تابه اینجا انجام دادیم نحوه راه‌اندازی گرافیک روی f1c100s را فرا گرفتیم، لطفا نظرات و سوالات خود را با ما به اشتراک بگذارید.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

بازگشت به لیست

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *