ARM, آموزش, توصیه شده

کار با f1c100s بدون سیستم عامل (BareMetal) – قسمت اول

همان‌طور که اطلاع دارید قیمت میکروکنترلرهایی مثل stm32 که توانایی اجرای یک گرافیک مناسب رودارند مدت نسبتاً زیادی هست که افزایش پیداکرده و بعضاً نایاب شده، یک روش دیگر هم برای اجرای گرافیک استفاده از تراشه‌هایی مثل ft800 بوده که آن ها هم متاسفانه با مشکل افزایش قیمت و نایاب شدن مواجه شده. اما توی این آموزش می‌خواهیم در مورد یک تراشه باقیمت خیلی مناسب و امکانات کافی برای جایگزینی صحبت کنیم، البته قبلاً هم در سیسوگ در مورد تراشه f1c100s صحبت کرده بودیم و حتی یک برد اوپن سورس هم برای اون معرفی کرده بودیم اما آموزش‌های قبلی بر پایه سیستم‌عامل لینوکس بود و این بار طی چند قسمت می‌خواهیم اجرای گرافیک بدون سیستم‌عامل (baremetal) رو آموزش بدیم، پس با سیسوگ همراه باشید.

 

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

اول از همه ما نیاز به یک کتابخانه داریم که بخش‌های مختلف چیپ f1c100s رو راه‌اندازی کرده باشه، این کتابخانه اینجا در گیت هاب در دسترس هست.

کتابخانه شامل این بخش‌ها هست:

  • _arm926_: هدر فایل‌های لازم برای پردازنده
  • _drivers_: درایورهای بخش‌های مختلف سخت‌افزار
  • _lib_: کتابخانه‌های لازم
  • _tools_: ابزارهای موردنیاز

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

  • hello_led: ساده‌ترین نمونه کد برای راه‌اندازی حداقلی (همون blink خودمون)
  • lcd_test: رسم متن و شکل روی lcd
  • lvgl_demo: راه‌اندازی کتابخانه گرافیکی lvgl
  • tv_out_test: راه‌اندازی بخش خروجی تصویر چیپ (مثل lcd و خروجی pal)
  • tv_in_test: راه‌اندازی ورودی تصویر pal و نمایش تصویر دریافتی روی lcd
  • sd_card_test: خواندن تصویر از روی sd و نمایش روی lcd
  • simple_loader: بوت لودر برای اجرای کد از روی spi flash

 

بررسی کد blink

ما برای اینکه تازه‌کاریم از hello led شروع می‌کنیم. در ادامه کد فایل main.c این پروژه رو می‌تونید بررسی کنید:

هدر system.h کد system.c را فراخوانی می‌کند که وظیفه راه‌اندازی بخش‌های اصلی سخت‌افزاری را  ازجمله واحد کلاک cpu، mmu، راه‌اندازی uart، کلاک نرم‌افزاری، تأخیر و…  را بر عهده دارد.

هدرهایی که با f1c100 شروع می‌شوند همگی شامل راه‌اندازی توابع سطح پایین (low level) سخت‌افزاری نظیر تایمر، وقفه، gpio، pwm و…  هستند.

به دلیل اینکه ما برای تست از برد sinux f1 استفاده می‌کنیم و این برد یک led روی پین E5 داره، پین‌های A1 رو به E5 تغییر دادیم و در ادامه داخل یک حلقه نامتناهی با دستور gpio_pin_set(GPIOE, 5) پایه شماره پنج از پورت f1c100، E رو به‌عنوان خروجی و مقدار ولتاژ یک دیجیتال تعریف می‌کنیم. دستور gpio_pin_clear(GPIOE, 5) همان پایه پورت را به‌عنوان خروجی و با مقدار دیجیتال صفر تعریف می‌کند. که درنهایت ما یک led چشمک‌زن با تأخیر 200 میلی‌ثانیه داریم.

چون ما خیلی سطح پایین کار می‌کنیم تابع آماده‌ای برای تأخیر نداریم و خودمان باید delay رو بسازیم، برای این کار یک تایمر 1 میلی‌ثانیه راه‌اندازی میشه:

و در وقفه تایمر هر بار متغیر tick_flag رو برابر 1 می‌کنیم:

بعد از اون توی تابع delay در یک حلقه دیگه منتظر ۱ شدن tick_flag می‌مونیم و بعد از اون بلافاصله صفرش می‌کنیم و به این صورت یک تابع delay داریم:

 

کامپایل کد

داخل توضیحات کتابخانه ابزار لازم برای کامپایل کد در سیستم‌عامل ویندوز و نرم‌افزار eclipse رو گفته، اما ما کدمون رو توی لینوکس می‌خواهیم کامپایل کنیم و از ubuntu استفاده می‌کنیم، بدون ide. ابتدا لازم هست کامپایلر gcc مناسب arm و برنامه make رو نصب کنید:

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

با اجرای دستورات بالا به صورت خودکار یک پوشه به نام build درست شده که در آن تمام فایل های لینک شده و فایل نهایی hello_led.bin موجود است.

 

اجرای کد

ما می‌تونیم برناممون رو از روی sd card و یا spi flash اجرا کنیم که البته در هر دو حالت نیاز به بوت لودر داریم، هرچند درنهایت بهتره که کدتون از روی spi flash اجرا بشه، اما با استفاده از sd card می‌تونید چند برنامه داشته باشید که هر کدوم رو خواستید توسط بوت لودر اجرا کنید. در ادامه هر دو روش رو توضیح دادیم.

 

اجرای کد از روی sd card

برای این روش لازم هست شما یک ایمیج که uboot داره رو روی sdcard داشته باشید، می‌تونید از این ایمیجی که آماده کردیم استفاده کنید و روی sd رایت کنید، بعد از اون هم فایل خروجی hello_led.bin رو که در پوشه F1C100s_projects/hello_led/buildهست داخل تنها پارتیشن sd کپی می‌کنیم.

حالا باید sd رو داخل برد sinux f1 یا لیچی پای نانو قرار بدیم و پین‌های سریال رو توسط مبدل سریال به سیستم متصل کنیم. بااتصال تغذیه باید چنین خروجی داشته باشید

خب حالا  وارد uboot شدیم  و با این دستورات می‌تونید برنامه رو اجرا کنید :

دستور اول فایلمون رو از پارتیشن دوم کارت حافظه به آدرس 80000000 رم انتقال میده و دستور بعدی باعث میشه تا cpu به این آدرس در رم پرش کنه و از اونجا ادامه بده.

در ادامه میتونید خروجی سریال و وضعیت led رو ببینید:

sinux f1 blink

 

اجرای کد از روی spi nor flash

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

انجام این کار در ویندوز قبلاً در سیسوگ توضیح داده‌شده، برای استفاده در لینوکس ابتدا باید یکسری پکیج رو نصب کنیم:

حالا سورس کد ابزار sunxi-tools رو دانلود، کامپایل و نصب می‌کنیم:

برای اینکه در زمان انتقال فایل به برد با مشکل دسترسی مواجه نشیم لازمه که یک فایل با محتویات زیر در این آدرس ایجاد کنیم/etc/udev/rules.d/99-allwinnerdl.rules

مرحله بعدی بررسی روال بوت هست، همان طور که در تصویر پایین مشاهده می‌کنید اول cpu تلاش میکنه تا از روی sd card بوت بشه، اگر نتونست از روی spi flash و اگه نشد در آخر usb boot.

F1C100S linux bootما برای اینکه به مرحله آخر برسیم، می‌تونیم sd card رو دربیاریم، اما نیاز هست که spi flash رو هم رد کنیم، برای این کار در برد sinux f1 می‌تونید دکمه boot رو نگه‌دارید تا از spi flash لود نشه، اما برای برد licheepi nano باید یکم لحیم‌کاری کنید روی برد! (اینجا دقیق‌تر توضیح داده‌شده).

حالا باید برنامه simpleloader رو کامپایل کنیم:

قبل از استفاده از simpleloader باید با استفاده از mksunxi هدر eGON.BT0 رو در این فایل اصلاح کنیم:

درنهایت هم باید با ابزار sunxi-fel که بالاتر نصب کردیم اول لودر و بعدش هم برناممون رو روی spiflash به ترتیب در آدرس‌های 0x00000 و 0x10000 بریزیم:

در قسمت بعد به سراغ اجرای LVGL به کمک این کتابخونه می‌رویم.

لینک های دانلود:

 

sisoog sinux f1 board buy

 

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

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

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

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

28 دیدگاه در “کار با f1c100s بدون سیستم عامل (BareMetal) – قسمت اول

  1. بهزاد عبد با فتوت گفت:

    سلام و تشکر دوباره بخاطر مطلب بسیار مفید و ارزشمندی که منتشر فرمودید.
    یک خواهشی داشتم اگر ممکن باشه.
    لطفا SDK کامل این پردازشگر رو که شامل هدر فایل های audio_decoder.h هم هست
    فراهم بفرمایید.
    چون بنده خیلی سعی کردم . متاسفانه نتونستم جایی پیدا کنم حتی خود تولید کننده هم دسترسی نمیده.
    اگر به روشی توانستید از طریقی دسترسی پیدا کنید لطفا برای ما هم به اشتراک بگذارید
    سپاس سپاس سپاس.

    1. Mahdi.h   گفت:

      سلام
      sdk های متفاوتی توسط افراد مختلفی برای این پردازنده توسعه داده شده و معمولا توی هر کدوم یه چیزایی هست و یه چیزایی نیست ، باید همه رو دقیق بررسی کنید برای چیزی که میخواید ، در مورد فایلی که نیاز دارید ما اطلاعاتی نداریم.

  2. بهزاد عبدی گفت:

    اقا سلام تشکر تشکر..
    ممکنه خواهش کنم براب فلش کردن لینوکس هم مطلب بزارید من
    لینوکس رو کامپایل کردم مخصوص این چیپ و از روی مموری میخونمش اگر بتونم از فلش داریو خود برد اجراش کنم عالی میشه. خیلی خیلی ممنون.

    1. Mahdi.h   گفت:

      برای بحث لینوکس کار یکم پیچیده تر از این حرفا هست ، چون لازمه هم توی بوت لودر ، هم کرنل و هم سیستم فایل تغییراتی اعمال بشه تا بتونیم از روی فلش بوتش کنیم
      میتونید سوالتون رو دقیقتر و با توضیح اینکه از چه روشی برای ساخت ایمیج لینوکسی استفاده میکنید توی انجمن سیسوگ بپرسید تا همکاران در صورت امکان جوابتون رو بدند
      ask.sisoog.com

  3. محسن گفت:

    سلام خدا قوت

    ببخشید من فایل u-boot شما رو که روی sd card میریزم٬ لینوکس پارتیشنی بعدش روی اون تشخیص نمیده که من بتونم فایل bin رو بهش کپی کنم!

    1. Mahdi.h   گفت:

      سلام
      یه پارتیشن 8.3 مگابایتی میسازه که روی اون میتونید فایلو کپی کنید
      اگر این پارتیشن رو نشون نمیده یه جای کار رو اشتباه رفتید
      الان هم تست کردم فایل مشکلی نداره

      1. ایمان گفت:

        سلام
        من هم همین مشکل را دارم
        از طریق ویندوز فایل ایمیج را روی اس دی کارت میریزم (با نرم افزار RUFUS یا Win32Disk imager)
        بعد که عملیات رایت انجام شد، ویندوز دیگه SD کارت را باز نمیکنه و اگه روی درایو SD کلیک کنی میخواد فرمتش کنه
        چطور از طریق ویندوز فایل باینری را بعد از رایت کردن فایل بوت کپی کنم؟

        1. Mahdi.h   گفت:

          خب این که کاملا درست هست.
          چون فرمت پارتیشنی که روی sd ریخته میشه اصلا توسط ویندوز قابل شناسایی نیست و شما فقط توی لینوکس میتونید اون رو باز کنید
          چراکه ویندوز سیستم فایل های لینوکسی رو نمیتونه بخونه

  4. حسین گفت:

    با درود.
    سپاس بابت مطلب خوبتون.
    من مدتی هست درگیر راه اندازی freeRtos با درایورهای این کتابخانه روی f1c100 هستم ولی هنوز موفق نشدم .
    یک پورت مناسب از FreeRtos رو برای این چیپ سراغ دارید؟

    1. Mahdi.h   گفت:

      سلام
      میتونید از
      https://github.com/RT-Thread/rt-thread
      یا
      https://github.com/xboot/xboot
      استفاده کنید
      من پورتی برای کتابخانه FreeRtos برای این چیپ ندیدم

  5. Sora Emad گفت:

    سلام.
    اول خیلی ممنون بابت آموزش عالیتون…
    دوم اینکه… راهی نیست که هر دفه به وجود کامپیوتر برای شروع برنامه‌ی کامپایل شده نیازی نباشه؟ (هنوز spiflash رو امتحان نکردم البته)

    1. Mahdi.h   گفت:

      spiflash رو که تست کنید همین کار رو انجام میده 🙂

  6. مهدی گفت:

    سلام عالی بود خیلی زحمت کشیدید فقط من قبلا در گیت هاب بخصوص دیده بودم از کامپایلر keil برای این ای سی استفاده کرده بودن فکر میکنم شما هم همینکار را بکنید آموزشهاتون کاربردی تر بشه

    1. mohmahdi kolahi گفت:

      سلام خیلی ممنون.
      من به شخصه این در این رابطه اطلاعی نداشتم ولی حتما نگاه میکنم و نظرم را عرض میکنم در هر صورت خیلی ممنون بابت اطلاعاتتون.

  7. سعید گفت:

    سلام مهندس عزیز- ممنون از آموزش عالی شما . سوال اول اینکه در روش بدون ide و MAKE فایل چطور میتونید با ویندوز BIN رو ایجاد کنیم ؟ (بدون IDE) آیا نرم افزار و یا ابزار خاصی داره ؟ ویندوز 8.1
    و اینکه چطور میتونم برای مطرح کردن چند سوال تخصصی با شما ارتباط بگیرم ؟ تلگرام ، واتس اپ و یا حتی ایمیل

    1. mohmahdi kolahi گفت:

      سلام تشکر از باز خوردتون
      فایل make دارای مشخصات کامپایلر لینکر خروجی فایل کامپایلی (.bin) و… است. برای کامپایل و اجرای پروژه حتما باید کامپایلر در جایی مشخص شده بشه (که در اینجا در حقیقت کراس کامپایلر) اگر از ide استفاده میشود حتما در ان مشخص شده. اما روش دیگر ایجاد فایل make است یا اجرای عملیات های داخل make به صورت کامندی که اصلا توصیه نمیشه

  8. سپهبد گفت:

    سلام و عرض ادب
    اولا تشکر بابت سایت خیلی خوب تون
    به شخصه هر قطعه الکترونیکی بخوام خرید کنم، حتما تو سایت شما جستجو می کنم
    مورد دومی که همیشه ازش بهره برم آموزش های خیلی خوب تون هست که تو سایت منتشر می کنید. از این بابت هم به شخصه خیلی بهره بردم. از جمله همین آموزش که خیلی کاربردی و مفید بود برای من.
    مشتاقانه منتظر ادامه این آموزش هستم. ممنون از آقای محمد کلاهی، نویسنده این متن
    خیلی عالیه سایت تون ?

    1. mohmahdi kolahi گفت:

      سلام و وقت بخیر
      ممنون بابت بازخوردتون
      تاچند روز دیگر انشالله قسمت بعدی آموزش در اختیارتان قرار میگیرد

  9. محسن گفت:

    ایا با کورتکس سری A چیپی هست مثل این که خروجی تصویر LCD و انالوگ و ورودی تصویر انالوگ و دیجیتال داشته باشد؟ با فرکانس بالاتر که بشود bare metal راه اندازی کرد؟

    1. mohmahdi kolahi گفت:

      شرکت allwinner ، خیلی از soc های داخل بازار جهانی را تولید میکند.اگر به ویکی خود allwinner مراجعه کنید انواع ان را میبینید.
      من به شخصه چیزی کامل تر و بهتر از لینکی که برای f1c100 پیدا کردم پیدا نکردم ولی برای فرکانس بالاتر و قابلیت هایی که گفتید برای پردازنده h3 این لینک را پیدا کردم ولی https://github.com/mprymek/allwinner-baremetal ولی انرا تست نکردم

  10. حسین مرادی گفت:

    خیلی عالی و مفید بود

    1. mohmahdi kolahi گفت:

      ممنونم امیدوارم مفید واقع شده باشه

  11. kave.rafiee گفت:

    عالی عالی عالی خداقوت

    1. mohmahdi kolahi گفت:

      تشکر باعث قوت قلب هستید

  12. علی محمدی گفت:

    بسیار عالی بود

    1. mohmahdi kolahi گفت:

      خیلی ممنون

  13. MEYTICOM گفت:

    مهندس دمت گرم ، لذت بردیم

    1. mohmahdi kolahi گفت:

      خوشحالم که مورد پسند بود ?

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

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