본문 바로가기

Embedded Programming (STM)/STM32F411RE

STM32 (9월 12일, STM32 입문 - (2))

1. LED 바를 이용하여 LED 바를 켰다 껐다를 반복하자.

1.1. 8개의 핀을 갖는 LED 바를 컨트롤하기 위해 STM32의 8개의 핀을 선택하여 출력으로 설정

  • STM32의 8개 핀을 다음과 같이 선택하여 GPIO_OUTPUT으로 설정하였다.
  • PA_5, PA_6, PA_7, PB_6, PC_7, PA_9, PA_8, PB_10 을 GPIO_OUTPUT으로 설정하였다,

 

 

1.2. HAL_GPIO_TogglePin 함수를 이용하여 각 핀의 값을 0.5초마다 Toggle되도록 설계한다.

  • HAL_GPIO_TogglePin 함수는 해당 핀의 값을 Toggle 시켜주는 함수이다.
  • HAL_GPIO_TogglePin 함수를 통해 0.5초마다 Toggle 시킴으로서 LED 바가 1초를 주기를 깜박이게 된다.
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)
  {
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6);
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_7);
	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_7);
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9);
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_10);

	HAL_Delay(500);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

 

 

1.3. 구현 

 

 

 

 

 

2. 구조체를 통해 LED 바를 제어하기

  • 위 코드를 통해서 알 수 있듯이 STM 32에서 각 포트의 핀들이 순서대로 정렬되어 있지 않고, 분산되어 있기 때문에 순차적으로 핀을 연결하기 위해서는 각각의 서로 다른 핀들을 사용해야 한다.
  • 하지만, 각각의 핀들을 하나 하나 제어하는 것은 비효율적이기 때문에, 이번에는 구조체를 이용하여 하나의 그룹으로 묶어 보도록 하겠다.

 

 

2.1. 구조체를 정의

  • PIN_TABLE 구조체는 GPIO PORT, GPIO PIN, LED On state, LED Off state를 맴버로 갖도록 설계했다.
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct {
	GPIO_TypeDef* p_gpio_port;
	uint16_t gpio_pin;
	GPIO_PinState onState;
	GPIO_PinState offState;

}PIN_TABLE;

/* USER CODE END PTD */

 

 

 

2.2. 구조체 초기화

  • LED 바를 제어하기 위해 다음과 같이 서로 다른 포트의 8개의 핀으로 초기화를 하였다.
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct {
	GPIO_TypeDef* p_gpio_port;
	uint16_t gpio_pin;
	GPIO_PinState onState;
	GPIO_PinState offState;

}PIN_TABLE;

PIN_TABLE pin_table [8] = {
		{GPIOA, GPIO_PIN_5, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOA, GPIO_PIN_6, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOA, GPIO_PIN_7, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_6, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOC, GPIO_PIN_7, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOA, GPIO_PIN_9, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOA, GPIO_PIN_8, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_10, GPIO_PIN_SET, GPIO_PIN_RESET},
};

/* USER CODE END PTD */

 

 

 

2.3. LED 바의 각각의 LED를 제어하는 사용자 정의 함수를 정의

  • 핀 번호 값을 Parameter로 받으면 해당 값에 해당하는 핀의 LED를 켰다 끄는 함수를 정의하였다.
/* USER CODE BEGIN PFP */

void led_on(uint8_t index) {
	HAL_GPIO_WritePin(pin_table[index].p_gpio_port, pin_table[index].gpio_pin, pin_table[index].onState);
}

void led_off(uint8_t index) {
	HAL_GPIO_WritePin(pin_table[index].p_gpio_port, pin_table[index].gpio_pin, pin_table[index].offState);
}

/* USER CODE END PFP */

 

 

 

 

2.4. 구조체와 반복문을 이용하여 LED 바를 제어하도록 설계

  • 이전 코드와 달리 구조체를 이용하여 서로 다른 포트더라도 하나의 묶음으로 묶음으로서 이제 반복문으로 제어 할 수 있게 되었다.
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)
  {
	  // LED ON & 0.5 delay
	  for(uint8_t i=0; i<8; i++) {
		  led_on(i);
		  HAL_Delay(500);
	  }


	  // LED OFF & 0.5s delay
	  for(uint8_t i=0; i<8; i++) {
		  led_off(i);
		  HAL_Delay(500);
	  }
	  /* USER CODE END WHILE */

	  /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

 

 

 

2.5. 구현 

 

'Embedded Programming (STM) > STM32F411RE' 카테고리의 다른 글

STM32 (9월 12일, STM32 입문 - (1))  (0) 2024.09.12