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

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

کار با f1c100s بدون سیستم عامل (BareMetal)
کار با 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 به کمک این کتابخونه می‌ریم.

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

6 نفر

پــــســنــدیـده انـد

توجه

دیدگاه ها

16 دیدگاه

  • مهدی
    ۲۹ شهریور ۱۴۰۱

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

    • Mohmahdi Kolahi
      mohmahdi kolahi
      ۳۱ شهریور ۱۴۰۱

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

  • سعید
    ۲۸ شهریور ۱۴۰۱

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

    • Mohmahdi Kolahi
      mohmahdi kolahi
      ۳۱ شهریور ۱۴۰۱

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

  • سپهبد
    ۲۵ شهریور ۱۴۰۱

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

    • Mohmahdi Kolahi
      mohmahdi kolahi
      ۲۵ شهریور ۱۴۰۱

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

  • محسن
    ۲۱ شهریور ۱۴۰۱

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

    • Mohmahdi Kolahi
      mohmahdi kolahi
      ۲۵ شهریور ۱۴۰۱

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

  • حسین مرادی
    ۲۱ شهریور ۱۴۰۱

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

    • Mohmahdi Kolahi
      mohmahdi kolahi
      ۲۱ شهریور ۱۴۰۱

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

  • kave.rafiee
    ۲۱ شهریور ۱۴۰۱

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

    • Mohmahdi Kolahi
      mohmahdi kolahi
      ۲۱ شهریور ۱۴۰۱

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

  • علی محمدی
    ۲۰ شهریور ۱۴۰۱

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

  • MEYTICOM
    ۲۰ شهریور ۱۴۰۱

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

    • Mohmahdi Kolahi
      mohmahdi kolahi
      ۲۱ شهریور ۱۴۰۱

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

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه دوم : چالش برنامه نویسی به زبان C

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

Zeus ‌ Zeus ‌
  • 3 سال پیش
راه اندازی LCD گرافیکی Nokia 1661

راه اندازی LCD گرافیکی Nokia 1661

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش
ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش
همه چیز درباره ریموت کنترل‌های هاپینگ

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش
مسابقه سوم: استخراج داده از رشته ها در زبان C

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش
مسابقه ششم: بزن میکروکنترلر را بسوزون!

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 12 ماه پیش
آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش
کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش
ساخت ماینر با FPGA و ARM

ساخت ماینر با FPGA و ARM

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

Zeus ‌ Zeus ‌
  • 3 سال پیش
مسابقه چهارم: کدام حلقه سریع‌تر است؟

مسابقه چهارم: کدام حلقه سریع‌تر است؟

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

Zeus ‌ Zeus ‌
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک