UART 驱动

[English]

概述

UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器是一种串行通信接口,支持全双工异步数据传输。BK7239N 支持多个 UART 通道,提供灵活的串行通信解决方案。

功能描述

  • 多通道支持:支持多个 UART 通道同时工作

  • 波特率配置:支持多种波特率设置,适应不同通信需求

  • 数据格式:支持 5-8 位数据位、1-2 位停止位、奇偶校验

  • 流控制:支持硬件流控制(RTS/CTS)和软件流控制

  • 中断支持:支持接收/发送中断,提高系统响应效率

  • DMA 支持:支持 DMA 传输,减少 CPU 负载

  • 软件 FIFO:内置软件 FIFO 缓冲,提高数据传输效率

  • 低功耗:支持低功耗模式,节省功耗

开发指引

  1. 初始化流程 - 调用 bk_uart_driver_init() 初始化 UART 驱动 - 配置 UART 参数(波特率、数据位、停止位、校验位等) - 调用 bk_uart_init() 初始化具体 UART 通道 - 根据需要配置中断和 DMA

  2. 基本使用 - 使用 bk_uart_write_bytes() 发送数据 - 使用 bk_uart_read_bytes() 接收数据 - 使用 bk_uart_write_string() 发送字符串

  3. 中断处理 - 注册接收中断回调函数 - 在中断中处理接收到的数据 - 根据需要启用/禁用中断

  4. DMA 使用 - 配置 DMA 通道 - 使用 DMA 进行大数据量传输 - 处理 DMA 传输完成中断

注意事项

  • 确保在调用其他 UART API 前先调用 bk_uart_driver_init()

  • 波特率设置需要与通信对方保持一致

  • 使用中断模式时注意中断优先级设置

  • DMA 传输时注意内存对齐和缓存一致性

  • 低功耗模式下 UART 可能被关闭,需要重新初始化

API 说明

主要 API 函数:

  • bk_uart_driver_init() - 初始化 UART 驱动

  • bk_uart_driver_deinit() - 反初始化 UART 驱动

  • bk_uart_init() - 初始化 UART 通道

  • bk_uart_deinit() - 反初始化 UART 通道

  • bk_uart_write_bytes() - 发送字节数据

  • bk_uart_read_bytes() - 接收字节数据

  • bk_uart_write_string() - 发送字符串

  • bk_uart_set_baud_rate() - 设置波特率

  • bk_uart_set_data_bits() - 设置数据位

  • bk_uart_set_stop_bits() - 设置停止位

  • bk_uart_set_parity() - 设置校验位

  • bk_uart_set_flow_ctrl() - 设置流控制

  • bk_uart_enable_rx_interrupt() - 启用接收中断

  • bk_uart_disable_rx_interrupt() - 禁用接收中断

  • bk_uart_register_rx_isr() - 注册接收中断服务函数

  • bk_uart_set_rx_threshold() - 设置接收阈值

  • bk_uart_set_rx_timeout() - 设置接收超时

  • bk_uart_get_tx_over_status() - 获取发送溢出状态

  • bk_uart_clear_tx_over_status() - 清除发送溢出状态

  • bk_uart_power_save_backup() - 低功耗备份

  • bk_uart_power_save_restore() - 低功耗恢复

示例代码

基本使用示例:

#include <driver/uart.h>

void uart_example(void)
{
    uart_config_t config = {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8BITS,
        .stop_bits = UART_STOP_1BITS,
        .parity = UART_PARITY_NONE,
        .flow_ctrl = UART_HW_FLOWCTRL_NONE,
        .source_clk = UART_SCLK_APB
    };

    // 初始化 UART 驱动
    bk_uart_driver_init();

    // 初始化 UART0
    bk_uart_init(UART_ID_0, &config);

    // 发送数据
    const char *msg = "Hello UART!\n";
    bk_uart_write_string(UART_ID_0, msg);

    // 接收数据
    uint8_t buffer[64];
    int len = bk_uart_read_bytes(UART_ID_0, buffer, sizeof(buffer), 1000);
    if (len > 0) {
        // 处理接收到的数据
    }
}

中断接收示例:

static void uart_rx_callback(uart_id_t id, void *param)
{
    uint8_t ch;
    while (bk_uart_read_bytes(id, &ch, 1, 0) > 0) {
        // 处理接收到的字符
        printf("Received: %c\n", ch);
    }
}

void uart_interrupt_example(void)
{
    // 注册接收中断回调
    bk_uart_register_rx_isr(UART_ID_0, uart_rx_callback, NULL);

    // 启用接收中断
    bk_uart_enable_rx_interrupt(UART_ID_0);
}

常见问题

  • 波特率不生效:确认 bk_uart_driver_init()bk_uart_init() 调用顺序,检查时钟源与分频是否支持该波特率

  • 接收丢数据:检查 RX 满阈值、接收超时设置,必要时开启硬件流控或 DMA/软件 FIFO

  • 回调未触发:确认已启用对应中断,并核对 ISR 注册是否成功、优先级设置是否合理

实战示例

  1. 中断接收(注册 RX ISR)

static void uart_rx_cb(uart_id_t id, void *param) {
    uint8_t ch;
    while (bk_uart_read_bytes(id, &ch, 1, 0) > 0) {
        // 处理接收到的数据
    }
}
bk_uart_register_rx_isr(UART_ID_1, (uart_isr_t)uart_rx_cb, NULL);
bk_uart_enable_rx_interrupt(UART_ID_1);

常见错误码说明

  • BK_ERR_UART_NOT_INIT:未调用 bk_uart_driver_init()

  • BK_ERR_UART_INVALID_ID:传入的 uart_id_t 非法或不支持

  • BK_ERR_UART_BAUD_RATE_NOT_SUPPORT:当前时钟配置下不支持该波特率

  • BK_ERR_UART_ID_NOT_INIT:未对具体通道调用 bk_uart_init()