گام به گام برای شروع کار با برد STM32F103C8T6

فهرست مطالب

مقدمه

علاوه بر بردهای آشنای آردوینو، گزینه های دیگری نیز برای استفاده در پروژه های الکترونیکی وجود دارد، از جمله این گزینه ها استفاده از میکروکنترلرهای STM می باشد. میکروکنترلرهای STM مبتنی بر ساختار ARM هستند و به راحتی و با قیمت بسیار مناسب در دسترس قرار دارند. آنچه در این آموزش می آموزید شروع کار با برد STM32F103C8T6 می باشد.

آنچه در این آموزش یاد می گیرید

معرفی ARM و میکروکنترلرهای STM

شاید واژه (Advanced RISC Machine)ARM  برای شما آشنا باشد. ARM نوعی معماری (نه میکروکنترلر) برای ساخت پردازنده های 32 و 64 بیتی است. به دلیل قیمت بسیار مناسب، سرعت بالا و توان مصرفی پایین از این معماری در ساخت پردازنده های سیستم های نهفته (Embedded system) مانند گوشی های تلفن همراه، رسپبری پای، میکروکنترلرها و …  بسیار استفاده می شود. میکروکنترلرهایی که با معماری ARM ساخته شده اند، معمولا با نام Cortex-(A,R,M)X عرضه می شوند، A برای سیستم های کاربردی مانند گوشی تلفن همراه، تبلت، سیستم های نهفته (Embedded system) و …، R برای سیستم های زمان واقعی (Real-Time) و M برای سیستم های با مصرف توان پایین می باشد. عدد بعد از این حروف نشانگر تعداد خطوط اجرایی (performance lines) پردازنده می باشد. یکی از شرکت هایی که این معماری را برای ساخت پردازنده های خود انتخاب می کند، شرکت ST می باشد. میکروکنترلرهای این شرکت تحت عنوان STM بعلت تنوع بالا و ارائه کتابخانه های برنامه نویسی کاربردی، بسیار محبوب شده اند. نام گذاری خانواده های میکروکنترلرهای STM از قاعده زیر پیروی می کند: STM32xxaayznn ST: نام شرکت. M32: میکروکنترلر 32 بیتی. xx: خانواده و کلاس کاری:
Code Core Max Freq(MHz) Max Flash(KB) Max SRAM(KB) Target
L0 CortexM0+ 32 192 20 Ultra Low Power
F0 CortexM0 48 256 32 Mainstream
F3 CortexM4 72 512 80 Mainstream
L1 CortexM3 32 512 80 Ultra Low Power
F1 CortexM3 72 1024 96 Mainstream
F2 CortexM3 120 1024 128 High Performance
L4 CortexM4 80 1024 320 Ultra Low Power
F7 CortexM7 216 2048 512 High Performance
H7 CortexM7 400 2048 1048 High Performance
aa: به کارایی میکروکنترلر بستگی داشته و الگوریتم خاصی ندارد. Y: تعداد پایه ها:
z: حافظه:
nn: پکیج بندی، مهم ترین پکیج ها را در جدول زیر مشاهده می کنید:

لوازمی که به آن احتیاج دارید

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

برد مینی آرم STM32F103C8T6 × 1
پروگرمر ST Link v2 × 1
ماژول مبدل TTL به USB × 1

نرم افزار های مورد نیاز

Keil MDK-ARM uVision5
STM32 CubeMx
STM23 Flash Loader Demostrator

میکروکنترلر STM32F103C8T6 به علت قیمت پایین و در دسترس بودن، برای شروع کار با میکروکنترلرهای STM گزینه مناسبی است. مشخصات کلی این میکروکنترلر به شرح زیر است:

  • میکروکنترلر 32 بیتی از خانواده CortexM3
  • دارای 64 کیلوبایت حافظه فلش
  • دارای 20 کیلوبایت حافظه SRAM
  • حداکثر سرعت پردازش 72 مگاهرتز
  • دارای 37 پایه GPIO
  • دارای 12 کانال PWM
  • دارای 10 کانال ADC 12 بیتی
  • پشتیبانی از دو واحد I2C و دو واحد SPI و سه واحد UART
  • دارای 3 تایمر 16 بیتی
  • دارای یک واحد پشتیبانی از پروتکل Can 2.0

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

شروع کار با STM32F103C8T6

یکی از بهترین ابزارها برای برنامه نویسی میکروکنترلرهای STM استفاده از کامپایلر MDK-ARM uVision 5 می باشد، این نرم افزار قدرتمند شامل محیط یکپارچه برنامه نویسی و کامپایلر C و C++، محیط رفع خطا (Debugger)، قابلیت پروگرم کردن روی میکرو و تمام المان های لازم برای برنامه نویسی می باشد.

ابزار بسیار مفید دیگری که استفاده از آن کار با میکروکنترلرهای STM را بسیار ساده می کند، STM32 CubeMX می باشد.

تغییرات رجیسترها، اختصاص کلاک و پیکربندی میکروکنترلرهای STM ممکن است بصورت کد کاری بسیار دشوار و خسته کننده باشد اما با استفاده از STM32 CubeMX در یک محیط گرافیکی و کاربرپسند به راحتی می توانید تنظیمات لازم را برروی میکروکنترلر STM خود انجام داده و پروژه آماده شده را برای نرم افزار Keil تولید کنید.

بعد از تولید پروژه و نوشتن برنامه مدنظرتان، نوبت به آپلود کدها بر روی میکروکنترلر می رسد، برای این کار دو روش متداول وجود دارد:

پروگرم کردن میکروکنترلرهای STM با استفاده از St link

در این روش از ابزار ST Link V2.0 که مخصوص میکروکنترلرهای STM است استفاده می شود. قبل از پروگرم کردن می بایست درایورهای مورد نیاز St link را از این لینک دانلود و نصب کنید.

حال مراحل زیر را انجام دهید:

پروگرم کردن میکروکنترلرهای STM با استفاده از ماژول USB to TTL

از قابلیت های خوب میکروکنترلرهای STM قابلیت پروگرم شدن از طریق پایه های Rx و Tx می باشد، در این روش نیاز به ابزار پروگرمر نمی باشد و تنها ابزاری که نیاز دارید یک مبدل USB-TTL است. همچنین برای استفاده از این روش نرم افزار STM32 Flash Loader Demonstrator نیز نیاز است.
نکته
برای پروگرم کردن میکروکنترلر از طریق USB باید پایه BOOT0 را به 3.3 و BOOT1 را به زمین متصل کنیم (در بورد های آماده کافیست جامپر BOOT0 را جا به جا کنید).
حال مراحل زیر را انجام دهید:
Note
اگر برای برد شما Target is protected فعال بود و چراغ قرمز نشان داده می شد، ابتدا Remove protection را زده و سپس روی Next کلیک کنید.

ساخت یک چشمک زن با STM32F103C8T6

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

حال در STM32 CubeMX -مراحل زیر را انجام دهید:

گام اول) انتخاب میکروکنترلر

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

گام دوم) تعریف پایه GPIO بصورت خروجی

گام سوم) تنظیمات کلاک

 
 

گام چهارم) خروجی گرفتن از پروژه

 

با انتخاب گزینه Open Project پروژه در Keil باز می شود.

حال شما آماده برنامه نویسی هستید.

کد

برای بسیاری از کاربردهای میکروکنترلرهای STM کتابخانه HAL گزینه خوبی است، این کتابخانه بصورت پیشفرض فعال است.
نکته
بهتر است کدهای خود را بین قسمت های USER CODE BEGIN و USER CODE END بنویسید، اگر تغییراتی در CubeMX داده و مجددا خروجی بگیرید کدهایی که خارج از محدوده های تعیین شده نوشته باشید پاک می شود.
/** 

  ****************************************************************************** 

  * LED Test 

  * Description        : Saeed Hosseini @ Electropeak 

Home
****************************************************************************** * * COPYRIGHT(c) 2019 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* 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); void Error_Handler(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 */ 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(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); HAL_Delay(50); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Configuration */ 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(); } /**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(); } /**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(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : LED_Pin */ GPIO_InitStruct.Pin = LED_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @param None * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler */ /* User can add his own implementation to report the HAL error return state */ while(1) { } /* USER CODE END Error_Handler */ } #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, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
بیشتر قسمت های این کد توسط STM32 CubeMX تولید شده است. تابع HAL_GPIO_TogglePin (LED_GPIO_Port, LED_Pin) با مشخص کردن پورت و پایه مورد نظر، وضعیت پایه را تغییر می دهد. مشاهده می کنید که پورت و پایه با لیبل انتخابی در STM32 CubeMX مشخص شده است. تابع HAL_Delay function (50); نیز 50 میلی ثانیه تاخیر ایجاد می کند. برای آشنایی با توابع کامل موجود در کتابخانه HAL می توانید اینجا را مطالعه کنید.

یک گام جلوتر

  • سعی کنید با ورودی کردن یک پایه GPIO دیگر و اتصال یک کلید، LED را با فرمان کلید روشن و خاموش کنید.

از این مطلب خوشتان آمد؟

آخرین مطالت و آموزش ها را در ایمیلتان دریافت کنید:

مطالب بیشتر

Comments (2)

  • outfild Reply

    5 mg cialis generic india It is caused by Orientia formerly Rickettsia tsutsugamushi, an obligate intracellular gram negative bacterium, which was first isolated in Japan in 1930

    ژانویه 9, 2023 at 4:50 ق.ظ
    • علی عبدالملکی Reply

      Hi dear
      please notice , here is a technical forum not a pharmacy
      :)))

      فوریه 28, 2023 at 10:22 ق.ظ

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

نشانی ایمیل شما منتشر نخواهد شد.