آموزش STM32 با توابع HAL قسمت اول: معرفی توابع HAL

آموزش STM32 با توابع HAL قسمت اول: معرفی توابع HAL

آموزش STM32 با توابع HAL قسمت اول: معرفی توابع HAL
آموزش STM32 با توابع HAL قسمت اول: معرفی توابع HAL

در بخش معرفی آموزش میکروکنترلرهای STM32، با این خانواده از میکروکنترلرها آشنا شدیم و درباره اهمیت یادگیری آن‌ها صحبت کردیم. در این سری آموزش یکی از ابزارهای برنامه نویسی این میکروکنترلرها، یعنی توابع HAL را می‌آموزیم. درباره این کتابخانه در گذشته به صورت مختصر صحبت شد. در این قسمت از سری آموزش STM32 با توابع HAL، می‌خواهیم کمی بیشتر در مورد HAL و مزایا و معایب آن صحبت کنیم. با سیسوگ همراه باشید.

توابع HAL

 

مزایا و معایب توابع HAL

گفتیم که توابع HAL یا Hardware Abstraction Layer در بالاترین سطح ممکن قرار دارند و با استفاده از آن‌ها معمولاً به‌طور مستقیم با رجیسترها سروکار نداریم. با استفاده از این توابع اگرچه حجم کد و زمان کمپایل (نسبت به استفاده از توابع LL) بیشتر می‌شود، اما فرآیند توسعه برنامه با سرعت و سهولت بیشتری صورت می‌گیرد. هر دستور HAL کار چندین دستور LL را برای ما انجام می‌دهد و دیگر نیازی به تنظیم رجیسترها نداریم.

توابع HAL خالی از اشکال نیستند. درواقع در بسیاری از انجمن‌های مربوط به میکروکنترلرها، می‌بینیم که کاربران و به‌خصوص توسعه‌دهندگان قدیمی‌تر، ترجیح می‌دهند با روش‌های قبل برنامه‌نویسی کنند و رجیسترها را مقداردهی کنند. اصلی‌ترین مشکلاتی که به آن‌ها اشاره می‌شود، مشکلات Documentation این درایورهاست که به نسبت راهنمای جامع Standard Peripheral Libraries، گمراه‌کننده و بی‌نظم هستند. حجم کد تولیدشده به این روش به نسبت قابل‌توجهی بیشتر است و در بعضی موارد گزارش‌شده که کدهای تولیدشده به‌وسیله این توابع دارای باگ هستند. مشکل دیگر دشواری و زمان‌بر بودن اطمینان از صحت کامل پیاده‌سازی و اجرای کد موردنظر است. ریشه اکثر این موارد نیز در دور شدن از لایه سخت‌افزار است.

باوجود تمامی مشکلات گفته‌شده، استفاده از HAL مزایای مهمی دارد که به مهم‌ترین آن‌ها (که دلایل توسعه این کتابخانه‌ها نیز هستند) اشاره می‌کنیم. یک مزیت مهم قابلیت انتقال بالای کد نوشته‌شده روی میکروهای مختلف ST است. مورد مهم دیگر این است HAL توسعه‌دهنده را قدر می‌سازد که بیشتر وقت و انرژی را صرف توسعه لایه‌های بالاتر پروژه کند. بنابراین نمی‌توان از اهمیت آشنایی با این کتابخانه‌ها گذشت. می‌توان گفت که توابع HAL و توابع LL مکمل یکدیگر هستند و با استفاده مناسب از آن‌ها می‌توان بسیاری از کاربردها را پوشش داد؛ توابع سطح بالای HAL که پیچیدگی‌های سخت‌افزاری را از دید ما پنهان می‌کنند، در کنار LL که امکان توسعه بهینه برنامه را به ما می‌دهد. اگرچه استفاده از توابع LL برخلاف HAL به آشنایی با سخت‌افزار نیاز دارد.

 

فایل‌های کتابخانه HAL

در هدر فایل عمومی درایورهای HAL (یعنی stm32f1xx_hal.h) تنظیمات کلی مربوط به همه بخش‌های مورداستفاده کتابخانه HAL، گنجانده می‌شود. درواقع Include کردن این هدر فایل، به‌تنهایی به ما این امکان را می‌دهد که در سورس‌های خود از منابع HAL استفاده کنیم. در شکل زیر ارتباط فایل‌های HAL نشان داده‌شده است:

 

چرا از درایورهای HAL استفاده کنیم؟

برای استفاده از درایورهای HAL مزایای زیادی را می‌توان برشمرد:

  • آسان بودن استفاده: با درایورهای HAL، بدون داشتن دانش عمیق و پیش‌زمینه در مورد میکروکنترلر مورداستفاده، می‌توان به‌راحتی دستگاه‌های جانبی موجود در آن را تنظیم و کنترل کرد.
  • درایورهای HAL شامل API هایی است که به‌آسانی قابل‌فهم و استفاده هستند. همچنین از 3 مدل برنامه‌نویسی polling، ‌interrupt و DMA پشتیبانی می‌کنند. بنابراین می‌توانند همه نیازهای پروژه را پوشش داده و کاربر را قادر می‌سازند که با استفاده از تعداد کمی API، اعمال موردنظر را پیاده‌سازی کند.
  • به دلیل سطح بالای انتزاع در HAL، نسبت به SPL (و LL) می‌توان انتقال و پردازش اطلاعات، و همچنین خطاها را به شکل واضحی مدیریت کرد؛ بدین‌صورت که برای انتقال و پردازش داده‌ها دو حالت blocking (روش polling) و non-blocking (interrupt یا DMA) قابل‌استفاده هستند و برای مدیریت خطاها نیز می‌توانیم از مکانیزم timeout و یا خطایابی peripheral استفاده کنیم.
  • ساختار و معماری عمومی HAL باعث سرعت بخشیدن به راه‌اندازی و همچنین انتقال کد می‌شود، که درنتیجه موجب تمرکز بیشتر کاربر بر نوواآوری و یافتن راه‌حل خواهد شد.
  • API های موجود در HAL، feature-oriented هستند. به این معنی که برای استفاده از آن‌ها، نیازی به دانش عمیق از سازوکار سخت‌افزار و دستگاه‌های جانبی نیست.
  • با استفاده از توابعHAL، تعداد توابعی که برای انجام یک عمل باید فراخوانی کنیم، به‌شدت کاهش می‌یابد. به‌عنوان‌مثال، برای ایجاد یک ارتباط UART، تنها کاری که باید انجام دهیم صدازدن تابع HAL_UART_Init() و سپس استفاده از HAL_UART_Transmit() یا HAL_UART_Receive()، برای ارسال و یا دریافت است.

 

چند مثال از توابع HAL

API های ورودی/خروجی

 

توابع Initialization و De-initaialization

این بخش شامل API های زیر می‌شود:

  • ‎‏()HAL_GPIO_Init‎
  • ‏()HAL_GPIO_DeInit‏

 

توابع عملیات ورودی/خروجی

این بخش شامل API های زیر می‌شود:

  • ‏()HAL_GPIO_ReadPin
  • ‏()HAL_GPIO_WritePin‏
  • ‏()HAL_GPIO_TogglePin
  • ‏()HAL_GPIO_LockPin‏
  • ‏()HAL_GPIO_EXTI_IRQHandler‏

 

تشریح تابع HAL_GPIO_Init :

نام تابع:  void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init)

توضیح: راه‌اندازی دستگاه‌جانبی GPIOx با توجه به پارامترهای مشخص شده در GPIO_Init.

پارامترها:

  • GPIOx: که x بسته به مدل میکرو می‌تواند از A تا H باشد، این پارامتر برای انتخاب کردن GPIO مورد نظر است.
  • GPIO_Init: اشاره‌گر به ساختار GPIO_InitTypeDef که حاوی اطلاعات مربوط به تنظیم GPIO مورد نظر است.

 

مقادیر بازگشتی: این تابع مقدار بازگشتی ندارد.

 

نتیجه‌گیری در مورد توابع HAL

توابع HAL

 

با توجه به نکات گفته‌شده، استفاده از درایورهای HAL می‌تواند در بسیاری از شرایط سودمند باشد و زمان توسعه را کاهش دهد. این مورد به‌خصوص راجع به پروژه‌هایی که در دسته آزمایش و خطا هستند صادق است. زیرا بدین طریق در زمان کمی کارایی پروژه یا ضعف‌ها و ایرادات آن مشخص می‌شوند. اگرچه توابع سطح بالا ویژگی‌های اضافه‌ای دارند که ممکن است در برخی از شرایط موردنیاز نباشند، و به‌این‌ترتیب فضای بیشتری از حافظه اشغال می‌شود و کارایی میکرو نیز به دلیل همین ویژگی‌های اضافی کندتر می‌گردد. می‌توان با استفاده از توابع LL استفاده از حافظه و سرعت اجرا را بهینه‌سازی کرد اما در این صورت انتقال برنامه به میکروهای دیگر ساده نخواهد بود (البته می‌توان تنها از آن دسته از توابع LL بهره گرفت که در تمامی میکروها یکسان هستند).

در این سری آموزش می‌خواهیم کار با درایورهای HAL را یاد بگیریم و وسایل جانبی میکروکنترلر را به ویسله‌ی آن‌ها راه‌اندازی کنیم. بعد از راه‌اندازی هر وسیله جانبی پروژه ساده‌ای به کمک آن اجرا می‌کنیم. در قسمت بعد این آموزش نحوه پیکربندی پروژه و محیط برنامه‌نویسی Cube IDE را بررسی می‌کنیم و بعدازآن نیز سراغ اولین پروژه خواهیم رفت. با ما همراه باشید.

   منبع1

   منبع2

برچسب ها

حمایت از سیاوش

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

8 نفر

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

توجه

سیاوش
سیاوش

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

دیدگاه ها

2 دیدگاه

  • عزیز الله عرفانیان
    ۵ مرداد ۱۴۰۱

    با عرض سلام و احترام بی کران
    تبریک بنده را برای اموزشهای خوبی که میگزارید پذیرا باشید
    لطفا بنده را راهنمایی کنید پیوستگی اموزشها را چگونه دنبال کنم
    بدین معنی که بعضی سایت ها اول مطلب لینک مطلب قبلی را دارد و در انتها لینک مطلب بعدی
    بنده تازه شروع به اموزش stm32 کرده ام
    با تشکر ممنون میشوم زود پاسخ عنایت کنید

    • Zeus ‌
      Zeus ‌
      ۶ مرداد ۱۴۰۱

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

پر بحث ترین ها

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

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

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

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

Zeus ‌ Zeus ‌
  • 4 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 2 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 10 ماه پیش

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

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

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 3 سال پیش

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

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

Mahdi.h   Mahdi.h  
  • 3 سال پیش

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

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

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

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