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:
data – uart_platform_data *data 传入串口配置信息指针,具体可以参考board/board_demo.c文件
- Returns:
0: 成功 非0:失败
-
int uart_init(const struct uart_platform_data *data)
uart_init,串口初始化, 支持DMA接收, 返回串口ID号
- Parameters:
data – uart_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
波特率
-
u8 id