UART

Overview

以 AC638N 为例,样机发送 uart_test_txbuf 缓存数据到 pc 串口助手, 然后将 pc 串口助手接收到数据复制发送到样机, pc 发送间隔10ms,包大小 64 字节以内,样机接收完检查 rx/tx 数据是否一样,打印成功或失败。提供 UART 的应用示例、工程配置、API 介绍和常见问题。

应用示例

  • UART 的具体源代码详见 sdk/bsp/AC638N/src/uart.c

  • uart.c 中参考示例如下:

    #include "asm/uart.h"
    
    static const struct uart_platform_data uart_config = {//配置串口信息
        .id         = 0xff,
        .tx_pin     = IO_PORTA_02,
        .rx_pin     = IO_PORTA_03,
        .baudrate   = 115200,
    };
    
    static volatile u8 uart_test_rx_flag = 0;
    static volatile u8 uart_test_tx_flag = 0;
    
    static u8 uart_test_rxbuf[64 + 16];
    static u8 uart_test_txbuf[64] __attribute__((aligned(4)));
    
    static void uart_loop_rx_handler(u8 *rxdata, u16 len){//接收完成回调函数
        memcpy(uart_test_rxbuf, rxdata, len);
        uart_test_rx_flag = 1;
    }
    
    static void loop_tx_callback(){//异步发送完成调用回调函数
        uart_test_tx_flag = 1;
    }
    
    void uart_loop_test()
    {
        int id = uart_init(&uart_config);//串口初始化
    
        uart_set_rx_irq_handler(id, uart_loop_rx_handler);//设置串口中断
    
        for (int i = 0; i < sizeof(uart_test_txbuf); i++) {//给发送buf赋值
            uart_test_txbuf[i] = i;
        }
    
        puts("---------sync dma tx test --------\n");
    
        for (int j = 0; j < 100; j++) {
            uart_test_rx_flag = 0;
            uart_tx_buf(id, uart_test_txbuf, sizeof(uart_test_txbuf));//发送buf
    
            while (1) {
                if (uart_test_rx_flag) {//等待接收完成标志位
                break;
                }
            }
            if (!memcmp(uart_test_rxbuf, uart_test_txbuf, sizeof(uart_test_txbuf))) {//对比发送buf和接收buf,测试100遍
                printf("sync loop test suss: %d\n", j);
                memset(uart_test_rxbuf, 0, sizeof(uart_test_rxbuf));
            } else {
                puts("sync loop test faild:\n");
                put_buf(uart_test_rxbuf, sizeof(uart_test_rxbuf));
                return;
            }
        }
    
        puts("---------async dma tx test --------\n");//同步发送测试完后,进行异步发送测试
    
        for (int j = 0; j < 100; j++) {
            uart_test_rx_flag = 0;
            uart_test_tx_flag = 0;
            uart_async_tx_buf(id, uart_test_txbuf, sizeof(uart_test_txbuf), loop_tx_callback);
    
            while (1) {
                if (uart_test_rx_flag && uart_test_tx_flag) {
                break;
                }
            }
            if (!memcmp(uart_test_rxbuf, uart_test_txbuf, sizeof(uart_test_txbuf))) {
                printf("async loop test suss: %d\n", j);
                memset(uart_test_rxbuf, 0, sizeof(uart_test_rxbuf));
            } else {
                puts("async loop test faild:\n");
                put_buf(uart_test_rxbuf, sizeof(uart_test_rxbuf));
                return;
            }
        }
    }
    

工程配置

  • sdk/apps/main.c 中函数 user_main() 添加如下工程代码:

    int user_main()
    {
        extern void uart_loop_test(void);
        uart_loop_test();
    }
    
  • PA2和PA3连接串口工具,PC会收到样机发送的数据,把PC收到的数据复制粘贴到串口工具发送框,定时10ms发送回样机,收发各100次,观察数据是否正常。

API参考

UART 常用相关 API 介绍,具体软件代码见 sdk/bsp/AC638N/src/uart.c

Functions

int debug_uart_init(const struct uart_platform_data *data)

debug_uart_init,调试串口初始化, id无效, 接收不支持DMA, 只能按byte接收

Parameters:

datauart_platform_data *data 传入串口配置信息指针,具体可以参考board/board_demo.c文件

Returns:

0: 成功 非0:失败

int uart_init(const struct uart_platform_data *data)

uart_init,串口初始化, 支持DMA接收, 返回串口ID号

Parameters:

datauart_platform_data * 传入串口配置信息指针地址,具体可以参考board/board_demo.c文件

Returns:

id 串口ID号

void uart_set_rx_irq_handler(int id, void (*handler)(u8*, u16))

uart_set_rx_irq_handler,设置接收中断处理函数, 此函数需要尽快将数据移走, 否则可能会挡住下次接收

Parameters:
  • id – 是串口ID号,

  • handler – 串口rx中断起了的时候回调的函数

void uart_tx_byte(int id, u8 byte)

uart_tx_bytei, 发送一个byte

Parameters:
  • id – 是串口ID号,

  • byte – 是要发送的字节

void uart_tx_buf(int id, u8 *txdata, u16 len)

uart_tx_buf,同步方式DMA发送批量数据

Parameters:
  • id – 是串口ID号

  • txdata – 要发送的buf

  • len – 发送长度

void uart_async_tx_buf(int id, u8 *txdata, u16 len, void (*callback)())

uart_async_tx_buf,异步方式DMA发送批量数据, 发送完成后回调callback函数

Parameters:
  • id – 是串口ID号

  • txdata – 要发送的buf

  • len – 发送长度

  • callback – 异步发送完buf之后调用函数

struct uart_platform_data
#include <uart.h>

串口配置信息

Public Members

u8 id

串口ID号, 0xff表示自动分配

u8 tx_pin

发送IO, 0xff表示不使能发送

u8 rx_pin

接收IO, 0xff表示不使能接收

u32 baudrate

波特率