Driver: UART FIFO¶
1 功能概述¶
本文主要介绍PAN1080 EVB板外设UART的使用。
2 环境要求¶
board: pan1080a_afld_evb
uart (option): 显示串口log
uart:USB转串口工具
Panchip Serial Assistant V0.0.006.exe
3 编译和烧录¶
项目位置:zephyr\samples_panchip\drivers\uart\uart_fifo
统一的配置、编译、下载工具正在开发中,当前可以使用脚本进行编译和下载。
脚本位置:quick_build_samples\drivers\uart_fifo.bat
。
打开脚本后默认会编译项目,编译完成时,可输入字符进行后续下载等操作:
Input the keyword to continue:
'b' build 编译项目
'r' make clean and rebuild 重新编译项目
'f' flash download 下载
'e' erase chip 擦除芯片
'o' open project by VS Code 打开 `VS Code`,可查看源码,执行编译下载等
others exit 退出
wait input:
4 演示说明¶
PAN1080 EVB板PIN脚接线说明:
PAN1080 EVB板GPIO
USB转串口工具
P0_0_uart0_tx
UART_RX
P0_1_uart0_rx
UART_TX
串口上位机发送”1234567890asdfghjklzxcvbnm\n”,可以看到接收界面也显示”1234567890asdfghjklzxcvbnm” 。本例程主要演示PAN1080 EVB板串口的收发功能。
5 开发说明¶
5.2 初始UART¶
const struct device *uart0 = DEVICE_DT_GET(DT_NODELABEL(uart0));
if (!device_is_ready(uart0)) {
printk("uart devices not ready\n");
return;
}
5.3 配置UART¶
#define BAUDRATE 115200
const struct uart_config uart_cfg = {
.baudrate = BAUDRATE,
.parity = UART_CFG_PARITY_NONE,
.stop_bits = UART_CFG_STOP_BITS_1,
.data_bits = UART_CFG_DATA_BITS_8,
.flow_ctrl = UART_CFG_FLOW_CTRL_NONE
};
配置串口的波特率、校验位、停止位、数据位和流控。
串口配置读取与设置:
uart_config_get(uart0, &uart_cfg_check);
if(uart_cfg_check.baudrate != BAUDRATE) {
uart_configure(uart0, &uart_cfg);
}
UART PIN脚配置:
&uart0 {
current-speed = <115200>;
pinctrl-0 = <&p4_4_uart0_tx &p4_3_uart0_rx>;
status = "okay";
};
配置P43和P44两个引脚为UART0功能。
5.4 UART中断回调和使能¶
中断回调注册:
uart_irq_callback_set(uart0, uart_fifo_callback);
使能UART TRX:
uart_irq_tx_enable(uart0);
uart_irq_rx_enable(uart0);
TX的逻辑处理:
static void tx_isr(const struct device *dev)
{
static uint8_t tx_index = 0;
int len;
if(tx_index >= data_len) {
uart_irq_tx_disable(dev);
uart_irq_rx_enable(dev);
tx_index = 0;
} else {
len = uart_fifo_fill(dev, fifo_data + tx_index, (data_len - tx_index));
tx_index += len;
if(tx_index >= BUFFER_SIze) {
tx_index = 0;
}
}
}
将tx的数据写到fifo中,直到所有的数据都写完,然后关闭tx,使能rx,等待数据接收。fifo的最大深度为16。
RX的逻辑处理:
static void rx_isr(const struct device *dev)
{
static uint8_t rx_index = 0;
uart_fifo_read(dev, fifo_data + rx_index, 1);
if ((fifo_data[rx_index] == '\n') || (fifo_data[rx_index] == '\r')) {
uart_irq_rx_disable(dev);
data_len = rx_index + 1;
rx_index = 0;
uart_irq_tx_enable(dev);
} else {
rx_index ++;
if(rx_index >= BUFFER_SIze) {
rx_index = 0;
}
}
}
将串口工具发过来的数据保存到“fifo_data”,每次接收一个数据,直到出现换行符,停止接收。然后将接收的数据原封不动的发送给串口工具。