아트메가/ATMEGA32U4 Breakout

ATMEGA32U4 breakout-보드 사용하기 2편(프로젝트 구조&UART)

원원 2024. 3. 17. 20:09

안녕하세요. 오늘은 프로젝트 구조와 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

https://wowon.tistory.com/75

 

아트메가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/