임베디드 시스템을 위한 SW 구조설계 5

2023. 4. 16. 14:39[Harman] 세미콘(semiconductor) 아카데미-반도체설계/임베디드 시스템을 위한 SW 구조설계

728x90

UART, RTC를 이용하여 Console창에서 원활히 통신이 되는지 확인하였다.


 

  • UART(Universal Asynchronous Receiver Transmitter)

UART (Universal Asynchronous Receiver Transmitter) = 비동기 모드로서 사용되는 시리얼통신

USART (Universal Synchronous Asynchronous Receiver Transmitter) = 동기모드로서 사용되는 시리얼통신

 

UART는 범용 비동기 송수신기의 약자로 직렬 데이터를 교환하는 간단한 2선식 프로토콜이다.

 

동기방식은 주기적인 클럭을 보내면, 이때 데이터도 같이 보내는 통신방식이다. 

비동기방식은 시간을 나누어 데이터를 보내는 통신방식이다. 

 

현재 우리가 사용하는 보드(NUCLEO-F411RE)는 보드내에 UART가 내장되어 있어 외부에 모듈을 연결하여 사용하지 않아도 된다.

회로도 USART / ioc파일의 핀 설정

UART 통신 순서는 

  1. sprintf()함수를 이용하여 문자열을 받는다 (조합)
  2. USART로 전송(Transmit) (버퍼에 문자열을 로딩)
  3. 디버거를 통해 PC로 전송한다.
  4. STM32CubeIDE를 통해 Console로 전송

UART 통신을 할 때, printf()함수가 아닌 sprintf()함수를 이용하여 문자열을 입력하는데,

printf("문자열", 변수);
sprintf(주소, "문자열", 변수);

 

printf() = 출력하는 곳이 모니터로 고정되어 있다 (전달인자가 기본적으로 2개)

sprintf() = 주소에 버퍼를 써주면 그 버퍼에 값을 출력한다. (메모리에 해당 값을 써준다 / 전달인자가 3개)

의 구성으로 되어있다. printf는 모니터에만 출력을 하지만, sprintf는 버퍼데이터를 메모리상에 만들어 그곳에 전달할 내용을 담아두기 때문에 sprintf를 이용하도록 한다.

 

ex)

char str_buf[100] = {"",};
int hor = 24;
int min = 60;
int sec = 60;

sprintf(str_buf, "%d : %d : %d", hor, min, sec);

str_buf[100]의 해당 버퍼에 시(hor), 분(min), 초(sec)값을 넣고 싶으면 sprintf함수를 이용하여 입력한다 -> "hor값 : min값 : sec값" 이

위의 형태로 str_buf의 메모리에 입력된다. 

 

해당 sprintf함수 또한 stm32의 헤더파일로 존재한다.

표준 입출력 헤더파일(stdio.h)에 sprintf함수 존재

먼저 USART통신을 하기 위해  System core - USART2로 들어가 Mode = Asynchronous로 설정한다. 

그 후 PC와 연결하기 위해 Command Shell Console에서 새로운 시리얼 포트를 추가하도록 한다.

Command Shell Console

연결하려는 PC와 보드(F411RE)간의 Baud Rate, Data Size, Stop Bits가 전부 맞아야 원활한 통신이 가능하다.

 

Baud Rate 보내는 쪽(TX)와 받는 쪽(RX)에서 데이터를 보내는 속도

115200Bits/s 는 1초에 115200번 나누어 신호를 보낸다고 보면된다.

만약 9600Bits/s로 한다면 데이터를 보내는 시간이 115200Bits/s보다 느려 디버깅 하는데 시간이 많이걸릴 수 있고, 이것으로 병목현상이 발생할 수 있다.
Word Length 한번 보낼 때 몇비트를 보내겠는지 나타내는 비트
parity 오류를 검출하는 용도로 사용되는 비트
Stop Bits 비트의 끝을 나타내는 비트

Baud Rate = 115200 / 11 = 10472 => 10kb의 전송속도를 가지는 것을 알 수 있다.

 

Serial port는 장치 관리자에서 현재 우리가 사용하는 컴퓨터 시리얼 포트 번호를 찾아 번호에 맞게 선택하도록 한다.

시리얼 포트 번호
TEST_UART Console창

해당 창이 뜨는 것으로 현재 컴퓨터와 보드(NUCLEO-F411RE)가 연결되어 있는 상태이다. 컴퓨터에서 데이터를 전송하면 Console창에서 출력 결과가 나오게 된다.

 

UART는 FIFO구조로 버퍼가 존재한다.

해당 함수에서 UART2의 설정값이 정의되어 있는 것을 볼 수 있다.


더보기

UART는 CPU에서 나온 병렬 데이터를 직렬 데이터로 바꾸어 전송하는 하드웨어이다.  이 직렬 데이터의 전송은 송신선(TX)과 수신선(RX)이 각각 따로 있기 때문에 데이터를 양방향으로 동시에 전송할 수 있다. 이를 전이중(Full Duplex)통신이라고 한다.

 

통신에서의 비동기는 전송 데이터를 클록이라는 특정 신호에 맞춰서 전송하지 않는다는 뜻. UART는 송신부와 수신부의 통신속도인 Baud Rate를 일치시켜서 전송하는 비동기 통신방식이다.

 

전이중 통신 / 반이중 통신

 

  • RTC (Real Time Clock)

RTC를 사용하기 위해 System core - RTC에서 Activate 시켜준다. 해당 부분을 활성화 하면 RTC의 초기 클럭 수를 설정할 수 있다.

Activate Clock Source = RTC 클럭 활성화

Activate Calendar = RTC의 알람 기능 활성화

Activate Calendar를 활성화하면 해당부분에서 시간을 설정할 수 있다.

 

RTC는 구조체 형식으로 정의되어 있고, RTC_TimeTypeDef, RTC_DateTypeDef의 두개의 구조체에서 우리가 Calendar에 설정한 값을 불러와 사용할 수 있다.

RTC_TimeTypeDef / RTC_DateTypeDef