:::: MENU ::::
Posts tagged with: printf

Nucleo 보드에서의 printf

임베디드 보드에서의 Hello World인 blink 테스트를 끝나면 printf를 찍기위해 UART를 연결하고 테스트를 한다. Nucleo 보드에서도 마찬가지로 작업을 하는데, 회로도를 보면 아두이노 핀 호환 컨넥터의 TX, RX핀에 연결이 되어있다. 하지만 자세히 회로도를 보면 default 연결은 이 핀들이 아니라 ST-Link칩에 연결이 되어 있다. 즉 UART2의 경우 ST-Link를 통해서 USB 컨넥터에 연결이되고 virtual COM port로 잡힌다. 매뉴얼에 보면 다음과 같이 나온다.

The USART2 interface available on PA2 and PA3 of the STM32 microcontroller can be connected to ST-LINK MCU, ST morpho connector or to Arduino connector. The choice can be changed by setting the related solder bridges. By default the USART2 communication between the target STM32 and ST-LINK MCU is enabled, in order to support virtual COM port for MbedTM (SB13 and SB14 ON, SB62 and SB63 OFF). If the communication between the target STM32 PA2 (D1) or PA3 (D0) and shield or extension board is required, SB62 and SB63 should be ON, SB13 and SB14 should be OFF. In such case it is possible to connect another USART to ST-LINK MCU using flying wires between ST morpho connector and CN3.

따라서 아두이노 핀 호환핀에 연결을 하려면 점퍼 설정을 다시해야 하는데, printf를 위해서라면 virtual COM port를 사용하면 되니 그럴 필요는 없다.

관련 코드


SDCC putchar 버그 수정

지난번 포스팅때 8051 무료 컴파일러인 SDCC를 소개했었고, 이를 이용해서 W7100 TCP loopback 코드까지 만들어 봤었다.
이미 그때도 printf가 잘 안되어서 이상하다고 했었는데, 이번에 telnet 코드를 포팅하면서 문제를 해결했다.
문제는 SDCC 컴파일러가 제대로 C 코드를 ASM으로 변환을 해주지 못하는게 원인… 역시 무료 컴파일러라서 그런가???

void putchar (char c) 
{
  SBUF = c;
  while(!TI);
  TI = 0;
}

위 putchar 함수가 어셈으로 변환된 코드를 보니 TI = 0 을 CLR TI 로 변환을 하지 않네요.
그래서 다음과 같이 inline assembler를 사용해서 수정을 하니 잘 동작을 합니다.

void putchar (char c) 
{
 SBUF = c;
 while(!TI);
__asm 
 clr TI
__endasm;
}

W7100A에 telnet server code를 SDCC로 포팅한 코드로 첨부.

cfile29.uf.181ED1344DE5F44423398E.zip