STM32 르네사스 보드를 활용하여 UART 예제를 굴려보자.
모델: NUCLEO-L073RZ
툴: CubeMX, CubeIDE
CubeMX와 CubeIDE는 설치되어있다는 것으로 가정하고 시작한다.

CubeMX는 GUI로 보드 초기 세팅을 도와주는 툴이다. 이 툴로 먼저 세팅 후에 시작하도록 하겠다.
CubeMX를 켜고 보드에 적혀있는 L073RZ를 검색해주었다.
사용중인 보드는 NUCLEO라는 개발 보드이고, Board 부분에 NUCLEO가 쓰여있는 것을 선택해주었다.

선택해주면 해당 보드가 나온다.
특별히 다른 것을 할건 없으니 다음.

Default로 설정하고 넘어간다.

다음으로 넘어가면 Pinmap을 GUI로 설정할 수 있다.
UART는 보드 default로 세팅되어 있는 모습을 볼 수 있다.
PA2 - USART_TX
PA3 - USART_RX
이번 예제에서는 UART는 USB연결로 사용할 예정인데, 위의 UART가 USB쪽으로도 연결이 된다. PC에서 연결만 되어있으면 된다.

왼쪽의 Connectivity 부분을 보면 USART2가 켜있는 것을 보고 있다.
USART는 Universal Synchronous and Asynchronous Receiver/Transmitter로, Synchronous와 Asynchronous를 모두 지원한다.
UART는 Asynchronous이므로 Mode가 Asynchronous인지 확인하고, Basic Parameters의 기본 값들을 확인해주자.

탭에서 Project Manager을 선택하고 Project Name 과 Toolchain/IDE 을 설정하자.
Project Name 은 몇가지 안되는 character만 빼고 설정하면 된다.
Toolchain/IDE 는 CubeIDE를 사용할 예정이므로 CubeIDE로 바꿔주자.
그리고 오른쪽 위의 GENERATE CODE를 누르면 프로젝트와 코드가 생성된다.
UART 통신을 위해서는 송신부와 수신부가 필요하다.
마침 putty라는 프로그램이 있고, Serial 통신을 지원하므로 활용해보자.

장치관리자에서 COM5에 연결되어 있는 것을 확인했다.

putty에서
1. Connection type을 Seiral로 설정하고
2. Serial line을 COM5로 설정해주고
3. Speed를 초기 세팅된 Baud rate인 115200로 설정해준다.
그럼 아무것도 없는 Serial monitor가 나온다.
<ProjectName>/Core/src/main.c 위치에서 편집을 하면 된다.
line25에 보면 include를 하는 부분이 있다. CubeIDE는 Codegenerator에 의해 코드가 자동 작성되기 때문에 USER CODE BEGIN처럼 쓰여있는 부분에 코드를 추가해주어야 나중에 수정했을 때 코드가 유지된다.
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"
/* USER CODE END Includes */
문자열을 위한 string.h와 입출력을 위한 stdio.h를 include 해주었다.

main문에서 USART2를 Init 해주는 부분도 있다.
UART로 송신부터 해보자.
송신은 HAL에 만들어져 있는 HAL_StatusTypeDef HAL_UART_Transmit(huart, pData, Size, Timeout)을 활용할 수 있다.
문서 링크
/* USER CODE BEGIN 2 */
uint8_t buffer[256];
sprintf((char *)buffer, "Hello, World!\n");
HAL_UART_Transmit(&huart2, buffer, strlen((char *)buffer), 100);
int count = 0;
/* USER CODE END 2 */
buffer를 만들고 Hello, World!를 출력한다.

그럼 putty의 모니터에서 출력이 되는 것을 볼 수 있다.
/* USER CODE BEGIN WHILE */
while (1)
{
sprintf((char *)buffer, "[%d] Hello! \n", ++count);
HAL_UART_Transmit(&huart2, buffer, strlen((char *)buffer), 100);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
다음은 while문에서 지속적으로 전송한다.

커서가 \n을 Line feed로만 전송하기 때문에 줄바꿈 위치가 출력 바로 아래이다. putty에서 CR+LF로 인식하게 하거나 CR도 보내주게 하면 된다. 그러나 귀찮으니 패스
수신도 어렵지 않다.
수신은 HAL_UART_Receive(huart, pData, Size, Timeout) 함수를 사용하면 된다.
문서 링크
/* USER CODE BEGIN 2 */
uint8_t buffer[256];
HAL_StatusTypeDef serial_status;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
serial_status = HAL_UART_Receive(&huart2, buffer, 1, 100);
if (serial_status == HAL_OK) {
HAL_UART_Transmit(&huart2, buffer, 1, 100);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
HAL_UART_Receive() 함수의 return값을 저장하기 위한 serial_status를 선언해주었다.
HAL_UART_Receive()로 huart2에서 값을 받아주고 받은 값을 echo처럼 다시 UART로 돌려주었다.

abcdefghi를 적었고, 그대로 돌려주어 시리얼 모니터에 들어오는 것을 볼 수 있다.