در بخش معرفی آموزش میکروکنترلرهای STM32، با این خانواده از میکروکنترلرها آشنا شدیم و درباره اهمیت یادگیری آنها صحبت کردیم. در این سری آموزش یکی از ابزارهای برنامه نویسی این میکروکنترلرها، یعنی توابع HAL را میآموزیم. درباره این کتابخانه در گذشته به صورت مختصر صحبت شد. در این قسمت از سری آموزش STM32 با توابع 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 میتواند در بسیاری از شرایط سودمند باشد و زمان توسعه را کاهش دهد. این مورد بهخصوص راجع به پروژههایی که در دسته آزمایش و خطا هستند صادق است. زیرا بدین طریق در زمان کمی کارایی پروژه یا ضعفها و ایرادات آن مشخص میشوند. اگرچه توابع سطح بالا ویژگیهای اضافهای دارند که ممکن است در برخی از شرایط موردنیاز نباشند، و بهاینترتیب فضای بیشتری از حافظه اشغال میشود و کارایی میکرو نیز به دلیل همین ویژگیهای اضافی کندتر میگردد. میتوان با استفاده از توابع LL استفاده از حافظه و سرعت اجرا را بهینهسازی کرد اما در این صورت انتقال برنامه به میکروهای دیگر ساده نخواهد بود (البته میتوان تنها از آن دسته از توابع LL بهره گرفت که در تمامی میکروها یکسان هستند).
در این سری آموزش میخواهیم کار با درایورهای HAL را یاد بگیریم و وسایل جانبی میکروکنترلر را به ویسلهی آنها راهاندازی کنیم. بعد از راهاندازی هر وسیله جانبی پروژه سادهای به کمک آن اجرا میکنیم. در قسمت بعد این آموزش نحوه پیکربندی پروژه و محیط برنامهنویسی Cube IDE را بررسی میکنیم و بعدازآن نیز سراغ اولین پروژه خواهیم رفت. با ما همراه باشید.
وسایل جانبی میکروکنترلر را به ویسلهی آنها راهاندازی…
>>وسیله<<
سلام
از آموزش LL که لذت بردیم، فقط آیا میشه از LL و HAL هم زمان در یک پروژه استفاده کرد؟ چطور؟؟
از این لینک هم میشه این آموزش رو دنبال کرد، همه رو یکجا نوشته:
https://sisoog.com/category/%d8%aa%d9%88%d8%a7%d8%a8%d8%b9-hal
با عرض سلام و احترام بی کران
تبریک بنده را برای اموزشهای خوبی که میگزارید پذیرا باشید
لطفا بنده را راهنمایی کنید پیوستگی اموزشها را چگونه دنبال کنم
بدین معنی که بعضی سایت ها اول مطلب لینک مطلب قبلی را دارد و در انتها لینک مطلب بعدی
بنده تازه شروع به اموزش stm32 کرده ام
با تشکر ممنون میشوم زود پاسخ عنایت کنید
سلام و درود بر شما
معمولا در انتهای آموزش ها در صورت وجود قسمت بعدی لینک آن قرار خواهد گرفت و البته در ابتدای ان هم لینک قسمت قبلی
و راه دیگر هم دنبال کردن صفحه آموزش است که تمام قسمت ها درآن منشر خواهد شد.