[STM32] UART

pikamon·2020년 12월 29일
1

STM32

목록 보기
3/12
post-thumbnail

본 글은 STM32F769I MCU를 기준으로 작성되었습니다.
세부적인 내용은 제품군마다 조금씩 다를 수 있습니다.


1. UART란

UART란 Universal Asynchromous Receiver/Transmitter의 약자로, 두 칩 간에 데이터를 주고 받기 위한 시리얼 통신 프로토콜 중 하나이다. 기본적으로 2개의 라인을 사용한다.

2. 예제

PC와 보드 사이에 UART 통신을 이용하여 데이터를 송수신해보자.

STM32F769I-DISC1 보드는 USB micro-B 5핀 케이블을 이용하여 PC와 UART 통신이 가능하다. 디버깅용 ST/LINK(CN16) 단자에 케이블을 꽂으면 된다.

USART1의 TX, RX 라인은 각각 PA9, PA10 핀에 AF로 붙어있다. 해당 핀을 USART를 위한 핀으로 활성화해주면 된다.

아래 그림을 보면 USART1이 APB2에 묶여있는 듯하니, APB2 클럭을 활성화시켜주자.

1. Configuration

Pinout & Configuration 에 들어가서 USART1을 Asynchronous로 활성화한다.

ioc 파일을 저장하면 해당 설정에 맞는 코드가 자동으로 생성된다.
baudrate는 디폴트 115200으로 설정되며, 임의로 변경할 수 있다.

2. 코드 작성

보낸 데이터를 다시 반환하는 루프백 코드를 만들어보자.

초기화 및 main 코드는 아래와 같다.

#include "main.h"

UART_HandleTypeDef huart1;

void SystemClock_Config(void)
{
	RCC_OscInitTypeDef RCC_OscInitStruct = { 0, };
	RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0, };

	__HAL_RCC_PWR_CLK_ENABLE();
	__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
	RCC_OscInitStruct.HSIState = RCC_HSI_ON;
	RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
	RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
	RCC_OscInitStruct.PLL.PLLM = 8;
	RCC_OscInitStruct.PLL.PLLN = 192;
	RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
	RCC_OscInitStruct.PLL.PLLQ = 4;
	RCC_OscInitStruct.PLL.PLLR = 2;
	HAL_RCC_OscConfig(&RCC_OscInitStruct);

	RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK2;
	RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
	RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
	HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
}

static void MX_USART1_UART_Init(void)
{
	huart1.Instance = USART1;
	huart1.Init.BaudRate = 115200;
	huart1.Init.WordLength = UART_WORDLENGTH_8B;
	huart1.Init.StopBits = UART_STOPBITS_1;
	huart1.Init.Parity = UART_PARITY_NONE;
	huart1.Init.Mode = UART_MODE_TX_RX;
	huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	huart1.Init.OverSampling = UART_OVERSAMPLING_16;
	huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
	huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
	HAL_UART_Init(&huart1);
}

static void MX_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = { 0, };

	__HAL_RCC_GPIOA_CLK_ENABLE();

	// Initialize USART1
	GPIO_InitStruct.Pin =  GPIO_PIN_10 | GPIO_PIN_9;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

int main(void)
{
	HAL_Init();
	MX_GPIO_Init();
	MX_USART1_UART_Init();

	HAL_StatusTypeDef recvStat;
	unsigned char data[10];

	while (1)
	{
		recvStat = HAL_UART_Receive(&huart1, data, 1, 100);
		if (recvStat == HAL_OK)
		{
			HAL_UART_Transmit(&huart1, data, 1, 100);
		}
	}
}

void Error_Handler(void)
{

}

3. 빌드 및 실행 결과

Ctrl + B 를 통해 빌드하면 정상 빌드되는 것을 볼 수 있다.

실제 타겟 보드에 올려서 실행해보자.

F11 을 누르면 창이 디버그 창으로 변경되며, Resume 버튼을 누르면 멈춤 없이 실행된다.

보드와 PC를 USB 5핀 케이블로 연결하고, 터미널 프로그램을 실행한다.
알맞은 COM포트를 오픈하고 baudrate를 115200으로 설정한 후 키보드를 입력한다.

그러면 입력한 내용이 그대로 루프백되어 터미널에 출력되는 것을 볼 수 있다.

profile
개발자입니당 *^^* 깃허브 https://github.com/pikamonvvs

0개의 댓글