۱۴۰۳ مهر ۲, دوشنبه

برنامه نویسی میکروکنترلر STM32 از ابتدا (From scratch)


توی پست قبل درباره نوشتن اولین برنامه برای میکروکنترلر STM32F103 و برد BluePill مطالبی رو گفتم. استفاده از ویزارد برنامه STM32CubeIDE سرعت کار را بالا برده و با تنظیم (کانفیگ) متغیرها و توابع راحتی زیادی برای برنامه نویس و توسعه دهنده به ارمغان می‌آورد.

من میخواهم یک پروژه جدید بدون استفاده از ویزارد IDE بسازم و خودم فایلهاو دایرکتوری های مورد نیاز پروژه‌ام رو بهش الحاق کنم و کامپایلر را برای مسیرهای جدید تنظیم کنم. من میخوام یک پروژه رو بصورت from Scratch در STM32CubeIDE بسازم.

۱- ابتدا با توجه به خانواده پردازنده مورد استفاده تون فایل STM32CubeFx را دانلود کنید. (در سایت st.com میتوانید اسم فایل مورد نیاز - مثلا stm32cubef1 را سرچ کنید.) من از میکروکنترلر STM32F103 استفاده میکنم و فایل (های) STM32CubeF1 را دانلود کردم. ( بسته به پردازنده x میتواند عددهای ۱،۲،۳،۴ و۷ باشه)

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

۲- یک پروژه جدید میسازیم 


۳-در مرحله بعد نوع میکروکنترلر مورد استفاده را مشخص میکنیم:

۴- در مرحله بعد پروژه را بصورت زیر تنظیم می‌کنیم. دقت کنید Target Project Type حتما از نوع Empty انتخاب شود. درصورتیکه STM32Cube انتخاب شود، وارد قسمت ویزارد میشویم که در پست قبلی درباره آن صحبت شد.


در انتها با زدن دکمه Finish پروژه خالی ما ساخته خواهد شد و ما راسا اقدام به ویرایش پروژه، فایلها و آرایش فولدرها خواهیم کرد.
پروژه بصورت زیر در اختیار ما قرار می‌گیرد:

۵- فایلهای زیر را از پروژه حذف میکنیم:

۶- در دایرکتوری پروژه فولدرهای CMSIS و Core و HAL و Peripherals و Startup را میسازیم. در فولدرهای Core و Peripherals دو فولدر Inc وSrc را میسازیم. در ادامه از این فولدرها برای قرار دادن هدر فایلها و سورس فایلهایی که به پروژه اضافه میکنیم، استفاده میشود.
نمایش درختی دایرکتوری پروژه به صورت زیر است:


۷- فایل های داخل فولدر stm32cubef1\Drivers\CMSIS\Include که در ابتدای این آموزش از سایت st دانلود کردیم و به همراه فایل patch با هم استخراج کردیم بصورت زیر است. فولدر Include را به همراه محتویات آن کپی میکنیم و در مسیر پروژه در پوشه CMSIS قرار میدهیم (Paste  میکنیم.).

۸- فایل های stm32f1xx.h و stm32f103xb.h و system_stm32f1xx.h را از پوشه stm32cubef1\Drivers\CMSIS\Device\ST\stm32f1xx\Include کپی میکنیم و در مسیر دایرکتوری پروژه فولدر CMSIS\Device قرار میدهیم.

۹- در برنامه STM32CubeIDE در قسمت Project Explorer بر روی نام پروژه کلیک راست کرده و Properties را انتخاب میکنیم. در قسمت C/C++ General و بخش Paths and Symbols در سربرگ Include و بخش Include directories مقدار Inc را حذف میکنیم و مقادیر زیر را اضافه می‌کنیم:

با زدن دکمه Add و سپس Variables و نوشتن proj در کادر مشخص شده ProjDirPath را انتخاب میکنیم:

مسیر های زیر را یک به یک اضافه میکنیم:
${ProjDirPath}\Core\Inc
${ProjDirPath}\CMSIS\include
${ProjDirPath}\CMSIS\Device
${ProjDirPath}\Peripherals\Inc

۱۰- در سربرگ Source Location دکمه Add Folder  را میزنیم و CMSIS, Core, HAL و Peripherals را انتخاب میکنیم:

۱۱- در سربرگ Symbols ابتدا بجز Debug# بقیه گزینه ها را حذف میکنیم، سپس عبارات زیر را Add کرده و در قسمت Name مینویسیم:
STM32F103xB و USE_HAL_DRIVER 

۱۲- در مسیر قرار گیری پروژه و فولدر HAL یک فولدر جدید با نام STM32F1xx_HAL_Driver میسازیم، سپس فولدر های Inc و Src را در آن ایجاد می‌کنیم.
در دایرکتوری stm32cubef1\Drivers\STM32F1xx_HAL_Driver دو فولدر Inc و Src قرار دارد. از فولدر Inc فایل های مورد نیاز پروژه را به ترتیب زیر انتخاب کرده و در فولدر Inc در مسیری که ایجاد کردیم قرار میدهیم.

stm32f1xx_hal.h
stm32f1xx_hal_cortex.h
stm32f1xx_hal_def.h
stm32f1xx_hal_dma.h
stm32f1xx_hal_dma_ex.h
stm32f1xx_hal_exti.h
stm32f1xx_hal_flash.h
stm32f1xx_hal_flash_ex.h
stm32f1xx_hal_gpio.h
stm32f1xx_hal_gpio_ex.h
stm32f1xx_hal_pwr.h
stm32f1xx_hal_rcc.h
stm32f1xx_hal_rcc_ex.h
stm32f1xx_hal_tim.h
stm32f1xx_hal_tim_ex.h
stm32f1xx_hal_uart.h
stm32f1xx_hal_usart.h


بصورت متناظر فایل های c. را از فولدر Src کپی کرده و در فولدر Src که ساختیم قرار میدهیم.
stm32f1xx_hal.c
stm32f1xx_hal_cortex.c
stm32f1xx_hal_dma.c
stm32f1xx_hal_exti.c
stm32f1xx_hal_flash.c
stm32f1xx_hal_flash_ex.c
stm32f1xx_hal_gpio.c
stm32f1xx_hal_gpio_ex.c
stm32f1xx_hal_pwr.c
stm32f1xx_hal_rcc.c
stm32f1xx_hal_rcc_ex.c
stm32f1xx_hal_tim.c
stm32f1xx_hal_tim_ex.c
stm32f1xx_hal_uart.c
stm32f1xx_hal_usart.c

۱۳- از مسیر stm32cubef1\Drivers\STM32F1xx_HAL_Driver\Inc فایل stm32f1xx_hal_conf_template.h را کپی میکنیم و در مسیر پروژه در دایرکتوری HAL قرار میدهیم. سپس نام فایل را به stm32f1xx_hal_conf.h تغییر می‌دهیم.

۱۴- مسیر دایرکتوری HAL را به Properties پروژه اضافه میکنیم.
در سربرگ Include در بخش Path and Symbols دکمه Add را میزنیم و مسیرهای زیر را اضافه می‌کنیم:
 ${ProjDirPath}\HAL\STM32F1xx_HAL_Driver\Inc
 ${ProjDirPath}\HAL

۱۵- در دایرکتوری Core\Inc یک فایل با نام main.h و یک فایل با نام stm32f1xx_it.h اضافه می‌کنیم.
فایل stm32f1xx_it.h حاوی تعاریف مربوط به توابع وقفه (اینتراپت) خواهد بود.


در دایرکتوری Core\Src فایل stm32f1xx_it.c را ایجاد می‌کنیم. فایل main.c را قبلا در این فولدر کپی کرده ایم.

۱۶- فایل های زیر را از مسیرهای مشخص شده در دایرکتوری stm32cubef1\Drivers\CMSIS\Device\ST\Source\Templates\system_stm32f1xx.c به مسیر دایرکتوری پروژه Core\Src کپی میکنیم.
فایل stm32cubef1\Drivers\CMSIS\Device\ST\Source\Templates\gcc\startup_stm32F13xb.s را در مسیر دایرکتوری پروژه فولدر Startup کپی میکنیم.
تنظیمات کامپایلر و کپی کردن فایلهای مورد نیاز به اتمام رسید. در ادامه یک برنامه تست ساده مینویسیم.
۱۷- ابتدا ماژولهای مورد نیاز برنامه خود را در فایل HAL\stm32f1xx_hal_conf.h که در مرحله ۱۳ ایجاد کردیم مشخص میکنیم.
برای این منظور در قسمت Module Selection تمام ماژولها را با زدن (Ctrl+7) کامنت میکنیم سپس ماژولهای مورد نیاز را Uncomment میکنیم:
#define HAL_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_EXTI_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_GPIO_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED
#define HAL_UART_MODULE_ENABLED
#define HAL_USART_MODULE_ENABLED


۱۸- در فایل main.h هدرفایل stm32f1xx_it.h را Include میکنیم:


۱۹- در فایل main.c هدر main.h را include میکنیم.

۲۰- تابع SysTick_Handler وظیفه زمانبندی و ایجاد تاخیر را در توابع HAL برعهده دارد. مطابق شکل زیر هدر تابع را به فایل stm32f1xx_it.h اضافه می‌کنیم:


۲۱- در فایل stm32f1xx_it.c برنامه زیر را مینویسیم:

#include "main.h"

#include "stm32f1xx_it.h"


void SysTick_Handler(void)

{

HAL_IncTick();

}




درصورتیکه بر روی تابع HAL_IncTick کلیک راست کنیم و Open Declaration یا F3 را بزنیم میتوانیم بدنه تابع را ببینیم.



۲۲- تابع main.c را بصورت زیر اصلاح میکنیم :

#include "main.h"


int main(void)

{

HAL_Init();

while(1)

{


}

}




در نهایت با Build کردن برنامه از صحت اجرای برنامه اطمینان می‌یابیم.
در ادامه نحوه تنظیم کلاک بدون استفاده از ویزارد برنامه توضیح داده خواهد شد.



هیچ نظری موجود نیست:

ارسال یک نظر