USART1에 위와 같이 설정을 진행하고 나면 우측 Pinout View에서 UART 통신에 사용될 핀이 표시된다.
위와 같이 설정을 진행한 후 저장을 하면 이를 반영한 코드가 자동으로 생성된다.
#include "main.h"
static void MX_USART1_UART_Init(void)
UART_HandleTypeDef huart1;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
while(1) {
...
}
}
전역변수로 사용자 정의 자료형 UART_HandleTypeDef 자료형을 선언하였다. 이후 main() 함수에서는 Hardware Abstraction Layer와 System Clock을 초기화 한 이후 UART1을 초기화한다.
typedef struct __UART_HandleTypeDef
{
USART_TypeDef *Instance;
UART_InitTypeDef Init;
uint8_t *pTxBuffPtr;
uint16_t TxXferSize;
__IO uint16_t TxXferCount;
uint8_t *pRxBuffPtr;
uint16_t RxXferSize;
__IO uint16_t RxXferCount;
__IO HAL_UART_RxTypeTypeDef ReceptionType;
DMA_HandleTypeDef *hdmatx;
DMA_HandleTypeDef *hdmarx;
HAL_LockTypeDef Lock;
__IO HAL_UART_StateTypeDef gState;
__IO HAL_UART_StateTypeDef RxState;
__IO uint32_t ErrorCode;
} UART_HandleTypeDef;
stm32f1xx_hal_uart.h에 정의된 구조체이다.
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;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
}
1. UART PIN 설정
에서 설정한 대로 huart1을 초기화한다. 이후 HAL_UART_Init(&huart)를 호출한다. 내부적으로 HAL 을 사용하기 때문에 해당 함수는 HAL_Init() 보다 이후에 호출되어야 한다.
#include "main.h"
UART_HandleTypeDef huart1;
int main(void) {
... // Init
char str[20] = "Hello World!\r\n";
while(1) {
HAL_UART_Transmit(&huart1, str, strlen(str), 1000);
HAL_Delay(1000);
}
}
HAL API를 사용해 문자열를 전송한다.
UART 통신을 수행할 수 있는 모듈이다. usb mini 5핀 포트에는 데스크탑과 연결하고, 모듈의 TX핀은 보드의 RX(PA10), 모듈의 RX핀은 보드의 TX(PA09)와 연결한다. 그리고 GND도 연결하여 준다. 전원은 usb를 통해 공급받을 수 있다.
$ sudo dmesg | tail -1 | grep ttyUSB0
통신 포트와 속도를 설정하고 연결한다.
이후 Cube IDE에서 빌드 후 실행하면 다음과 같이 문자열이 출력되는 것을 볼 수 있다.
/* main.c */
int _write(int file, char *p, int len) {
HAL_UART_Transmit(&huart1, (uint8_t *)p, len, 10);
return len;
}
int main(void) {
... // Init
char str[20] = "Hello World!\r\n";
while(1) {
printf("PRINTF TEST : %s", str);
HAL_Delay(1000);
}
}
_write()
함수를 오버라이드하고 내부에서 HAL_UART_Transmit()
를 호출하여 printf()
를 호출하면 UART로 출력되도록 변경할 수 있다.