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;
}

[관련 포스트]

댓글

이 블로그의 인기 게시물

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

python winsound를 이용한 윈도우 환경에서 소리 재생 예제

mkfs.fat Device or resource busy 에러 해결법

간단한 cfar 알고리즘에 대해

Embedded Linux USB Ethernet Gadget 사용하기