آموزش ARMآموزش STM32آموزش الکترونیک

آموزش برنامه نویسی STM32 Nucleo64 با STM32CubeMX و TrueSTUDIO

سلام. آموزش برنامه نویسی STM32 Nucleo64 با STM32CubeMX و TrueSTUDIO را آماده کردیم.

شروع کار با میکروکنترلر STM32 Nucleo64 با STM32CubeMX

بسیاری از ما با میکروکنترلرهای محبوب و برد های توسعه مانند Arduino ، Raspberry Pi، ESP8266، NoduMCU، 8051 و … آشنا هستیم. در صورت طراحی پروژه های حرفه ای ما محدودیت های آردوینو مثل هزینه، انعطاف، پایداری، سرعت و … را درک میکنیم. در این صورت نیاز به تغییر اساسی در انتخاب میکروکنترلر داریم و انتخاب ما میتواند STM، Rensans، PIC و … باشد.

در این آموزش ما میخواهیم برنامه نویسی برد STM32 Nucleo64 را انجام دهیم. این آموزش میتواند برای مبتدیان برای یادگیری و توسعه STM32 استفاده شود. برد های Nucleo64 برای برنامه نویسی های سرگرمی تا حرفه ای استفاده میشود و کم هزینه و کاربردی هستند.

شروع کار با میکروکنترلر STM32 Nucleo64 با STM32CubeMX

نسخه های زیادی از برد های توسعه STM32 Nucleo64 وجود دارد ، برد خاصی که در این آموزش استفاده می شود NUCLEO-F030R8 است. ما این برد را عمدتا به دلیل کم هزینه بودن انتخاب کرده ایم. حتی اگر نسخه دیگری نیز دارید هم میتوانید از این آموزش استفاده کنید زیرا تغییرات جزئی هستند.

نصب پلتفرم لازم برای برد Nucleo64

برای شروع کار با هر میکروکنترلری ، به یک IDE برنامه نویسی نیاز داریم ، مانند Arduino IDE برای تابلوهای آردوینو، Atmel Studio برای میکروکنترلر AVR و MP Lab برای PIC و … خانواده STM32 از میکروکنترلرهای 32 بیتی تشکیل شده اند که از IDE ها و ابزارهای زیر پشتیبانی می کنند :

  • IAR Embedded Workbench® for ARM® (EWARM)
  • MDK-ARM Keil
  • TrueSTUDIO
  • System Workbench for STM32

در اینجا برای آموزش ما از TrueSTUDIO برای نوشتن ، تدوین و اشکال زدایی کد استفاده میکنیم زیرا رایگان و ساده است. سپس از STM32CubeMX برای تولید درایورهای جانبی برای برد های STM32 استفاده می شود تا برنامه نویسی آسان تر شود. برای بارگذاری برنامه (پرونده hex) در برد، افراد معمولاً از ابزار STM32 ST-LINK استفاده می کنند ، اما دراین آموزش ما برای انجام این کار از TrueSTUDIO استفاده خواهیم کرد. TrueSTUDIO حالت اشکال زدایی (Debug) دارد که به برنامه نویسان اجازه می دهد تا پرونده را مستقیماً در STM32 بارگذاری کنند. هر دو TrueSTUIO و STM32CubeMX به آسانی دانلود و نصب میشوند. از لینک های زیر استفاده کنید.

ما در اینجا برای آموزش برامه نویسی برنامه نویسی STM32 Nucleo64 با STM32CubeMX و TrueSTUDIO یک پروژه را شروع میکنیم.

پروژه کنترل پین STM 32 Nucleo 64

در این پروژه ما یک دکمه را به برد STM32 متصل میکنیم و سپس با فشردن آن ال ای دی متصل به پین دیگر STM32 روشن میشود.

شماتیک مدار پروژه

قبل از شروع بخش نرم افزار و برنامه نویسی ، باید برد خود را برای این پروژه آماده کنیم. همانطور که در ابتدای در این مقاله ذکر شد ، ما قصد داریم با استفاده از یک دکمه ، یک LED را کنترل کنیم. حال باید بدانید که برد توسعه STM32 دارای دو مجموعه از پین ها در هر طرف به نام پین های ST Morpho است. همانطور که در شماتیک مدار زیر نشان داده شده است ، یک دکمه و یک چراغ را به این پین ها وصل کرده ایم.

پروژه کنترل پین ال ای دی با STM 32 Nucleo 64

اتصالات مدار برای این پروژه آسان است ، باید یک LED را در PA5 PORTA و یک کلید در PC13 PORTC وصل کنیم. همچنین می توانیم از LED و دکمه داخلی نیز استفاده کنیم.

مراحل پیکربندی STM32CubeMX برای برد STM32 Nucleo64

مرحله 1: پس از نصب ، STM32CubeMX را راه اندازی کنید و برد STM32 را انتخاب کنید.

مرحله 2: اکنون نام برد STM32 مانند NUCLEO-F030R8 جستجو کنید و روی برد موجود در تصویر را کلیک کنید. این نرم افزار از تمامی برد های توسعه STM32 از ST Microelectronic پشتیبانی می کند.

مراحل پیکربندی STM32CubeMX برای برد STM32 Nucleo64

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.

مرحله 3: اکنون همانطور که در تصویر زیر نشان داده شده است بر روی Yes کلیک کنید تا در قسمت پیش فرض همه لوازم جانبی را در حالت اولیه قرار دهید. بعدا می توانیم موارد مورد نیاز را طبق نیاز پروژه خود تغییر دهیم.

حتما ببینید :  برق اضطراری چیست ؟ آموزش انتخاب برق اضطراری ساختمان

نصب پلت فرم لازم برای برد Nucleo64

بعد از کلیک بر روی “Yes” ، صفحه مانند تصویر زیر میشود و پین های سبز رنگ نشان داده میشود.

پروژه کنترل پین STM 32 Nucleo 64

مرحله 4: اکنون کاربران می توانند تنظیمات مورد نظر را از بین دسته ها انتخاب کنند. در اینجا در این آموزش قصد داریم با استفاده از یک دکمه یک LED را کنترل کنیم. بنابراین ، ما باید پین LED را به عنوان خروجی و پین سوئیچ را به عنوان ورودی پیکربندی کنیم.

شما می توانید هر پین را که میخواهید انتخاب کنید ، PA5 را انتخاب می کنم و وضعیت آن را تغییر می دهم. برای تنظیم پین به عنوان خروجی وضعیت آن را باید روی GPIO_Output  قرار دهید. مانند تصویر زیر :

آموزش برنامه نویسی STM32

به همین ترتیب ، من PC13 را به عنوان GPIO_Input انتخاب می کنم تا بتوانم وضعیت دکمه را بخوانم.

اتصال دکمه به برد STM32

همچنین میتوانید پین ها را در صفحه pinout و configuration tab نیز تنظیم کنید.

تنظیم پین های STM32CubeMX

مرحله 5: در مرحله بعد کاربر می تواند فرکانس مورد نظر برای میکروکنترلر و پین ها را مطابق اسیلاتور خارجی و داخلی تنظیم کند. به طور پیش فرض ، یک اسیلاتور کریستالی 8 مگاهرتز داخلی انتخاب می شود و با استفاده از PLL ، این 8 به 48 مگاهرتز تبدیل می شود. بصورت پیش فرض STM32 روی 48 مگاهرتز کار می کنند.

آموزش برد Nucleo64

مرحله 6: اکنون در project manager نام و مکان پروزه خود را تعریف کنید و از ابزار یا IDE استفاده کنید. در اینجا ما از TrueSTUDIO استفاده می کنیم ، بنابراین من مطابق شکل زیر آن را انتخاب کرده ام.

آموزش استفاده از TrueSTUDIO برای STM32

مرحله 7: اکنون مانند تصویر زیر بر روی  Generation Code کلیک کنید.

تولید کد در STM32CubeMX

مرحله 8: اکنون پنجره ای باز میشود و باید روی Open Project کلیک کنید. اطمینان حاصل کنید قبل از این مرحله TrueSTUDIO را نصب کرده باشید.

برنامه نویسی STM32 Nucleo64 با TrueSTUDIO

اکنون کد یا پروژه شما در TrueSTUDIO به طور خودکار باز می شود سپس TrueSTUDIO از شما محل کار یا همان workspace را میخواهد که میتوانید مکان خاصی را تعریف کنید یا آن را به صورت پیشفرض رها کنید.

برنامه نویسی STM32 Nucleo64 با TrueSTUDIO

صفحه زیر را مشاهده می کنید و سپس باید روی علامت گوشه کلیک کنید.

آپلود کد روی STM32 Nucelo64

و اکنون می توانیم کد را در TreuSTUDIO IDE خود مشاهده کنیم. در سمت چپ در زیر پوشه “src” می توانیم فایلهای برنامه (با پسوند .c) را ببینیم که قبلاً توسط  STM32Cube برای ما تولید شده است. فقط باید فایل main.c را برنامه ریزی کنیم. حتی در پرونده main.c مواردی را تنظیم خواهیم کرد که توسط CubeMX برای ما تنظیم شده است ، فقط باید آنرا ویرایش کنیم تا متناسب با برنامه ما باشد. كد كامل داخل پرونده main.c در انتهاي اين صفحه آورده شده است.

آموزش نرم افزار TreuSTUDIO IDE

کد STM32 Nucleo64 برای کنترل LED با دکمه

از آنجا که کلیه درایورها و کدهای مورد نیاز توسط STM32CubeMX تولید می شوند ، فقط باید یک پین LED را به عنوان خروجی و یک دکمه را به عنوان ورودی تنظیم کنیم. برنامه باید در پرونده main.c نوشته شود. کد کامل در انتهای صفحه قرار داده شده است. در اینجا بعضی از قسمت های کد را بررسی میکنیم.

ابتدا پین های LED و دکمه را تعریف می کنیم. در اینجا ما یک LED را در پین ​​5 PORTA تعریف کرده ایم.

#define LED_PORT GPIOA
#define LED_PIN GPIO_PIN_5

و دکمه را در پین شماره 13 PORTC تعریف میکنیم.

#define SW_PORT GPIOC
#define SW_PIN GPIO_PIN_13

سپس در عملکرد اصلی ، کلیه لوازم جانبی مورد استفاده را به صورت اولیه تنظیم کرده ایم.

MX_GPIO_Init();
MX_USART2_Init();

سپس وضعیت دکمه را با استفاده از دستور if میخوانیم. اگر دکمه را فشار دهید این پین (LOW) میشود و  سپس LED حالت خود را تغییر می دهد.

While (1)
{
If (!HAL_GPIO_ReadPin(SW_PORT, SW_PIN))
{
HAL_GPIO_TogglePin(SW_PORT, LED_PIN);
HAL_Delay(200);
}
}

در اینجا تابع HAL_GPIO_ReadPin (SW_PORT، SW_PIN) دارای دو آرگومان است ، یکی PORT و دیگری PIN که در آن سوئیچ وصل می شود و این پین به عنوان INPUT هنگام پیکربندی در STM32CubeMX تنظیم می شود.

دیباگ و آپلود کد در STM32 Necleo64 با TrueSTUDIO

اکنون برد خود را با استفاده از کابل به کامپیوتر وصل کنید. پس از وصل کردن آن ، درایور مورد نیاز برای بورد به صورت خودکار بارگیری می شود ، می توانید این فرآیند را با استفاده از Device Manager بررسی کنید.

سپس آیکون debug مشخص شده توسط حلقه قرمز را در تصویر زیر را فشار دهید تا برنامه تهیه شود و وارد حالت اشکال زدایی شوید.

حتما ببینید :  تست برد آردوینو (آموزش تعمیر خرابی سوختن آردوینو)

دیباگ و آپلود کد در STM32 Necleo64 با TrueSTUDIO

در حالت اشکال زدایی ، کد به طور خودکار بارگذاری می شود. اکنون باید کد را با فشار دادن “Resume” یا F8 (که در عکس قرمز در تصویر زیر نشان داده شده است) کد را اجرا کنیم.

دیباگ کردن کد STM32

اکنون می توانیم با فشار دادن دکمه ، کنترل LED را آزمایش کنیم. طبق کد ، هر بار که دکمه فشار را فشار دهید ، LED باید حالت خود را تغییر دهد.

پس از آزمایش ، می توانیم با فشار دادن آیکون terminate که توسط تصویر حلقه قرمز رنگ در تصویر زیر مشخص شده است ، برنامه را خاتمه دهیم.

بستن برنامه در حال اجرا در نرم افزار TreuSTUDIO

فیلم عملکرد پروژه کنترل LED با فشردن دکمه STM32 Necleo64

فیلم زیر عملکرد پروژه روشن و خاموش کردن ال ای دی و پین STM32 Necleo64 را نشان میدهد. مشاهده فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.

کد کامل پروژه کنترل ال ای دی با دکمه و برد STM 32 Necleo64

کد کامل قسمت Main.C پروژه در باکس زیر آورده شده است.

#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define LED_PORT GPIOA
#define LED_PIN GPIO_PIN_5
#define SW_PORT GPIOC
#define SW_PIN GPIO_PIN_13
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
  if (!HAL_GPIO_ReadPin(SW_PORT, SW_PIN))
  {
  HAL_GPIO_TogglePin(LED_PORT, LED_PIN);
  HAL_Delay(200);
  }
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}
/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART2_UART_Init(void)
{
  /* USER CODE BEGIN USART2_Init 0 */
  /* USER CODE END USART2_Init 0 */
  /* USER CODE BEGIN USART2_Init 1 */
  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 38400;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */
  /* USER CODE END USART2_Init 2 */
}
/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  /*Configure GPIO pin : LD2_Pin */
  GPIO_InitStruct.Pin = LD2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  /* USER CODE END Error_Handler_Debug */
}
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(char *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا