آموزش میکروکنترلر STM32F4 – قسمت نهم ;
در قسمت هشتم آموزش میکروکنترلر STM32F4 به مبحث بارگذار بوت کاربر پرداختیم. در این قسمت از آموزش میکروکنترلر STM32F4 به کتابخانه HAL میپردازیم. با سیسوگ همراه باشید.
کتابخانه لایه جداسازی سخت افزار (Hardware Abstraction Layer) که به اختصار HAL نامیده میشود، مجموعهای از API ها هستند که برای استفاده در برنامه کاربر طراحی شدهاند. این کتابخانه، از مجموعه ای از راه اندازها تشکیل شده است که هر یک برای یک وسیله جانبی در میکروکنترلر به کار میرود. گاهی به شکل مستقیم با خود سختافزار جانبی کار میکند و گاهی در لایهای بالاتر برای کنترل وسایل جانبی در حالت عملیاتی استفاده میشوند. برای مثال راهاندازهای مختلفی مانند UART، USART و راهانداز کارت هوشمند، راه انداز قسمت IRDA در این کتابخانه وجود دارد. پیش از ارائه این کتابخانه، کتابخانه دیگری به نام کتابخانه وسایل جانبی استاندارد (Standard peripheral library) توسط شرکت ST ارائه شده بود که دیگر به روز نمیشود. بنابراین بهتر است از کتابخانه جدید در پروژه های جدید استفاده شود.
ویژگی های اصلی HAL اینهاست:
- مجموعه ای از API های قابل انتقال در خانواده میکروکنترلرها.
- سه حالت برنامه نویسی API: سرکشی، وقفه و DMA
- API ها سازگار با RTOS هستند.
- کاملا بازگشت پذیر
- کاربرد نظام مند پایان زمان ها در حالت سرکشی
- قابلیت نمونه سازی چندگانه وسیله جانبی با فراخوانی چندباره API (USART1،USART2، …)
- همگی این API ها به کاربر امکان فراخوانی توسط کاربر را می دهد. برای مثال با توابع Init و DeInit برای ساعتها، GPIO ها و وقفهها و …
راه اندازهای HAL دارای فایلهای زیر است. این فایلها معمولاًً شامل یک فایل c هستند که کدهای اصلی را شامل میشود و یک فایل هدر (فایل.h) که شامل دادههای مشترک و Catch و ساختمانهای شمارشی و تعریف ها و ماکروها و … است.
- Stm32f4xx_hal_ppp.c ، Stm32f4xx_hal_ppp.h (فایل اصلی وسایل جانبی مشترک بین همه میکروکنترلر ها)
- Stm32f4xx_hal_ppp_ex.c ، Stm32f4xx_hal_ppp_ex.h (فایلهای گسترش یافته برای وسایل جانبی در خانوادههای خاص میکروکنترلر)
- Stm32f4xx_ll_ppp.c ، Stm32f4xx_ll_ppp.h (فایلهای لایه پایینتر که توسط بقیه فایلهای HAL فراخوانی میشود. حروف “ll” در میان نام این فایل، کوتاه شده لایه پایین (lower layer) است).
- Stm32f4xx_hal.c، Stm32f4xx_hal.h (برای آغاز سازی HAL استفاده میشود)
- Stm32f4xx_hal_msp_template.c ، Stm32f4xx_hal_conf_template.h (فایل الگو که باید در پوشه کاربر کپی شود. شامل آغازسازی های خاص میکروکنترلر MSP مربوط به وسایل جانبی است که کاربر استفاده کرده است.)
- Stm32f4xx_hal_def.h (منابع مشترک HAL مانند جملههای تعریف مشترک، شماره زننده ها (enumerations)، ساختمانها و ماکرو ها)
کاربر باید دست کم فایلهای زیر را در یک پروژه استفاده کند:
- system_Stm32f4xx.c (شامل ()SystemInit است که فرایند راه اندازی بعد از ریست را انجام میدهد. PLL را راه اندازی نمیکند. عملیات کانفیگ اولیه حافظه SRAM را انجام می دهد)
- Startup_Stm32f4xx.s (شامل راه اندازها پس از ریست و بردارهای استثنا (وقفه) می باشد.)
- Stm32f4xx_flash.icf (این فایل دلخواه است. فایل ارتباط دهنده برای نرم افزار EWARM است برای کامپایل کردن)
- Stm32f4xx_hal_msp.c (این فایل شامل آغازسازی و پایان دهی وسایل جانبی خاص میکروکنترلر است.)
- Stm32f4xx_hal_conf.h (با تغییر این فایل میتوان راهاندازهای HAL را برای کاربرد خاص منطبق کرد. این کار ضروری نیست و میتوان از تنظیمات پیشفرض استفاده کرد.)
- Stm32f4xx_it.c/.h (این فایل شامل به دست گیرنده استثناها و روال خدمت وقفههای جانبی و … است.)
- main.c/.h (این فایل روال برنامه اصلی را شامل میشود. باید ()HAL_Init را صدا بزند، پیادهسازیهای ()assert_failed را انجام دهد، تنظیمات ساعت سیستم را انجام دهد و آغازسازی وسایل جانبی و کد کاربر را شامل شود)
در زیر فایل یک پروژه نمونه ارائه شده توسط شرکت Kail دیده میشود که شامل فایلهای گفته شده در بالاست.
ساختمان های دادهی HAL
در HAL از ساختمانهای زبان سی برای انتقال پارامترهای مختلف و عملیات مختلف برای آغازسازی وسایل جانبی انجام میشود. ساختمانهای به دستگیری وسایل جانبی به شکل زیر تعریف میشوند:
1 | PPP_HandleTypeDef *handle |
این ساختمان تنظیم وسیله جانبی و رجیسترهای آن و همه متغیرهای مورد نیاز آن را به عهده دارد. به کمک این روش میتوان نمونه سازیهای مختلفی از وسایل جانبی انجام داد و هر نمونه را با به دست گیرنده خاص خود کنترل کرد. برای ارتباط بین وسایل جانبی نیز این ساختمانها کمک میکنند. یک نمونه ساختمان وسایل جانبی در زیر دیده میشود:
نکات:
وقتی یک وسیله جانبی چند فرایند همزمان را با استفاده از DMA کنترل میکند به دست گیرنده رابط DMA برای هر فرایند باید به PPP_HandleTypeDef اضافه شود.
برای وسایل جانبی مشترک و یا سیستم نیازی به اشارهگر نیست. این وسایل جانبی شامل اینهاست:
- GPIO
- SYSTICK
- NVIC
- PWR
- RCC
- FLASH
ساختمان آغازسازی و تنظیم
این ساختمانها در فایل هدر، عمومی تعریف شده مگر اینکه مختص به شماره قطعه خاصی باشند، در این صورت در فایل هدر گسترش یافته تعریف شدهاند. برای مثال در زیر ساختمان مربوط به وسیله جانبیِ ارتباط سریال دیده میشود.
دسته بندی APIها
این توابع دو دسته دارند:
- تابع های API عمومی: به همه اعضای خانواده STM32 می خورند. این توابع در فایل های راه انداز HAL عمومی قرار دارند.
- تابع های API گسترش یافته: این فایل برای خانواده خاص یا شماره قطعه خاصی به کار می روند. برای مثال وقتی شامل شماره قطعه خاصی میشوند به کمک دستورهای پیش پردازنده جدا میشوند. نمونه ای در کد زیر برای شماره قطعه هایی از خانواده f4XX دیده میشود.
کتابخانه HAL همه ی وسایل جانبی را پشتیبانی نمیکند. اگرچه تعداد چنین وسایلی زیاد نیست اما میتوان با مراجعه به بخش Devices supported by HAL drivers در فایل توضیحات HAL برای شماره قطعه های مختلف این محدودیت ها را دید.
قاعده نام گذاری تابع های API در HAL
این قاعدهها برای نام گذاری تابع های 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 که به حالت تزریق اشاره دارد.
برای وسایل جانبی عمومی یا سیستم از اشارهگر یا اشیا نمونه استفاده نمیشود. این قانون شامل این وسایل جانبی است.
- GPIO
- SYSTICK
- NVIC
- RCC
- FLASH
برای مثال تابع ()HAL_GPIO_Init تنها به آدرس GPIO و تنظیمات آن نیاز دارد.
1 | HAL_STatuSTypeDef HAL_GPIO_Init (GPIO_TypeDef* GPIOx, GPIO_InitTypeDef *Init)}/*GPIO Initialization body */} |
تعدادی ماکرو برای اداره وقفهها و ساعتها به کار می رود جدول این ماکروها به شکل زیر دیده میشود.
نکات
- NVIC و SYSTICK دو مشخصه Cortex هستند. تابعهای API مرتبط با اینها در c قرار دارد.
- وقتی یک بیت وضعیت یا پرچم از رجیسترها خوانده میشود به اندازه مکان بیت مورد نظر شیفت داده میشود و سپس وضعیت به شکل ۳۲ بیتی برگردانده میشود.
- دستگیرههای PPP باید قبل از تابع آغازسازی ساخته شده باشند و گرنه در بررسی ابتدای این تابع خطا برگردانده میشود.
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) |
دستگیرنده وقفه HAL و تابع های CALLBACK
علاوه بر تابع های API، راه اندازهای وسایل جانبی HAL، شامل دستگیرنده وقفههای وسایل جانبی ()HAL_PPP_IRQHandler است که باید از stm32f4xx_it.c فراخوانی شود. هم چنین در کتابخانه HAL تابع های CALLBACK کاربر قرار دارد.
در قسمت دهم آموزش میکروکنترلر STM32F4 به سیستم عامل زمان واقعی (RTOS) و مبحث Thread خواهیم پرداخت. با سیسوگ همراه باشید.
خیلی خیلی عالی بود احسنت . در مورد این چیزا (ساختار توابع HAL و کامپایلر کیل) هیچ جا مطلب فارسی نیست و خیلی دنبالش بودم . همه جا در مورد برنامه نویسی هستش و این چیزا برام گنگ بود و نمی دونستم به چه دردی می خوره و چیه و از کدوماش باید استفاده کرد .
🙂