Embedded/1. STM32, Arduino

STM32 - UART 구현 - (1)

잇(IT) 2024. 5. 27. 01:20

https://insoobaik.tistory.com/613

 

STM32 - UART 이론 - (2)

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

insoobaik.tistory.com

이론 내용을 바탕으로 UART를 구현해보겠다. 


Nucleo board에 MCU파트와 ST-Link 파트가 있는데 MCU의 PD8, 9는 ST-Link와 송수신을 담당하는 Pin인 것을 확인할 수 있다.

기본적으로 USART3을 사용하며 비동기식 방식을 사용한다.

 

UART 통신에 필요한 Buad Rate, Word Length 등 값을 설정할 수 있다.

 

UART를 Polling mode로 사용할지 Interrupt로 사용할지에 따라 체크를 해주면 된다.

DataSheet를 보게되면 USART3은 APB1 Bus를 사용하고 있고, Clock Configuration을 보게되면 42MHz를 사용하는 것을 볼 수 있다.(물론 Clock의 값은 변경할 수 있다.)


코드를 생성하게 되면

위와 같이 usart.h 헤더파일이 생성된 것을 확인할 수 있고, USART가 초기화 되는 것을 확인할 수 있다.

UI 화면에서 설정한 것들이 초기화 되는 것을 확인할 수 있다.

 

MUC에서 printf 함수를 사용하려면 표준 라이브러리의 출력 함수를 재정의하거나 printf가 사용하는 저수준의 출력 함수인 'write'를 사용해야 한다. printf 함수가 표준 출력으로 데이터를 출력하도록 설정되어 있지만, MCU에서는 표준 출력 장치가 없기 때문에 이 기능을 직접 구현해야 한다.

입출력을 위해 stdio.h 헤더 파일을 추가해주고

아래 syscalls.c 파일을 보게 되면 weak 처리된 함수들을 볼 수 있다. __attribute__((weak))처리된 것을 볼 수 있다. 이는 약한 심볼로 선언되어 사용자가 특정 함수를 재정의 할 수 있도록 할 때 유용하다.

 

read, write를 통해 입출력을 설정할 수 출력을 위해 write 함수를 재정의하여 사용해준다.

USER CODE BEGIN 4에 write 함수를 재정의 해주고 값 전송을 위해 UART_Transmit 함수를 작성해준다.

HAL_UART_Transmit 함수의 파라미터는 위와 같이 정의되어 있다.

 

&huart3 : HAL, uart3 3번 채널을 사용하겠다는 의미다.

ptr : 포인터의 pData 값을 전달한다.

len : Size UART 통신의 크기를 설정하는 것이다.

1000 : Timeout의 시간을 설정한다.

printf문을 사용한 코드를 작성하고

빌드 후 이상이 없으면 디버그 모드를 통해 elf 파일을 확인한다.

설정에 맞게 Serial Port Connection을 생성해준다. Serial Port는 장치 관리자를 통해 맞춰줘야한다.

우측 아래 Connect를 통해 연결해주고 상단에 Step into(함수 내부까지 실행되는 한 줄 한 줄 검사), Step over(함수 단위로 실행)를 통해 제어 흐름을 검사할 수 있다.

디버그 모드가 아닌 Run 시킨 후 UART_Test 통신을 확인하게 되면 좌측 하단처럼 정상적으로 1초마다 printf문을 출력하는 것을 확인할 수 있다.


두번째 방법으로 putchar를 사용하는 방법이 있다.

마찬가지로 정상적으로 printf문을 출력하는 것을 확인할 수 있다.

728x90