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

0
138
آموزش 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، بدون داشتن دانش عمیق و پیش‌زمینه در مورد میکروکنترلر مورداستفاده، می‌توان به‌راحتی دستگاه‌های جانبی موجود در آن را تنظیم و کنترل کرد.
  • درایورهای 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

 

 

منبع:سیسوگ

مطلب قبلیکار با ایسی های حافظه (spi flash) در STM32 با littleFS (بخش اول)
مطلب بعدیمنطق فازی و کاربردهای کنترلرهای منطق فازی

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید