embeded/AVR (ATmega,ATtiny)2009. 10. 20. 22:27
#include "stdio.h"

static int uart_putchar(char c, FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
                                         _FDEV_SETUP_WRITE);

static int
uart_putchar(char c, FILE *stream)
{
  if (c == '\n')
    uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
  return 0;
}

int
main(void)
{
  init_uart();
  stdout = &mystdout;
  printf("Hello, world!\n");

  return 0;
}
winavr의 설명에 의하면 위의 예제가 printf를 사용하기 위한 초기화라고 나와있다.
(일단 설명서는 잘 읽어야 제맛)

위의 예제는 범용적인 것이고,
실제로 적용하기 위해서는 두부분을 수정해야 한다.

 loop_until_bit_is_set(UCSRA, UDRE);
 UDR = c;

초기화해준 포트에 따라서

UART0를 했다면 UCSR0A / UDR0
UART1을 했다면 UCSR1A / UDR1

로 수정을 해주면된다.


UDRE는 선언상, 비트플래그의 순서로 배열되어 있으므로
굳이 UDRE0 / UDRE1 로 수정해주지 않아도 이상은 없었다.

참고로 stdio.h를 포함하면 3KB 정도 크기가 증가한다(ELF 기준)
"사본"은 아래 소스에서 printf 관련을 전부 삭제한것이다.


atmega128 에서 uart0 를 115200-N-8-1로 16MHz 클럭에서 초기화한 뒤 printf() 하는 예제

Posted by 구차니