티스토리 뷰
임베디드 시스템 개발에서 가급적 가장 먼저 해야 할 일은 디버깅을 위한 UART 설정일 것이다.
따라서 이번에는 두 개의 UART 를 설정하여 제대로 동작되는지 알아 볼 것이다.
UART1은 디버깅을 위하여 115200 bps 로 설정하여 PC와 연결하고 UART5은 GPS 모듈과 9600bps로 연결한다.
GPS 모듈에서 보내주는 데이터를 곧바로 디버거 UART로 보내어 PC에서 확인하는 방법을 통하여 두개의 UART 모듈이 각각 독립적으로 잘 동작되는지 확인해 보는 것이다.
이번 프로젝트에서 사용하는 GPS 모듈은 아래 그림에서 보여지는 것을 이용하였다.

두 UART를 설정하는 코드는 다음과 같이 만든다.
Uart cons{Uart::UART1};
Uart gps{Uart::UART5};
static void setup()
{
cons.baud(115200);
cons.console();
gps.baud(9600);
printf("\x1B[2J\x1B[1;1H");
printf("Embedded Program with C++. %s %s\n", __DATE__, __TIME__);
printf("Ref Clock : %lu\n", Rcc::ref_clock());
printf("Sys Clock : %lu\n", Rcc::sys_clock());
printf("Ahb Clock : %lu\n", Rcc::ahb_clock());
printf("APb2 Clock: %lu\n", Rcc::apb2_clock());
printf("APb1 Clock: %lu\n\n", Rcc::apb1_clock());
}
디버깅을 위하여 PC와 연결되는 UART1의 이름을 cons라고 정하였고 console()을 이용하여 stdin/stdout 으로 사용되도록 하였다. 원래 C++에서 stdout으로 출력하는데 사용하는 함수는 std::cout 이지만 임베디드 시스템에서는 C에서 사용하는 printf가 더 적절한것 같아서 printf를 이용하여 디버깅 메시지를 출력하도록 하였다. 위의 코드가 실행되면 RCC에서 설정한 각각의 clock 주파수가 출력된다. RCC 설정에서 설정한 값들이 제대로 적용되었는지 확인할 수 있다.
static void loop()
{
cons.putc(gps.getc());
}
위의 코드를 적용하면 GPS에서 출력되는 글자들이 곧바로 PC로 전달된다.

위의 결과를 통하여 RCC 클럭 설정값과 함께 GPS에서 보내주는 데이터가 PC로 제대로 전달되는지 확인 할 수 있다.
cons.putc(gps.getc()); 를 C++에서 제공하는 operator overloading 기능을 이용하여 다르게 표현해 보았다.
void Uart::operator << (Uart& rhs)
{
this->putc(rhs.getc());
}
static void loop()
{
cons << gps;
}
uart.cpp에 "<<" operator를 위와 같이 만든다음 loop() 함수에서 cons << gps; 를 적용하면 동일한 결과를 볼 수 있다.
굳이 이렇게까지 할 필요성이 있을지 모르겠지만 C에서는 할 수 없는 프로그램을 C++로 가능한 지 확인해 보는 차원에서 만들어 보았다.
'Embedded OOP' 카테고리의 다른 글
SPI (0) | 2020.05.03 |
---|---|
I2C (0) | 2020.05.01 |
System Clock 설정 (0) | 2020.04.15 |
GPIO In (0) | 2020.04.15 |
GPIO Out (0) | 2020.04.15 |