ESP32 IDF 串口映射方法

ESP32 IDF 串口映射方法

修改方法:

在ESP32 IDF软件包中其实已经支持了printf函数在UART0 / UART1之间进行切换,只需要在Menuconfig 配置项中进行配置然后重新编译即可。

这里以ESP32的HelloWorldDemo为例进行说明:

1.编辑源码

打开 esp-idf\examples\get-started\hello_world Demo程序目录,输入 idf.py memuconfig 进入可视化配置项,修改如下目录配置项:

选择:Component config --> Common ESP-related

image-20210822173625289

其中UART TX on GPIO#UART RX on GPIO# 修改为自己需要的端口号。

image-20210822180120026

原理分析:

在BootLoader Console 中有以下代码,这也解释了 ESP32 IDF 的调试串口是在Bootloader中进行初始化的,因此在user_main中不需要在此进行初始化操作。

#ifdef CONFIG_ESP_CONSOLE_UART_NONE
void bootloader_console_init(void)
{
    esp_rom_install_channel_putc(1, NULL);
    esp_rom_install_channel_putc(2, NULL);
}
#endif // CONFIG_ESP_CONSOLE_UART_NONE

#ifdef CONFIG_ESP_CONSOLE_UART
void bootloader_console_init(void)
{
    const int uart_num = CONFIG_ESP_CONSOLE_UART_NUM;

#if !ESP_ROM_SUPPORT_MULTIPLE_UART
    /* esp_rom_install_channel_put is not available unless multiple UARTs are supported */
    esp_rom_install_uart_printf();
#else
    esp_rom_install_channel_putc(1, esp_rom_uart_putc);
#endif

    // Wait for UART FIFO to be empty.
    esp_rom_uart_tx_wait_idle(0);

#if CONFIG_ESP_CONSOLE_UART_CUSTOM
    // Some constants to make the following code less upper-case
    const int uart_tx_gpio = CONFIG_ESP_CONSOLE_UART_TX_GPIO;
    const int uart_rx_gpio = CONFIG_ESP_CONSOLE_UART_RX_GPIO;
    // Switch to the new UART (this just changes UART number used for esp_rom_printf in ROM code).
#if ESP_ROM_SUPPORT_MULTIPLE_UART
    esp_rom_uart_set_as_console(uart_num);
#endif
    // If console is attached to UART1 or if non-default pins are used,
    // need to reconfigure pins using GPIO matrix
    if (uart_num != 0 ||
            uart_tx_gpio != UART_NUM_0_TXD_DIRECT_GPIO_NUM ||
            uart_rx_gpio != UART_NUM_0_RXD_DIRECT_GPIO_NUM) {
        // Change default UART pins back to GPIOs
        gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_U0RXD_U, PIN_FUNC_GPIO);
        gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_U0TXD_U, PIN_FUNC_GPIO);
        // Route GPIO signals to/from pins
        const uint32_t tx_idx = uart_periph_signal[uart_num].tx_sig;
        const uint32_t rx_idx = uart_periph_signal[uart_num].rx_sig;
        PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[uart_rx_gpio]);
        esp_rom_gpio_pad_pullup_only(uart_rx_gpio);
        esp_rom_gpio_connect_out_signal(uart_tx_gpio, tx_idx, 0, 0);
        esp_rom_gpio_connect_in_signal(uart_rx_gpio, rx_idx, 0);
        // Enable the peripheral
        periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + uart_num);
    }
#endif // CONFIG_ESP_CONSOLE_UART_CUSTOM

    // Set configured UART console baud rate
    uint32_t clock_hz = rtc_clk_apb_freq_get();
#if ESP_ROM_UART_CLK_IS_XTAL
    clock_hz = UART_CLK_FREQ_ROM; // From esp32-s3 on, UART clock source is selected to XTAL in ROM
#endif
    esp_rom_uart_set_clock_baudrate(uart_num, clock_hz, CONFIG_ESP_CONSOLE_UART_BAUDRATE);
}
#endif // CONFIG_ESP_CONSOLE_UART

#ifdef CONFIG_ESP_CONSOLE_USB_CDC
/* Buffer for CDC data structures. No RX buffer allocated. */
static char s_usb_cdc_buf[ESP_ROM_CDC_ACM_WORK_BUF_MIN];

void bootloader_console_init(void)
{
#ifdef CONFIG_IDF_TARGET_ESP32S2
    /* ESP32-S2 specific patch to set the correct serial number in the descriptor.
     * Later chips don't need this.
     */
    rom_usb_cdc_set_descriptor_patch();
#endif

    esp_rom_uart_usb_acm_init(s_usb_cdc_buf, sizeof(s_usb_cdc_buf));
    esp_rom_uart_set_as_console(ESP_ROM_UART_USB);
    esp_rom_install_channel_putc(1, bootloader_console_write_char_usb);
}
#endif //CONFIG_ESP_CONSOLE_USB_CDC

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于 ESP32 IDF (ESP-IDF),您可以通过以下步骤设置和使用串口: 1. 在您的 ESP32 项目中,打开 `sdkconfig` 文件。 2. 搜索以下参数,并确保它们被正确设置: - `CONFIG_ESP_CONSOLE_UART_NUM`:设置将用作控制台的 UART 号码。 - `CONFIG_CONSOLE_UART_BAUDRATE`:设置控制台 UART 的波特率。 - `CONFIG_ESP_CONSOLE_UART_DEFAULT`:如果设置为 `y`,将使用控制台作为默认 UART。 - `CONFIG_UART_NUM_X`:根据您的需求,配置其他 UART 的数量(X 代表 UART 的编号)。 - `CONFIG_UART_X_BAUDRATE`:设置其他 UART 的波特率。 3. 在代码中通过 `uart_driver_install()` 函数初始化所需的 UART。 4. 使用 `uart_write_bytes()` 函数发送数据到串口。 5. 使用 `uart_read_bytes()` 函数从串口读取数据。 以下是一个简单的示例代码,演示如何在 ESP32 上使用串口: ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" #define UART_NUM UART_NUM_0 #define BUF_SIZE (1024) void uart_task(void *pvParameters) { uint8_t data[BUF_SIZE]; while (1) { int len = uart_read_bytes(UART_NUM, data, BUF_SIZE, 100 / portTICK_RATE_MS); if (len > 0) { printf("Received: %.*s\n", len, data); } } } void app_main() { 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_param_config(UART_NUM, &uart_config); uart_driver_install(UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 10, NULL, 0); xTaskCreate(uart_task, "uart_task", 2048, NULL, 10, NULL); } ``` 这是一个简单的 UART 接收任务,它将从 UART 0 接收数据,并将其打印到控制台。 请注意,这只是一个简单的示例代码,您可以根据您的需求进行修改。还可以使用其他函数来处理更多 UART 功能,例如错误处理和发送数据。 希望这能帮到您!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值