안녕하세요, 소프트웨어 공장에 오신 것을 환영합니다. 오늘은 STM32F429ZI 보드에서 UART를 설정하고 사용하는 방법에 대해 자세히 설명해드리겠습니다. UART(Universal Asynchronous Receiver/Transmitter)는 직렬 통신을 위한 매우 중요한 프로토콜입니다. UART를 통해 보드와 다른 장치 간의 데이터 통신을 쉽게 할 수 있기 때문에, 임베디드 시스템 개발에서 빠질 수 없는 기술 중 하나입니다.
이번 포스팅에서는 다음과 같은 내용들을 다룰 예정입니다:
- UART의 개념 및 기본 작동 원리
- STM32F429ZI 보드에서 UART 설정하기 (STM32CubeIDE 사용)
- HAL 라이브러리를 이용한 UART 초기화와 데이터 전송
- 전체 코드 예제
이 포스트를 끝까지 읽으면 STM32F429ZI에서 UART를 설정하고 데이터를 송수신하는 방법을 이해하고, 실제로 사용할 수 있을 것입니다.
UART란?
UART(Universal Asynchronous Receiver/Transmitter)는 직렬 데이터 통신을 위한 하드웨어 프로토콜입니다. UART를 사용하면 두 장치 간에 직렬로 데이터를 송수신할 수 있으며, 간단하고 효율적인 방식으로 통신을 설정할 수 있습니다.
UART는 클럭 신호 없이도 데이터를 송수신할 수 있기 때문에 비동기 방식의 통신이라고 불리며, 데이터를 송신할 때 시작 비트와 정지 비트를 사용하여 수신 측이 데이터를 동기화할 수 있도록 합니다. 일반적인 UART 통신의 속도는 보통 baud rate(보 레이트)로 표현하며, 이는 1초 동안 전송되는 비트의 수를 나타냅니다.
UART는 송신(TX)와 수신(RX) 라인을 사용하여 데이터 통신을 합니다. STM32F429ZI와 같은 마이크로컨트롤러에서 UART를 사용하면 보드와 PC, 센서, 다른 MCU 등 다양한 장치 간의 통신을 손쉽게 구현할 수 있습니다.
STM32CubeIDE를 사용한 UART 설정
STM32CubeIDE는 STM32 마이크로컨트롤러 개발을 위한 강력한 통합 개발 환경(IDE)으로, STM32CubeMX의 기능이 내장되어 있어 GPIO와 주변 장치 설정을 손쉽게 할 수 있습니다. 이제 UART를 설정하는 방법을 단계별로 알아보겠습니다.
1. 새로운 프로젝트 생성
- STM32CubeIDE를 열고 File > New > STM32 Project를 선택합니다.
STM32F429ZI
마이크로컨트롤러를 선택한 후 Next를 클릭하여 프로젝트를 생성합니다.- 프로젝트 이름을 입력하고, Finish 버튼을 눌러 프로젝트를 생성합니다.
2. UART 설정하기
STM32CubeIDE에서 UART 설정은 매우 간단합니다. 다음은 UART 설정을 위해 따라야 할 단계들입니다:
- Pinout & Configuration 탭에서 Connectivity 아래의 USART3를 활성화합니다.
PD8
은 TX로,PD9
은 RX로 자동 설정됩니다.
- Configuration 탭에서 USART3을 선택하여 UART의 매개변수를 설정합니다.
- Baud Rate: 115200 (기본 통신 속도)
- Word Length: 8 Bits
- Parity: None
- Stop Bits: 1 Stop Bit
- Mode: TX/RX 활성화
UART의 설정이 완료되면, STM32CubeIDE는 자동으로 관련 GPIO 핀들을 설정해줍니다.
3. 코드 생성
이제 Project 메뉴에서 GENERATE CODE 버튼을 클릭하여 HAL 라이브러리를 사용한 코드 베이스를 생성합니다. 코드가 생성되면 main.c
파일에서 UART 통신을 위한 추가 작업을 진행할 수 있습니다.
HAL 라이브러리를 사용한 UART 초기화와 데이터 전송
이제 HAL 라이브러리를 사용하여 UART를 초기화하고 데이터를 송수신하는 방법에 대해 설명하겠습니다. STM32CubeIDE에서 자동으로 생성된 코드를 이용하여 UART를 설정하고, 데이터를 송신하는 예제를 작성해보겠습니다.
1. 필요한 헤더 파일 포함하기
main.c
파일 상단에 다음과 같은 헤더 파일들을 포함해야 합니다:
#include "stm32f4xx_hal.h"
#include "usart.h"
usart.h
파일은 STM32CubeIDE에서 자동 생성된 파일로, UART 설정과 관련된 함수들을 포함하고 있습니다.
2. UART 초기화 및 데이터 송신
다음은 UART를 초기화하고 데이터를 송신하는 코드입니다:
#include "main.h"
#include "stm32f4xx_hal.h"
#include "usart.h"
#include "gpio.h"
// 전송할 메시지
uint8_t txData[] = "Hello, UART Communication!\r\n";
int main(void)
{
// HAL 라이브러리 초기화
HAL_Init();
// 시스템 클럭 설정
SystemClock_Config();
// GPIO 초기화
MX_GPIO_Init();
// UART3 초기화
MX_USART3_UART_Init();
while (1)
{
// UART를 통해 데이터 전송
if (HAL_UART_Transmit(&huart3, txData, sizeof(txData), 1000) == HAL_OK)
{
// 데이터 전송 성공 시 LED 점등
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
HAL_Delay(500);
}
HAL_Delay(1000);
}
}
코드 설명
- HAL_Init(): HAL 라이브러리를 초기화합니다. HAL 라이브러리는 하드웨어를 제어하는 데 필요한 기본 함수를 제공합니다.
- SystemClock_Config(): 시스템 클럭을 설정하는 함수입니다. STM32 마이크로컨트롤러의 성능을 설정합니다.
- MX_GPIO_Init(): GPIO를 초기화합니다. 이 함수는 STM32CubeIDE에서 자동 생성된 GPIO 설정 코드를 호출합니다.
- MX_USART3_UART_Init(): UART3을 초기화하는 함수입니다. 설정은 STM32CubeIDE에서 구성한 값들을 기반으로 자동 생성됩니다.
- HAL_UART_Transmit():
huart3
를 사용하여txData
에 담긴 데이터를 전송합니다. 이 함수는 송신 데이터의 포인터, 전송할 바이트 수, 타임아웃 값을 매개변수로 받습니다. - HAL_GPIO_TogglePin(): LED 상태를 반전시킵니다. 데이터 전송 시 LED를 깜빡이도록 하여 UART의 작동 여부를 쉽게 확인할 수 있습니다.
전체 코드 예제
다음은 UART 설정 및 송신을 위한 전체 코드입니다:
#include "main.h"
#include "stm32f4xx_hal.h"
#include "usart.h"
#include "gpio.h"
// 전송할 메시지
uint8_t txData[] = "Hello, UART Communication!\r\n";
int main(void)
{
// HAL 라이브러리 초기화
HAL_Init();
// 시스템 클럭 설정
SystemClock_Config();
// GPIO 초기화
MX_GPIO_Init();
// UART3 초기화
MX_USART3_UART_Init();
while (1)
{
// UART를 통해 데이터 전송
if (HAL_UART_Transmit(&huart3, txData, sizeof(txData), 1000) == HAL_OK)
{
// 데이터 전송 성공 시 LED 점등
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
HAL_Delay(500);
}
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// HSE Oscillator 초기화
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 시스템 클럭 설정
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
주요 포인트 정리
- UART 초기화: UART3을 설정하고 송신(TX)과 수신(RX)을 활성화합니다.
- 데이터 송신:
HAL_UART_Transmit()
함수를 사용하여 간단한 메시지를 송신합니다. - GPIO 핀 토글: 데이터를 성공적으로 송신할 때마다 LED를 깜빡여 작동 여부를 쉽게 확인합니다.
결론
이번 포스팅에서는 STM32CubeIDE를 사용하여 STM32F429ZI에서 UART를 설정하고, HAL 라이브러리를 이용하여 데이터를 송수신하는 방법을 설명드렸습니다. UART는 임베디드 시스템에서 다른 장치와의 통신을 구현하는 데 중요한 역할을 하며, STM32CubeIDE와 HAL 라이브러리를 이용하면 손쉽게 설정하고 사용할 수 있습니다.
다음에는 좀 더 복잡한 통신 시나리오나, 인터럽트를 사용한 UART 구현에 대해 다룰 예정입니다. UART 통신에 대한 기본을 잘 이해하셨길 바라며, 더 많은 기능과 프로젝트에 도전해 보시길 바랍니다!
'STM32' 카테고리의 다른 글
STM32 SPI 설정 및 활용 가이드 (0) | 2024.11.25 |
---|---|
STM32 I2C 설정 및 센서 통신 예제 (0) | 2024.11.24 |
STM32 Timer 활용 - PWM 생성 및 타이머 인터럽트 설정 (0) | 2024.11.22 |
STM32 GPIO 기본 개념과 구조, LED 제어 (0) | 2024.11.21 |
STM32 시리즈 (0) | 2024.11.21 |