안녕하세요. 오늘은 프로젝트 구조와 UART에 대해 알아보겠습니다
먼저 inc폴더와 source 폴더를 만들었습니다. inc폴더는 헤더파일을 넣고 source폴더에는 c파일을 넣었습니다.
각 모듈들은 하나의 헤더파일과 소스파일로 나눴습니다. def.h파일은 모든 파일이 공통적으로 사용하는 define을 넣어놨습니다.
MICROCHIP STUDIO에서 폴더를 빌드에 포함시키는법은 툴체인-> 디렉토리에서 추가하면 됩니다.
*UART
(레지스터에 대한 설명은 블로그내에 있는 다른 UART글 참고 바랍니다)
https://wowon.tistory.com/269
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 |