راه‌اندازی سون‌سگمنت توسط میکروکنترلر STM32F103C8

الکترونیک و رباتیک -> ماژول ها و سنسور ها 4074 2 کاربر آکادمی پارتینه

دراین آموزش نحوه‌ی راه‌اندازی نمایشگر توسط میکروکنترلر STM32 با استفاده از کامپایلر keil ورژن mdk5 و کتابخانه‌ی HAL مورد بررسی قرارگرفته است. کدنویسی و تنظیمات اولیه رجیسترها توسط نرم‌افزار کمکی STM32CubeMX انجام شده است. این نرم‌افزار که به اختصار به آن CubeMX -کیوب ام ایکس- نیز می‌گویند، به جهت ساده‌ترکردن و سرعت بخشیدن به برنامه نویسی میکروکنترلرهای STM32 ایجاد شده است. ایجاد پروژه و راه‌اندازی واحدهای مختلف میکروکنترلرهای STM32 به صورت گرافیکی از جمله مهم‌ترین وظایف این نرم‌افزار است. اگرچه کارکردهای دیگری چون تخمین میزان مصرف توان میکروکنترلر را نیز دارد.

بررسی ساختار سون‌سگمنت
یک سون‌سگمنت متشکل از هفت LED برای نمایش اعداد بین 0 تا 9 است. به منظور کاهش اتصالات LEDهای داخلی سون‌سگمنت کلیه‌ی پایه‌های آند یا کاتد آن‌ها به هم وصل می‌شوند. بنابراین سون‌سگمنت ها در دو نوع مختلف عرضه می‌شوند. به سون سگمنت های که پایه کاتدLED های داخلی به هم وصل هستند، سون سگمنت کاتد مشترک می‌گویند و به سون‌سگمنت‌های که پایه آند LED های داخلی به هم وصل هستند، سون سگمنت آند مشترک می‌گویند.

مواد اولیه :
# عنوان تعداد لینک
0 برد بورد 1 لینک خرید

مرحله 1 : اتصالات و دیاگرام مداری

همانطور که در تصویر بالا مشاهده می‌کنید، در این پروژه از هدر بورد STM32f103c8 استفاده شده است. پورت A این میکروکنترلر دارای 16 پین GPIO است که فقط 12عدد آن در دسترس هستند. 6 پین برای راه اندازی یک سون‌سگمنت تک‌رقمی کفایت می‌کند. به دلیل آند مشترک بودن سون سگمنت از ولتاژ میکروکنترلرSTM32 تغذیه می‌شود.

 

مرحله 2 : کدنویسی و تنظیمات نرم‌افزاری

همانطور که پیش‌تر اشاره شد، تنظیمات رجیسترهای میکروکنترلر در نرم‌افزار کمکی STM32CubeMX انجام می‌شود. 7 پین  از پورت A میکروکنترلر برای اتصال به 7 پین سون‌سگمنت، به عنوان خروجی تنظیم می‌شوند. خروجی تنظیمات نهایی در STM32CubeMX در تصویر نشان داده شده است. در نهایت از STM32CubeMX برای کامپایلر keil  خروجی گرفته و با استفاده از توابع و دستورات کتابخانه HAL برنامه‌ای را تنظیم می‌کنیم. به این صورت که در ابتدا یک مقدار 16 بیتی به پورت A میکروکنترلر STM32 ارسال می‌شود. این مقدار 16 بیتی عدد 0x003Fدر فرمت هگزا دسیمال است. معادل باینری آن  0000 0000 0011 1111 است. هر بیت این عدد باینری به یک پین پورت A اختصاص داده شده است. کمترین بیت از سمت راست شروع شده و بالاترین بیت سمت چپ است. چون تنها از 7 پین اول پورت A استفاده می‌کنیم. تنها مقداردهی به7 بیت اول برای روشن و خاموش کردن LEDهای سون‌سگمنت کافی است. بنابراین مقدار0111111 در هفت بیت اول پورت A میکروکنترلر STM32 نوشته می‌شود. بالاترین پین پورت A  پین ششم LOW و سایر پین‌ها High می‌شوند. پین g سون سگمنت خاموش و سایر پین‌ها روشن می‌شوند. و بدین ترتیب عدد صفر بر روی سون‌سگمنت نمایش داده می‌شود. سایر ارقام نیز به دنبال آن با اعمال تاخیر1 ثانیه به همین روش نمایش داده خواهند شد.

#include "main.h"
#include "stm32f1xx_hal.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
  /* 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();
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    GPIOA->ODR = 0x003F; //Displaying 0
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x0006; //Displaying 1
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x005B; //Displaying 2
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x004F; //Displaying 3
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x0066; //Displaying 4
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x006D; //Displaying 5
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x007D; //Displaying 6
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x0007; //Displaying 7
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x007F; //Displaying 8
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x006F; //Displaying 9
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x0077; //Displaying A
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x007C; //Displaying B
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x0039; //Displaying C
		HAL_Delay(1000);     //One second delay
    GPIOA->ODR = 0x005E; //Displaying D
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x0079; //Displaying E
		HAL_Delay(1000);     //One second delay
		GPIOA->ODR = 0x0071; //Displaying F
    HAL_Delay(1000);     //One second delay

  }

}

/**
  * @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);
}

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, a_Pin|b_Pin|c_Pin|d_Pin 
                          |e_Pin|f_Pin|g_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pins : a_Pin b_Pin c_Pin d_Pin 
                           e_Pin f_Pin g_Pin */
  GPIO_InitStruct.Pin = a_Pin|b_Pin|c_Pin|d_Pin 
                          |e_Pin|f_Pin|g_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void _Error_Handler(char *file, int line)
{
  while(1)
  {
  }
}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{ 

}
#endif /* USE_FULL_ASSERT */