개발 IDE : ESP IDF (on vscode)
개발 보드 : Lolin D32
0. 설명
ESP32에는 3개의 UART 채널이 있다. (UART0, UART1, UART2)
보통 UART0이 기본 UART 포트로 디버깅, 시리얼모니터 연결 등에 사용된다.
예를 들어 아두이노에서 Serial.begin()과 같은 함수를 사용해서 시리얼 모니터에 문자를 출력하면 uart0 채널을 사용한 것이다.
1. 코드
2. 코드설명
#include "driver/uart.h"
uart 관련 api include
uart_config_t uart_config = {
.baud_rate = 115200,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
};
uart 헤더파일을 살펴보면 uart_config_t라는 구조체가 선언되어 있는데. 여기서 uart 기본 설정들을 세팅할 수 있다.
위 코드를 보면 baud rate는 115200, 데이터비트는 8비트, 패리티 X, stop bit1로 설정을 한 것을 볼 수 있다.
flow_ctrl은 hardware flow control mode라고 추가 핀들을 사용해 보다 안정적으로 데이터 송수신을 하게끔 설정하는 것 같다. 사용하려면 추가적으로 핀을 사용해야 하는 듯.
사용 안 할 거니 위와 같이 DISABLE
uart_param_config(UART_NUM_0, &uart_config);
위 함수는 아까 uart_config_t에서 설정한 값들을 핸들러로 보내주는 함수다.
uart0 채널을 사용하니 당연히 UART_NUM_0.
uart_driver_install(UART_NUM_0, 1024, 0, 0, NULL, 0);
ESP32의 uart 드라이버를 설치 및 초기화하는 함수이다. uart를 사용하려면 반드시 호출되어야 한다.
파라미터는 순서대로
uart채널, 수신 버퍼 크기, 송신 버퍼 크기, uart포트에서 발생하는 event를 처리하는 queue 크기, event queue 핸들, 인터럽트 우선순위 및 플래그
void uart_task() {
const char* message = "hello world!\n";
while(1) {
uart_write_bytes(UART_NUM_0, message, strlen(message));
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
uart_write_bytes() 함수를 사용해 수신을 할 수 있다.
파라미터들은 uart0 채널을 사용하니 UART_NUM_0, 보낼 데이터, 데이터 길이다.
xTaskCreate(uart_task, "uart_task", 2048, NULL, 10, NULL); // UART 출력 태스크 생성
메인 함수에 위와 같은 함수가 선언되어 있는 것을 볼 수 있는데, 이는 freeRTOS를 이용해 여러 tasks를 수행할 때, 멀티태스킹을 할 수 있게끔 구현해 놓은 함수다. 지금 예제에서는 굳이 할 필요는 없지만..
그냥 메인함수에 uart_write_bytes() 함수 넣어도 잘 작동된다.
'MCU > esp32' 카테고리의 다른 글
[ESP-IDF] WiFi (0) | 2024.12.31 |
---|---|
[ESP-IDF] GPIO (0) | 2024.11.13 |
[ESP-IDF] 프로젝트 생성 (0) | 2024.11.13 |
[ESP IDF] ninja: error: loading 'build.ninja (1) | 2024.11.12 |
[Arduino] esp8266 mqtt 프로토콜 (0) | 2023.03.10 |