ATmega328PB USART example code
본 글은 ATmega328PB USART 드라이버 소스를 싣고 있다.
uart를 이용한 디버그 메세지 출력이나, 다른 디바이스와의 통신에도 사용할 수
있다.
USART_Init을 호출하여 baudrate를 설정한 후, USART_Read,USART_Write,USART_Rx,
USART_Tx의 함수를 사용하여 데이터를 읽고 쓰면된다.
[소스 코드]
#define F_CPU 8000000UL
//#define F_CPU 16000000UL
#include <math.h>
#include <stdlib.h>
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define usart_waittime_ms 100
void USART_Init(unsigned int baudrate)
{
/**/
unsigned int ubrr = (((F_CPU /
(baudrate * 16UL))) - 1);
/*Set baud rate */
UBRR0H = (unsigned
char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B =
(1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop
bit */
UCSR0C =
(1<<USBS0)|(3<<UCSZ00);
}
int USART_Tx(char data, int time_out_ms)
{
int tick = 0;
do
{
if(UCSR0A & (1<<UDRE0))
{
UDR0 = data;
return 0;
}
_delay_ms(1);
tick++;
} while (tick < time_out_ms);
return -1;
}
char USART_Rx(int time_out_ms)
{
int tick = 0;
if(UCSR0A & (1<<RXC0))
{
return UDR0;
}
do
{
if(UCSR0A & (1<<RXC0))
{
return UDR0;
}
if(time_out_ms == 0)
{
return 0;
}
_delay_ms(1);
tick++;
} while (tick < time_out_ms);
return 0;
}
int USART_Write( char *data, int len )
{
int i = 0;
if(!data) return 0;
for(i = 0; i<len;i++)
{
if(USART_Tx(data[i],usart_waittime_ms) < 0)
{
return i;
}
}
return len;
}
int USART_Read(char *data, int len, int wait_time_out)
{
int rx_len = 0;
if(!data || len <= 0)
{
return 0;
}
for(rx_len = 0;
rx_len<len;rx_len++)
{
char rx = USART_Rx(wait_time_out);
if(rx == 0)
{
break;
}
data[rx_len] = rx;
rx_len++;
}
return rx_len;
}
[관련 포스트]
댓글
댓글 쓰기