공부,일/atmega328P
atmel studio 에서 printf, scanf 사용
fromnothing1
2021. 8. 11. 13:08
uart 통신을 통한 putty 에 printf scanf 사용하기
atmel studio 에서 동작
#include <stdint.h>
#include <stdarg.h>
#include <stdio.h>
#define F_CPU 16000000
#include <util/delay.h>
#define UART_REG 0xC0
#define RXC 0x80
#define TXC 0x40
#define UDRE 0x20
enum
{
DATA_5BIT,
DATA_6BIT,
DATA_7BIT,
DATA_8BIT
};
#define CHAR_SZ_SHIFT 1
#define BAUD_2400 2400
#define BAUD_4800 4800
#define BAUD_9600 9600
#define BAUD_14400 14400
#define BAUD_19200 19200
#define BAUD_28800 28800
#define BAUD_38400 38400
#define BAUD_57600 57600
#define BAUD_115200 115200
#define RXEN 0x10
#define TXEN 0x08
#define UART_BAUDRATE BAUD_9600
struct uart //레지스터를 구조체로 정의한다.
{
uint8_t ucsr_a;
uint8_t ucsr_b;
uint8_t ucsr_c;
uint8_t reserved;
uint8_t ubrr_l;
uint8_t ubrr_h;
uint8_t udr; // 데이터 레지스터 (rx,tx)
};
volatile struct uart *const uart = (void*)UART_REG;
void uart_tx(char ch)
{
if (ch == '\n')
uart_tx('\r');
while (!(uart->ucsr_a & UDRE));
uart->udr = ch;
}
uint8_t uart_rx(void)
{
uint8_t data;
while (!(uart->ucsr_a & RXC));
data = uart->udr;
uart_tx(data);
return data;
}
static FILE OUTPUT = FDEV_SETUP_STREAM(uart_tx, NULL, _FDEV_SETUP_WRITE);
static FILE INTPUT = FDEV_SETUP_STREAM(NULL, uart_rx, _FDEV_SETUP_READ);
void uart_init(void)
{
uint16_t baudrate = F_CPU/UART_BAUDRATE/16 - 1;
uart->ucsr_b = 0x00;
uart->ucsr_a = 0x00;
uart->ucsr_c = 0b00000110; // 8bit data 설정
uart->ubrr_h = (baudrate >> 8) & 0xFF;
uart->ubrr_l = baudrate & 0xFF;
uart->ucsr_b = (RXEN | TXEN); // 송신 , 수신으로 모두 사용가능
stdout = &OUTPUT;
stdin = &INTPUT;
}
void loop(void)
{
int number;
printf("Enter favorite number %d: ", 100);
scanf("%d", &number);
printf("\nYour number is %d\n", number);
}
int main(void)
{
uart_init();
while (1)
{
loop();
}
}