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

آموزش برنامه نویسی STM32 با کیل Keil uVision و STM32Cube MX

سلام. آموزش برنامه نویسی STM32 با کیل Keil uVision و STM32Cube MX را آماده کردیم.

آموزش کد نویسی روی برد STM32 با کیل یو ویژن

میکروکنترلرهای STM32 که از معماری ARM Cortex M استفاده می کنند ، امروزه رواج یافته و به دلیل ویژگی های زیاد ، هزینه کم و کارایی بالا در بسیاری از پروژه ها مورد استفاده قرار می گیرند. ما برنامه نویسی STM32 با آردوینو را قبلا آموزش داده ایم. برنامه نویسی STM32 با Arduino IDE بسیار ساده است ، زیرا تعداد زیادی کتابخانه برای سنسورهای مختلف برای انجام هر کار وجود دارد و ما فقط باید آن کتابخانه ها را در برنامه اضافه کنیم. برنامه نویسی ARM با آردوینو روشی آسان است و ممکن است در مورد پردازنده های ARM باعث یادگیری عمیق نشود. بنابراین اکنون در مرحله  برنامه نویسی ARM هستیم. با این کار ما می توانیم نه تنها ساختار کد خود را بهبود بخشیم بلکه با استفاده نکردن از کتابخانه های غیر ضروری می توان فضای حافظه را نیز ذخیره کرد.

STMicroelectronic ابزاری به نام STM32Cube MX معرفی کرد که کد اصلی را با توجه به لوازم جانبی و برد انتخابی STM32 تولید می کند. بنابراین نیازی نیست که نگران برنامه نویسی برای درایور اصلی و لوازم جانبی باشیم. علاوه بر این از این کد تولید شده می توان در Keil uVision برای ویرایش با توجه به نیاز استفاده کرد. سرانجام این کد با استفاده از پروگرامر ST-Link از STMicroelectect در STM32 بارگذاری می شود.

در این آموزش نحوه برنامه نویسی روی برد قرص آبی یا همان STM32 با استفاده از کیل یو ویژن (Keil uVision) را می آموزیم و در نهایت یک پروژه را طراحی میکنیم که با فشردن کلید، LED را روشن میکند. ما کد را با استفاده از STM32Cube MX تولید می کنیم و سپس کد را با استفاده از Keil uVision در STM32F103C8 ویرایش و بارگذاری می کنیم. قبل از جزییات ، ما ابتدا با پروگرامر ST-LINK و ابزار نرم افزاری STM32CubeMX آشنا می شویم.

پروگرامر ST-LINK V2

ST-LINK / V2 یک دیباگر برنامه و پروگرامر برای خانواده های میکروکنترلر STM8 و STM32 است. با استفاده از این ST-LINK می توانیم کد را در STM32F103C8 و سایر میکروکنترلرهای STM8 و STM32 بارگذاری کنیم. برای ارتباط با هر میکروکنترلر STM8 یا STM32 که در یک برد قرار دارند، از ماژول های ارتباطتک سیم (SWIM) و JTAG / serial دیباگر سیم (سریال SWD) استفاده می شود. از آنجا که برنامه های STM32 از رابط کاربری کامل USB برای برقراری ارتباط با محیط های توسعه یکپارچه Atollic ، IAR ، Keil یا TASKING استفاده می کنند، بنابراین می توانیم از این سخت افزار برای برنامه ریزی میکروکنترلرهای STM 8 & STM32 استفاده کنیم.

پروگرامر ST-LINK V2

در بالا تصویر دانگل ST-LINK V2 از STMicroelectronic مشاهده میشود که طیف کاملی از STM32 SWD ، دیباگر و  رابط کاربری ساده 4 سیم (از جمله قدرت) را پشتیبانی می کند. این دانگل در رنگهای متنوعی موجود است. بدنه از آلیاژ آلومینیوم ساخته شده است. این دانگل یک LED آبی دارد که برای مشاهده وضعیت کار ST-LINK استفاده می شود. همانطور که در تصویر بالا مشاهده می کنیم نام پین ها به وضوح روی بدنه مشخص شده است. میتوان برنامه ها را با آن با نرم افزار Keil روی میکروکنترلر های STM32 فلش کرد. بنابراین در این آموزش خواهیم دید چگونه میتوان از این پروگرامر St link برای برنامه نویسی میکروکنترلر های STM 32 استفاده کرد. تصویر زیر پین های ماژول ST-LINK V2 را نشان میدهد.

پین های ماژول ST-LINK V2

STM32CubeMX چیست؟

ابزار STM32CubeMX بخشی از STMicroelectronic STMCube است. این نرم افزار با کاهش زمان و هزینه توسعه ، پیشرفت را آسان تر می کند. STM32Cube شامل STM32CubeMX است که یک ابزار پیکربندی گرافیکی است که امکان تولید کد اولیه C را فراهم می کند. این کد می تواند در محیط های مختلف توسعه مانند keil uVision ، GCC ، IAR و … مورد استفاده قرار گیرد. دانلود ابزار STM32CubeMX 

STM32CubeMX دارای ویژگی های زیر است :

  • حل مشکلات پین ها
  • کمک به تنظیم درخت ساعت
  • محاسبه گر مصرف برق
  • یکربندی محیطی MCU مانند پین های GPIO ، USART و …
  • پیکربندی محیطی MCU را برای Stack های میانی مانند USB ، TCP / IP و …
حتما ببینید :  آموزش اتصال TFT LCD لمسی 3.5 اینچ به رزبری پای

قطعات مورد نیاز

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. پروگرامر ST-LINK V2
  3. دکمه
  4. LED

مدار راه اندازی STM32 با Keil

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

مدار راه اندازی STM32 با Keil

اتصال بین ST-LINK V2 و STM32F103C8

در اینجا بورد STM32 Blue Pill از ST-LINK که به درگاه USB رایانه متصل است، تغذیه می شود. بنابراین لازم نیست که STM32 را جداگانه نیرو دهیم. در جدول زیر ارتباط بین ST-Link و برد قرص آبی نشان داده شده است.

STM32F103C8ST-Link V2
GNDGND
SWCLKSWCLK
SWDIOSWDIO
3.3V3.3V

با فشار دادن یک دکمه، از LED برای نشان دادن خروجی از صفحه Blue Pill استفاده می شود. آند LED به پین ​​PC13 برد STM32 متصل شده و کاتد پایه به GND متصل است.

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

یک دکمه برای ارائه ورودی به پین ​​PA1 برد STM32 وصل شده است. همچنین باید از مقاومت 10 کیلو اهم استفاده کنیم زیرا ممکن است هنگام آزاد شدن دکمه، نویز بوجود آید و دوباره ال ای دی روشن شود. یک انتهای دکمه به زمین وصل می شود و انتهای دیگر به پین ​​PA1 و یک مقاومت تا 10k نیز به 3.3 ولت متصل است

ایجاد برنامه در STM32 با استفاده از Keil uVision و ST-Link

مرحله 1: ابتدا تمامی درایورهای دستگاه را برای ST-LINK V ، ابزارهای نرم افزاری STM32Cube MX & Keil uVision و بسته‌های لازم برای STM32F103C8 را نصب کنید.

مرحله 2:  STM32Cube MX را باز کنید.

مرحله 3: سپس بر روی New Project کلیک کنید.

ایجاد برنامه در STM32 با استفاده از Keil uVision و ST-Link

مرحله 4: جستجو و میکروکنترلر STM32F103C8 خود را انتخاب کنید.

آموزش کد نویسی روی برد STM32 با کیل یو ویژن

مرحله 5: – اکنون پین های STM32F103C8 ظاهر می شوند ، در اینجا می توانیم تنظیمات پین ها را انجام دهیم. همچنین می توانیم پین های خود را مطابق با پروژه خود در قسمت لوازم جانبی انتخاب کنیم.

تنظیم پین ها در کیوب MX

مرحله 6: همچنین می توانید مستقیماً روی پین کلیک کنید و لیستی ظاهر می شود ، حالا پیکربندی پین مورد نیاز را انتخاب کنید.

آموزش نرم افزار STM32Cube MX

مرحله 7: – برای این پروژه ما PA1 را به عنوان ورودی GPIO انتخاب میکنیم. سپس پین PC13  را به عنوان خروجی GPIO و SYS debug SERIAL WIRE انتخاب میکنیم. پین های انتخاب شده و پیکربندی شده با رنگ سبز ظاهر می شوند. در تصویر زیر می توانید مشاهده کنید.

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

مرحله 8: در تب Configuration ، مانند تصویر زیر GPIO را انتخاب کنید تا پین های GPIO را برای پین هایی که انتخاب کرده ایم تنظیم کنید.

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

مرحله 9: در مرحله بعد در پنجره pin configuration می توانیم User Label را برای پین هایی که استفاده می کنیم پیکربندی کنیم ، یعنی نام های پین تعریف شده توسط کاربر.

User Label در نرم افزار CUBEMX

مرحله 10: پس از آن بر روی Project >> Generate Code کلیک کنید.

ایجاد کد در Cube MX

مرحله 11: اکنون پنجره project settings ظاهر می شود. در این کادر نام و محل پروژه خود را انتخاب کرده و محیط توسعه را انتخاب می کنیم. ما از Keil استفاده می کنیم بنابراین MDK-ARMv5 را به عنوان IDE انتخاب کنید.

ذخیره پروژه در Cube MX برای کیل Keil

مرحله 12: در تب Generator Code ، فقط پرونده های کتابخانه لازم را کپی کنید و سپس بر روی OK کلیک کنید.

استفاده از کتابخانه های مناسب برای STM32

مرحله 13: – اکنون پنجره تولید کد ظاهر می شود. Open Project را انتخاب کنید تا کد تولید شده در Keil uvsion به طور خودکار پروژه باز شود.

باز کردن پروژه در Keil uvsion

مرحله 14: اکنون Keil uVision با کد تولید شده ما در STM32CubeMx با همان نام پروژه با کتابخانه و کدهای لازم که برای پین های انتخاب شده تنظیم شده است ، باز می شود.

آموزش ایجاد کد در کیل یو ویژن

مرحله 15: اکنون فقط کافی است که منطقی را برای انجام برخی اقدامات در LED خروجی (پین PC13) در هنگام فشردن دکمه در ورودی GPIO (پین PA1) وارد کنیم. بنابراین main.c را انتخاب کنید تا برخی کدها را در آن وارد کنید.

ویرایش برنامه اصلی در Keil برای STM32

مرحله 16: – اکنون کد را در While1 اضافه کنید.

while (1)
{
  if(HAL_GPIO_ReadPin(BUTN_GPIO_Port,BUTN_Pin)==0) //=> شتخیص فشرده شدن دکمه
{          
    HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,1); //ایجاد خروجی هنگام فشرده شدن دکمه
}

else
{
    HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,0); //غیرفعال کردن خروجی هنگام رها شدن دکمه
}
} 

برنامه نویسی پین های GPIO STM32 در کیل

مرحله 17: – پس از پایان ویرایش کد ، روی Options for Target کلیک کنید و سپس به تب Debug بروید و ST-LINK Debugger را انتخاب کنید.

آموزش کامل استفاده از St Link Debugger

همچنین ، بر روی دکمه Settings و سپس در زیر گزینه Flash Download ، گزینه Reset and Run را تیک بزنید و “ok” را بزنید.

حتما ببینید :  آموزش استفاده از Digital Read/Write در لانچ پد MP430GT

برنامه نویسی ARM در محیط KEil

مرحله 18: اکنون روی آیکون Rebuild کلیک کنید تا کلیه فایلهای هدف بازسازی شود.

بازسازی فایل های مورد نیاز در Keil

مرحله 19: اکنون می توانید ST-LINK را با اتصال مدار به رایانه وصل کنید و بر روی نماد DOWNLOAD کلیک کنید یا F8 را فشار دهید تا STM32F103C8 را با کدی که تولید کرده اید فلش کنید.

فلش کردن STM32 با کیل

مرحله 20: می توانید نشانگر چشمک زن را در پایین پنجره keil uVision مشاهده کنید.

پروگرام برنامه روی STM32 با keil uVision

نتیجه نهایی برنامه نویسی STM32 با Keil

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

نتیجه نهایی برنامه نویسی STM32 با Keil

کد کامل پروژه چشمک زن در Keil

قسمت اصلی که در برنامه تولید شده اضافه کرده ایم در زیر آورده شده است. این کد زیر باید در while 1 برنامه main.c ایجاد شده توسط STM32CubeMX درج شود. برای یادگیری نحوه اضافه کردن آن در برنامه main.c می توانید به مرحله 15 و مرحله 17 برگردید.

while (1)
{
  if(HAL_GPIO_ReadPin(BUTN_GPIO_Port,BUTN_Pin)==0) //=> شتخیص فشرده شدن دکمه
{          
    HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,1); //ایجاد خروجی هنگام فشرده شدن دکمه
}

else
{
    HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,0); //غیرفعال کردن خروجی هنگام رها شدن دکمه
}
} 

کد کامل main.c در زیر آورده شده است. علاوه بر این ، می توانید مجموعه کاملی از پروژه های STM32 ما را ببینید.

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h" 
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* USER CODE END PV */ 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void); 
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/ 
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */ 
/**
  * @brief  The application entry point.
  *
  * @retval None
  */
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();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
     if(HAL_GPIO_ReadPin(BUTN_GPIO_Port,BUTN_Pin)==0) //=> Button is Pressed
{
              HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,1);
}
else //=>Button is released
{
              HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,0);
}
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
 
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  } 
    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  } 
    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 
    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LEDOUT_GPIO_Port, LEDOUT_Pin, GPIO_PIN_RESET);
  /*Configure GPIO pin : LEDOUT_Pin */
  GPIO_InitStruct.Pin = LEDOUT_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LEDOUT_GPIO_Port, &GPIO_InitStruct);
  /*Configure GPIO pin : BUTN_Pin */
  GPIO_InitStruct.Pin = BUTN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(BUTN_GPIO_Port, &GPIO_InitStruct);
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
if(HAL_GPIO_ReadPin(BUTN_GPIO_Port,BUTN_Pin)==0) //=> DETECTS Button is Pressed
    {          
    HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,1); //To make output high when button pressesd
    }
    else
    {
    HAL_GPIO_WritePin(LEDOUT_GPIO_Port,LEDOUT_Pin,0); //To make output Low when button de pressed
    }
  }
  /* 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(uint8_t* 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 */
}
#endif /* USE_FULL_ASSERT */

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

محمد رحیمی

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

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

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

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