STM32 강좌

printf를 사용하여 USART로 문자열 출력

plainy 0 19,324 2017.05.26 13:49

제품 개발 중 현재 상태를 표시하기 위한 메시지 또는 디버깅 메시지를 출력하기 위해 printf를 사용합니다.

PC프로그램을 개발하는 경우 printf는 기본적으로 모니터에 출력됩니다. 

반면 STM32를 비롯한 Microcontroller에서는 USART를 사용하여 printf메시지를 출력하게 됩니다.

 

STM32에서 printf를 사용하여 USART에 메시지를 출력하는 방법에 관하여 알아보도록 하겠습니다.


USART출력을 테스트할 보드는 STM32L053RB Nucleo보드입니다.
Nucleo 보드는 VCP(Virtual COM Port)를 내장하고 있기 때문에 별도의 USB to Serial(RS232)케이블이 필요하지 않습니다.
fe4e22e6c4a4941e683a9be1380943c5_1495773108_2112.png



USART설정

STM32CubeMX에서 USART2를 Asynchronous로 설정합니다.

 

fe4e22e6c4a4941e683a9be1380943c5_1495773163_4515.png 

 

 

 

Configuration 탭에서 USART2의상세 설정을 확인합니다.

 

fe4e22e6c4a4941e683a9be1380943c5_1495773212_2404.png
 

 

printf문 사용하여 문자열 출력

printf를 사용하여 메시지를 출력합니다.

 

fe4e22e6c4a4941e683a9be1380943c5_1495773250_4721.png
 

보드에 다운로드 후 동작을 확인해 보면 USART에 아무런 메시지도 나오지 않는 것을 확인할 수 있습니다.

이는 IAR Compiler의 표준 출력이 Terminal I/O에 연결되어 있기 때문입니다.

일반적으로 PC의 경우 표준 출력은 모니터로, 표준 입력은 키보드로 연결되어 있습니다.

표준 스트림(Standard streams)에 관한 자세한 내용은 링크를 참고하시기 바랍니다.
fe4e22e6c4a4941e683a9be1380943c5_1495773357_3044.png


IAR에서 View->Terminal I/O를 열어 보면 printf에서 출력한 메시지가 나오는 것을 확인할 수 있습니다.
fe4e22e6c4a4941e683a9be1380943c5_1495773513_4808.png



표준 출력 변경

printf에서 출력한 메시지를 USART로 보내기 위해서는 표준 출력을 Terminal I/O에서 USART로 변경해 주어야 합니다.

IAR의 경우 printf함수는 Low level driver로 __write함수를 사용합니다.

 

fe4e22e6c4a4941e683a9be1380943c5_1495773621_4172.png

 

 

실제 printf에서 호출하는 함수를 확인해 보면 printf에서 다양한 함수를 수행한 후 최종적으로 __write함수를 호출하는 것을 확인할 수 있습니다.

 

 fe4e22e6c4a4941e683a9be1380943c5_1495773644_2505.png

 

아래는 동일한 내용을 Call Graph에서 확인한 결과입니다.

fe4e22e6c4a4941e683a9be1380943c5_1495773700_1474.png




따라서 __write함수를 재 작성하여 USART로 메시지를 출력하도록 변경해 주면 STM32의 USART Port로 메시지가 출력됩니다.

그러나 __write함수는 fflush함수로 Data를 모아서 출력하기 때문에 1Byte씩 문자를 출력하는 fputc를 수정하여 USART로 출력하도록 변경합니다.

 

 

 

fputc함수 작성으로 표준 출력 변경

fputc를 새로 작성합니다.

먼저 fputc의 함수 원형을 아래와 같이 작성합니다.

 

fe4e22e6c4a4941e683a9be1380943c5_1495774050_4389.png

 

fputc 함수를 작성합니다.

실제 STM32의 USART로 출력하는 함수를 추가합니다.

 

fe4e22e6c4a4941e683a9be1380943c5_1495774071_3972.png
 

위와 같이 fputc함수를 작성한 후 Call Graph를 확인하면 작성한 fputc함수가 호출되는 것을 확인할 수 있습니다.

 

fe4e22e6c4a4941e683a9be1380943c5_1495774133_591.png
 

 

프로그램을 실행하여 terminal 프로그램으로 USART의 출력을 확인할 수 있습니다.

fe4e22e6c4a4941e683a9be1380943c5_1495774158_7194.png
 

 

Comments

Category
글이 없습니다.
글이 없습니다.
Facebook Twitter GooglePlus KakaoStory NaverBand