نوشتن روی GPIO در STM32
ابتدا طبق جلسه ساخت پروژه در stm32cubemx در نرم افزار stm32cubemx یک پروژه جدید میسازیم و پایه ای که قرار است روی آن نوشته شود را خروجی تعریف میکنیم نیازی نیست تنظیمات خاصی را در آن انجام دهیم. پس میرویم gpio در stm32 یاد بگیریم
ساخت پروژه در STM32cubemx
برای این کار ما روی پایه مورد نظر راست کلیک میکنیم و گزینه GPIO_Output را انتخاب میکنیم .
حالا یک خروجی برای نرم افزار keil میگیریم ( طبق جلسه ساخت پروژه در stm32cubemx )
برنامه نویسی در محیط keil
حالا آن را در نرم افزار keil باز میکنیم ، از بین پوشه ها پوشه application/user/core را انتخاب میکنیم و فایل main.c را باز میکنیم :
این فایل برنامه اصلی شما هست و فایلی هست که توی اون باید توی اون برنامه اصلی خودتون رو بنویسید که به صورت کلی برنامه زیر در اون نوشته شده ( متن هایی که بین /* و */ نوشته شده اند فقط نمای ظاهری دارند و هیچ تاثیری در برنامه ندارند و فقط جهت راهنمایی نوشته شده اند به آن کامنت گفته میشود و آنها را میتوانید پاک کنید )
توضیحات تابع main :
در تصویر زیر تابع main بدون کامنت را میبینید :
توضیحات while
کد هایی که تا قبل از while نوشته شود فقط یکبار اجرا میشود مانند تعیین وضعیت gpio در stm32 ورودی و خروجی بودن پایه در میکروکنترلر که فقط یکبار کافی است آن تعریف شود
کد هایی که درون while نوشته میشود مکرر اجرا میشود و تا بینهایت ادامه پیدا میکند ، ما کد هایی که قرار است همیشه اجرا شود را در این بخش مینویسیم
ساخت چشمک زن با STM32
برای ساخت چشمک زن با STM32 باید ۴ مرحله را طی کنیم :
- مقدار پایه را ۱ کنیم ( مقدار ۱ به معنای روشن شدن پایه هست )
- ۱ ثانیه صبر کنیم
- مقدار پایه را ۰ کنیم ( مقدار ۰ به معنای خاموش شدن پایه هست )
- ۱ ثانیه صبر کنیم
تغییر وضعیت پایه
HAL_GPIO_WritePin( PORT , PIN , PinState );
در دستور بالا میتوانید وضعیت پایه را تغییر دهید ، تابع HAL_GPIO_WritePin تعداد ۳ عدد ورودی دریافت میکند :
PORT : پورتی که پایه مربوطه به آن وصل است برای مثال GPIOC یعنی پورت C
PIN : شماره پایه ای که مدنظر ماست برای مثال GPIO_PIN_13 یعنی پایه ۱۳ از پورت مد نظر
pinState : وضعیت پایه را مشخص کنید که میخواهید gpio در stm32 خاموش باشد یا روشن ۰ به معنای خاموش است و ۱ به معنای روشن
مثال :
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,0);
تاخیر در برنامه
HAL_Delay( time );
با دستور بالا میتوانید در برنامه تاخیر ایجاد کنید که یک ورودی دریافت میکند :
time : مدت زمانی که باید تاخیر کند ( برحسب میلی ثانیه – هر ثانیه ۱۰۰۰ میلی ثانیه است )
مثال :
HAL_Delay(1000);
کد نهایی:
#include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,0); HAL_Delay(500); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,1); HAL_Delay(500); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } 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(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } void Error_Handler(void) { __disable_irq(); while (1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif