안녕하세요. 오늘은 프로젝트 구조와 UART에 대해 알아보겠습니다
먼저 inc폴더와 source 폴더를 만들었습니다. inc폴더는 헤더파일을 넣고 source폴더에는 c파일을 넣었습니다.
각 모듈들은 하나의 헤더파일과 소스파일로 나눴습니다. def.h파일은 모든 파일이 공통적으로 사용하는 define을 넣어놨습니다.

MICROCHIP STUDIO에서 폴더를 빌드에 포함시키는법은 툴체인-> 디렉토리에서 추가하면 됩니다.

*UART
(레지스터에 대한 설명은 블로그내에 있는 다른 UART글 참고 바랍니다)
https://wowon.tistory.com/269
UART통신 알아보기
안녕하세요. 오늘은 UART통신에 대해 알아보겠습니다. UART통신은 전송(TX)/수신(RX) 핀이 각각있고 핀이 HIGH / LOW로 변하면서 통신을 합니다. 핀이 HIGH/LOW로 변하는 시간을 가지고 데이터를 판단합니
wowon.tistory.com
아트메가128 usart통신하기(1)
안녕하세요. 직렬통신인 usart통신을 해보겠습니다. 통신을 하는 이유는 장치간에 서로 통신을 하려고 하는건데요. usart는 유선,무선으로 사용할수 있습니다.유선을 사용하면 CP2102모듈을 사용하
wowon.tistory.com
void uartInit()
{
UCSR1A = 0x00;
UCSR1B = (1<<RXCIE1) | (1<<RXEN1) | (1<<TXEN1);
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
UBRR1H = 0;
UBRR1L = 8;
sei();
}
UART를 Init하는 코드입니다. RXCIE1, RXEN1은 이미 define으로 각각 자릿수가 선언된 것이므로 쉬프트연산을하고 사용을하면 레지스터세팅이 됩니다.
C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATmega_DFP\1.7.374\xc8\avr\include\avr
위의 경로의 iom32u4.h 파일에 헤더파일이 있고 기본적으로 프로젝트를 만들때 include 합니다

void uartWrite(uint8_t ch, uint8_t *p_data, uint32_t length)
{
uint32_t count = 0;
switch(ch)
{
case UART_CH1:
while(count <length)
{
while(!(UCSR1A&(1<<UDRE1)));
UDR1 = *p_data;
p_data++;
count++;
}
break;
}
}
void uartPrintf(uint8_t ch, const char *fmt, ...)
{
va_list arg;
char printf_buf[256];
int len;
switch(ch)
{
case UART_CH1:
va_start(arg,fmt);
len = vsnprintf(printf_buf,256,fmt,arg);
va_end(arg);
if(len>0)
{
uartWrite(ch, (uint8_t *)printf_buf,len);
}
break;
}
}
UART를 Write하는 코드입니다. uartPrintf함수는 일반적으로 사용하는 printf함수의 기능을 구현한 함수입니다.
uint8_t uartAvailable(uint8_t ch)
{
uint8_t ret = 0;
switch(ch)
{
case UART_CH1:
if(receive_buf)
{
ret = 1;
}
break;
}
return ret;
}
uint8_t uartRead(uint8_t ch)
{
uint8_t ret = 0;
switch(ch)
{
case UART_CH1:
ret = receive_buf;
receive_buf = 0;
break;
}
return ret;
}
ISR(USART1_RX_vect)
{
receive_buf = UDR1;
}
UART를 Read하는 코드와 Read한 버퍼에 데이터가있는지 확인하는 코드입니다.
#include "main.h"
void mainInit()
{
ledInit();
uartInit();
}
int main(void)
{
mainInit();
ledOn(LED_CH1);
while (1)
{
if(uartAvailable(UART_CH1))
{
ledToggle(LED_CH1);
uartPrintf(UART_CH1, "received : %c \n", uartRead(UART_CH1));
}
}
}
메인문입니다. UART를 수신하면 데이터를 표시해줍니다

키보드로 입력한대로 시리얼프로그램에 표시됩니다(테라텀 이용)
사용한 보드는 UART1을 사용하기 위해서는 별도의 UART JIG가 필요합니다. 해당 지그의 TX,RX는 MCU의 PD2(RX),PD3(TX) 에 연결해놨습니다.
ATMEGA32u4는 USB 인터페이스를 지원하기때문에 UART JIG를 사용하지않아도 UART통신을 할수있는데 그 기능은 나중에 알아보겠습니다.

소스코드(Commits: ADD UART interface )
https://github.com/yhunterr/ATMEGA32u4/commits/main/
'아트메가 > ATMEGA32U4 Breakout' 카테고리의 다른 글
ATMEGA32U4 breakout-보드 사용하기 6편(SSD1306) (0) | 2024.04.14 |
---|---|
ATMEGA32U4 breakout-보드 사용하기 5편(I2C) (1) | 2024.04.07 |
ATMEGA32U4 breakout-보드 사용하기 4편(CLI) (1) | 2024.04.04 |
ATMEGA32U4 breakout-보드 사용하기 3편(USB CDC) (0) | 2024.03.30 |
ATMEGA32U4 breakout-보드 사용하기 1편(avrdude사용) (4) | 2024.03.16 |