当前文档版本为 v0.4.1,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

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

目前可使用ZAL工具或quick build脚本进行编译和下载。

脚本位置: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 演示说明

  1. PAN1080 EVB板PIN脚接线说明:

    PAN1080 EVB板GPIO

    USB转串口工具

    P0_0_uart0_tx

    UART_RX

    P0_1_uart0_rx

    UART_TX

  2. 串口上位机发送”1234567890asdfghjklzxcvbnm\n”,可以看到接收界面也显示”1234567890asdfghjklzxcvbnm” 。本例程主要演示PAN1080 EVB板串口的收发功能。

    image

    UART FIFO 例程Log

5 开发说明

5.1 启用UART模块

在prj.conf文件中添加“CONFIG_UART=y”启用uart模块。

CONFIG_UART=y

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”,每次接收一个数据,直到出现换行符,停止接收。然后将接收的数据原封不动的发送给串口工具。