STM32_Smart 보드에서 putty 터미널로 UART 출력하기

안태욱·2023년 2월 4일
0
post-thumbnail

1. UART PIN 설정

  • Mode : Asynchronous
  • Baud Rate : 115200 Bits/s

USART1에 위와 같이 설정을 진행하고 나면 우측 Pinout View에서 UART 통신에 사용될 핀이 표시된다.

  • PA09 : USART1_TX
  • PA10 : USART1_RX


2. 생성된 코드 분석

위와 같이 설정을 진행한 후 저장을 하면 이를 반영한 코드가 자동으로 생성된다.

main.c

#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을 초기화한다.

UART_HandleTypeDef

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에 정의된 구조체이다.

MX_USART1_UART_Init()

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() 보다 이후에 호출되어야 한다.


3. HAL UART 출력 코드 작성

#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를 사용해 문자열를 전송한다.


4. FTDI FT232RL 모듈과 보드 연결

FTDI FT232RL

UART 통신을 수행할 수 있는 모듈이다. usb mini 5핀 포트에는 데스크탑과 연결하고, 모듈의 TX핀은 보드의 RX(PA10), 모듈의 RX핀은 보드의 TX(PA09)와 연결한다. 그리고 GND도 연결하여 준다. 전원은 usb를 통해 공급받을 수 있다.

회로 연결

  • FT232RL RX     <-------->    STM32F103C8T6 TX (PA09)
  • FT232RL TX     <-------->    STM32F103C8T6 RX (PA10)

Ubuntu FTDI 모듈 연결 확인

$ sudo dmesg | tail -1 | grep ttyUSB0



5. putty 실행하기

통신 포트와 속도를 설정하고 연결한다.

이후 Cube IDE에서 빌드 후 실행하면 다음과 같이 문자열이 출력되는 것을 볼 수 있다.


6. printf() UART 출력으로 변경하기

/* 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로 출력되도록 변경할 수 있다.

profile
책 읽는 개발자

0개의 댓글