nRF52840 UART 통신 가이드
UART(Universal Asynchronous Receiver/Transmitter)는 디바이스 간에 비동기적인 시리얼 통신을 제공하는 하드웨어 인터페이스와 프로토콜입니다. UART는 송신(TX)과 수신(RX) 핀을 통해 데이터를 주고받으며, 통신 속도는 Baud rate(초당 신호 요소의 수)로 설정됩니다. 일반적으로 UART는 저속 통신 방식으로 알려져 있지만, Flow Control을 활용해 데이터 흐름을 제어함으로써 고속 통신을 구현할 수 있습니다.
이 가이드는 nRF52 SDK 환경에서 UART 모듈을 설정하고 사용하는 방법을 설명합니다.
1. UART 모듈 준비
1.1. SDK 설정 파일 수정 (sdk_config.h)
UART 모듈을 사용하기 위해 sdk_config.h 파일에서 관련 설정을 활성화해야 합니다. nRF52 SDK에서는 CMSIS Configuration Wizard를 사용하여 설정을 쉽게 관리할 수 있습니다.
설정 방법:
- Project Items 창에서 sdk_config.h 파일을 우클릭하고 CMSIS Configuration Wizard를 선택합니다.
- CMSIS Configurator - sdk_config.h 창에서 아래 항목들을 찾아 설정값을 변경합니다
#define NRFX_UART_ENABLED 1
#define UART_ENABLED 1
#define UART_EASY_DMA_SUPPORT 0
#define UART0_ENABLED 1
#define APP_FIFO_ENABLED 1
#define APP_UART_ENABLED 1
#define APP_UART_DRIVER_INSTANCE 0
이 설정들은 UART 모듈을 활성화하고, FIFO 버퍼 지원을 추가하며, UART0 인스턴스를 사용하도록 설정합니다.
2. nRF Library 파일 추가
UART를 사용하기 위해서는 필요한 라이브러리 파일을 프로젝트에 추가해야 합니다. Project Items 창의 nRF_Libraries 폴더를 우클릭하고 Add Existing File... 을 선택하여 아래 파일들을 추가합니다.
.\components\libraries\uart\app_uart_fifo.c
.\components\libraries\fifo\app_fifo.c
3. nRF Driver 파일 추가
마찬가지로, 드라이버 파일도 추가해야 합니다. 라이브러리 추가와 동일한 방법으로 아래 파일들을 프로젝트에 추가합니다.
.\modules\nrfx\drivers\src\nrfx_uart.c
.\integration\nrfx\legacy\nrf_drv_uart.c
4. UART 드라이버 초기화
APP_UART_FIFO_INIT 매크로는 nrf_drv_uart_init() 함수를 통해 UART 드라이버를 초기화하고, TX/RX 데이터를 FIFO 버퍼로 관리합니다.
초기화 코드 예시
#define EX_RX_PIN_NUMBER NRF_GPIO_PIN_MAP(0,8)
#define EX_TX_PIN_NUMBER NRF_GPIO_PIN_MAP(0,6)
#define EX_CTS_PIN_NUMBER 0xFFFFFFFF
#define EX_RTS_PIN_NUMBER 0xFFFFFFFF
#define EX_UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */
#define EX_UART_RX_BUF_SIZE 256 /**< UART RX buffer size. */
void aika_uart_evt_handle(app_uart_evt_t * pxEvent);
int aika_uart_init(void)
{
uint32_t err_code;
app_uart_comm_params_t comm_params =
{
.rx_pin_no = EX_RX_PIN_NUMBER,
.tx_pin_no = EX_TX_PIN_NUMBER,
.rts_pin_no = EX_RTS_PIN_NUMBER,
.cts_pin_no = EX_CTS_PIN_NUMBER,
.flow_control = APP_UART_FLOW_CONTROL_DISABLED,
.use_parity = false,
#if defined (UART_PRESENT)
.baud_rate = NRF_UART_BAUDRATE_115200
#else
.baud_rate = NRF_UARTE_BAUDRATE_115200
#endif
};
APP_UART_FIFO_INIT(&comm_params,
EX_UART_RX_BUF_SIZE,
EX_UART_TX_BUF_SIZE,
aika_uart_evt_handle,
APP_IRQ_PRIORITY_LOWEST,
err_code);
}
4.1. 주요 설정 항목
- TX/RX 핀: TX(송신)과 RX(수신) 핀 번호를 설정합니다.
- Flow Control: Flow control을 사용하지 않으므로 APP_UART_FLOW_CONTROL_DISABLED로 설정합니다.
- Baud Rate: 통신 속도는 NRF_UARTE_BAUDRATE_115200로 설정합니다.
- Buffer 크기: TX와 RX 버퍼의 크기는 각각 256 바이트로 설정됩니다.
5. UART Event 처리
UART 이벤트 핸들러 함수에서는 데이터 수신과 예외 상황 처리 등을 담당합니다. 이벤트 핸들러는 통신 중 발생할 수 있는 다양한 이벤트를 처리하며, 안정적인 통신을 보장합니다.
5.1. 이벤트 처리 루틴 예시
uint8_t g_rec_data_array[11];
void show_uart_data(void)
{
int i = 0;
for(i = 0; i < 10; i++)
NRF_LOG_INFO("%x", g_rec_data_array[i]);
}
void akia_uart_evt_handle(app_uart_evt_t * pxEvent)
{
static uint8_t index = 0;
ret_code_t err_code;
switch(pxEvent->evt_type)
{
case APP_UART_DATA_READY:
err_code = app_uart_get(&g_rec_data_array[index++]);
if(9 < index)
{
show_uart_data();
index = 0;
}
break;
case APP_UART_COMMUNICATION_ERROR:
break;
case APP_UART_FIFO_ERROR:
break;
case APP_UART_TX_EMPTY:
break;
default:
break;
}
}
void send_to_uart(void)
{
int i = 0;
uint8_t send_data = 0xA0;
for(i = 0; i < 10; i++)
app_uart_put(send_data++);
}
5.2. 오류 처리 및 예외 처리
APP_UART_COMMUNICATION_ERROR와 APP_UART_FIFO_ERROR 이벤트에서 오류 로그를 남기고, 필요한 경우 오류 복구 루틴을 추가하는 것이 중요합니다. 이를 통해 통신 오류 발생 시 적절한 대처가 가능합니다.
6. 문제 해결 및 성능 최적화
UART 통신이 정상적으로 이루어지지 않는 경우, 다음의 방법을 통해 문제를 진단할 수 있습니다.
6.1. Baud Rate 조정
Baud rate을 낮추어 문제를 진단하는 것이 일반적입니다. 예를 들어, Baud rate을 NRF_UART_BAUDRATE_9600으로 설정한 후 디버깅을 진행하고, 통신이 정상 동작하면 원하는 속도로 다시 설정할 수 있습니다.
6.2. GPIO 시그널 체크
UART 핀에서의 시그널을 체크하여 통신이 제대로 이루어지고 있는지 확인할 수 있습니다. 오실로스코프를 사용하여 TX/RX 핀의 파형을 분석하면 문제의 원인을 파악하는 데 도움이 됩니다.
6.3. Flow Control 사용
RTS/CTS 하드웨어 흐름 제어를 사용하여 데이터 전송을 보다 안정적으로 수행할 수 있습니다. Flow control을 활성화하면, 높은 Baud rate에서도 데이터 손실을 줄일 수 있습니다.
6.4. 전력 관리
UART 통신이 필요하지 않을 때 UART 모듈을 비활성화하거나, 저전력 모드로 전환할 수 있습니다. 이는 nRF52840의 전력 소모를 최소화하는 데 유용합니다.
7. 전력 관리 및 최적화
nRF52840은 저전력 특성을 가진 SoC이므로, UART 사용 시에도 전력 관리를 고려해야 합니다. 통신이 필요하지 않을 때는 UART 모듈을 비활성화하거나, 저전력 모드를 적극 활용하세요.
8. 결론
이 가이드는 UART 통신을 설정하고 사용하는 과정에서 발생할 수 있는 문제들을 효과적으로 해결할 수 있도록 돕기 위한 내용들로 구성되었습니다. 이를 통해 nRF52840에서 안정적이고 효율적인 UART 통신을 구현할 수 있을 것입니다.
'nRF52' 카테고리의 다른 글
nRF52840 TWI(I2C) Master 드라이버 활용하기 (0) | 2024.09.01 |
---|---|
nRF52840 TWI I2C 설정 가이드 (0) | 2024.08.31 |
nRF52840 DK 보드 GPIO 기본 설정부터 인터럽트 활용까지 (0) | 2024.08.29 |
nRF52 개발 환경 설정 가이드 (0) | 2024.08.27 |
nRF52 시리즈 개요 및 활용 가이드 (0) | 2024.08.26 |