'atmega128 uart'에 해당되는 글 1건

  1. 2009.10.20 avr 에서 printf 사용하기 (2)
#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 구차니

댓글을 달아 주세요

  1. 112

    잘보고 갑니다`

    2009.11.04 04:22 신고 [ ADDR : EDIT/ DEL : REPLY ]