공부,일/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();
	}
}