آموزش میکروکنترلر STM32F4 – قسمت نهم ;
در قسمت هشتم آموزش میکروکنترلر STM32F4 به مبحث بارگذار بوت کاربر پرداختیم. در این قسمت از آموزش میکروکنترلر STM32F4 به کتابخانه HAL میپردازیم. با سیسوگ همراه باشید.
کتابخانه لایه جداسازی سخت افزار (Hardware Abstraction Layer) که به اختصار HAL نامیده میشود، مجموعهای از API ها هستند که برای استفاده در برنامه کاربر طراحی شدهاند. این کتابخانه، از مجموعه ای از راه اندازها تشکیل شده است که هر یک برای یک وسیله جانبی در میکروکنترلر به کار میرود. گاهی به شکل مستقیم با خود سختافزار جانبی کار میکند و گاهی در لایهای بالاتر برای کنترل وسایل جانبی در حالت عملیاتی استفاده میشوند. برای مثال راهاندازهای مختلفی مانند UART، USART و راهانداز کارت هوشمند، راه انداز قسمت IRDA در این کتابخانه وجود دارد. پیش از ارائه این کتابخانه، کتابخانه دیگری به نام کتابخانه وسایل جانبی استاندارد (Standard peripheral library) توسط شرکت ST ارائه شده بود که دیگر به روز نمیشود. بنابراین بهتر است از کتابخانه جدید در پروژه های جدید استفاده شود.
ویژگی های اصلی HAL اینهاست:
راه اندازهای HAL دارای فایلهای زیر است. این فایلها معمولاًً شامل یک فایل c هستند که کدهای اصلی را شامل میشود و یک فایل هدر (فایل.h) که شامل دادههای مشترک و Catch و ساختمانهای شمارشی و تعریف ها و ماکروها و … است.
کاربر باید دست کم فایلهای زیر را در یک پروژه استفاده کند:
در زیر فایل یک پروژه نمونه ارائه شده توسط شرکت Kail دیده میشود که شامل فایلهای گفته شده در بالاست.
در HAL از ساختمانهای زبان سی برای انتقال پارامترهای مختلف و عملیات مختلف برای آغازسازی وسایل جانبی انجام میشود. ساختمانهای به دستگیری وسایل جانبی به شکل زیر تعریف میشوند:
1 | PPP_HandleTypeDef *handle |
این ساختمان تنظیم وسیله جانبی و رجیسترهای آن و همه متغیرهای مورد نیاز آن را به عهده دارد. به کمک این روش میتوان نمونه سازیهای مختلفی از وسایل جانبی انجام داد و هر نمونه را با به دست گیرنده خاص خود کنترل کرد. برای ارتباط بین وسایل جانبی نیز این ساختمانها کمک میکنند. یک نمونه ساختمان وسایل جانبی در زیر دیده میشود:
نکات:
وقتی یک وسیله جانبی چند فرایند همزمان را با استفاده از DMA کنترل میکند به دست گیرنده رابط DMA برای هر فرایند باید به PPP_HandleTypeDef اضافه شود.
برای وسایل جانبی مشترک و یا سیستم نیازی به اشارهگر نیست. این وسایل جانبی شامل اینهاست:
این ساختمانها در فایل هدر، عمومی تعریف شده مگر اینکه مختص به شماره قطعه خاصی باشند، در این صورت در فایل هدر گسترش یافته تعریف شدهاند. برای مثال در زیر ساختمان مربوط به وسیله جانبیِ ارتباط سریال دیده میشود.
این توابع دو دسته دارند:
کتابخانه HAL همه ی وسایل جانبی را پشتیبانی نمیکند. اگرچه تعداد چنین وسایلی زیاد نیست اما میتوان با مراجعه به بخش Devices supported by HAL drivers در فایل توضیحات HAL برای شماره قطعه های مختلف این محدودیت ها را دید.
این قاعدهها برای نام گذاری تابع های HAL استفاده شده است تا در فهمیدن کارکرد آنها کمک کند.
پیشوند PPP به حالت عملکردی وسیله جانبی اشاره دارد و نه به خود آن. برای مثال در وسیله جانبی USART ، PPP میتواند USART، IRDA، و یا SMARTCARD باشد که وابسته به حالت مورد استفاده است. ثابتهایی که در یک فایل استفاده شدهاند در همان فایل تعریف شدهاند. ثابتهایی که در چند فایل استفاده شدهاند در فایل هدر تعریف میشوند. همه ثابتها به حروف بزرگ تعریف شدهاند مگر در پارامترهای تابع وسیله جانبی. نام متغیرهای تعریف نوع (typedef) با عبارت __TypeDef پسوند میشود. رجیسترها مانند مقدارهای ثابت در نظر گرفته میشوند و در بیشتر موارد با حروف بزرگ نوشته میشوند.
رجیسترهای وسایل جانبی در ساختمان PPP_TypeDef (مانند ADC_TypeDef) در فایل هدر Stm32f4xxx.h تعریف شده است. نام تابعهای وسایل جانبی با HAL_ پیشوند شده است و سپس نام کوتاه وسیله جانبی با حروف بزرگ و در انتها نام کارکرد تابع آمده است. (برای مثال ()HAL_UART_Transmit) ساختمان شامل پارامترهای آغازسازی وسیله جانبی PPP به شکل PPP_InitTypeDef نام گذاری شده است. برای مثال ADC_InitTypeDef. ساختمانهای شامل پارامترهای خاص تنظیمات وسیله جانبی نیز به شکل PPP_xxxxConfTypeDef نام گذاری شدهاند. برای مثال ADC_ChannelConfTypeDef. ساختمانهای اشارهگر وسایل جانبی به شکل PPP_HandleTypedef نام گذاری میشوند. برای مثال DMA_HandleTypeDef. تابع آغازسازی وسیله جانبی نیز به شکل HAL_PPP_Init میباشد و برای بازنشانی رجیستر های وسیله جانبی به مقدار پیش فرض، از تابع PPP_DeInit استفاده میشود.
پسوند MODE به حالت فرایند که میتواند سرکشی، وقفه و یا DMA باشد اشاره دارد. برای مثال وقتی علاوه بر منابع عادی، DMA استفاده شود تابع به این شکل فراخوانی میشود ()HAL_PPP_Function_DMA. پیشوند Feature به مشخصه جدید اشاره دارد. برای مثال ()HAL_ADC_InjectionSTart که به حالت تزریق اشاره دارد.
برای وسایل جانبی عمومی یا سیستم از اشارهگر یا اشیا نمونه استفاده نمیشود. این قانون شامل این وسایل جانبی است.
برای مثال تابع ()HAL_GPIO_Init تنها به آدرس GPIO و تنظیمات آن نیاز دارد.
1 | HAL_STatuSTypeDef HAL_GPIO_Init (GPIO_TypeDef* GPIOx, GPIO_InitTypeDef *Init)}/*GPIO Initialization body */} |
تعدادی ماکرو برای اداره وقفهها و ساعتها به کار می رود جدول این ماکروها به شکل زیر دیده میشود.
نکات
1 2 3 4 5 | HAL_PPP_Init(PPP_HandleTypeDef) if(hppp == NULL) } return HAL_ERROR; } |
1 | #define ABS(x) (((x) > 0) ? (x) : -(x)) |
1 | #define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD_, __DMA_HANDLE_) \do{ \(__HANDLE__)->__PPP_DMA_FIELD_ = &(__DMA_HANDLE_); \(__DMA_HANDLE_).Parent = (__HANDLE__); \}while(0) |
علاوه بر تابع های API، راه اندازهای وسایل جانبی HAL، شامل دستگیرنده وقفههای وسایل جانبی ()HAL_PPP_IRQHandler است که باید از stm32f4xx_it.c فراخوانی شود. هم چنین در کتابخانه HAL تابع های CALLBACK کاربر قرار دارد.
در قسمت دهم آموزش میکروکنترلر STM32F4 به سیستم عامل زمان واقعی (RTOS) و مبحث Thread خواهیم پرداخت. با سیسوگ همراه باشید.
خیلی خیلی عالی بود احسنت . در مورد این چیزا (ساختار توابع HAL و کامپایلر کیل) هیچ جا مطلب فارسی نیست و خیلی دنبالش بودم . همه جا در مورد برنامه نویسی هستش و این چیزا برام گنگ بود و نمی دونستم به چه دردی می خوره و چیه و از کدوماش باید استفاده کرد .
🙂
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.