K230 UART API参考

K230 UART API参考#

k230串口说明#

K230 内部集成了五个 UART(通用异步收发传输器)硬件模块,其中rtsmart系统占用一个串口,其他串口可以供用户使用。使用串口时需要确保对应管脚PAD(iomux配置)为串口功能,iomux也叫fpioa请参考文档。

串口驱动代码说明:

串口代码路径

说明

src/rtsmart/rtsmart/kernel/bsp/maix3/drivers/interdrv/uart/drv_uart.c

rtsmart系统使用串口的驱动

src/rtsmart/rtsmart/kernel/bsp/maix3/drivers/interdrv/uart_canaan/drv_uart.c

k230串口驱动

串口驱动相关的配置说明:

配置

说明

RT_USING_UART_CANAAN_1

使能串口1,make rtsmart-menuconfig

RT_USING_UART_CANAAN_2

使能串口2,make rtsmart-menuconfig

RT_USING_UART_CANAAN_3

使能串口3,make rtsmart-menuconfig

RT_USING_UART_CANAAN_4

使能串口4,make rtsmart-menuconfig

RT_CONSOLE_DEVICE_NAME

rtsmart使用的串口,make rtsmart-menuconfig

RTT_CONSOLE_ID

rtsmart使用的串口号,make menuconfig

串口api#

示例代码

串口对的设备名字是uart0 uart1 uart2 uart3 uart4,支持标准的 posix文件操作接口如下,具体使用请参考rtthread官网

int open(const char *file, int flags, ...);
int close(int d);
ssize_t read(int fd, void *buf, size_t len);
ssize_t write(int fd, const void *buf, size_t len);
int select( int nfds,fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

ioctl控制API#

int ioctl(int fildes, int cmd, ...)

支持的cmd,及cmd对应参数定义如下:

cmd

参数

说明

IOC_SET_BAUDRATE

struct uart_configure *

设置串口波特率等参数

struct uart_configure 结构体定义及接口示例代码如下:

#define IOC_SET_BAUDRATE            _IOW('U', 0x40, int)

struct uart_configure
{
    rt_uint32_t baud_rate;

    rt_uint32_t data_bits               :4;
    rt_uint32_t stop_bits               :2;
    rt_uint32_t parity                  :2;
    rt_uint32_t fifo_lenth              :2;
    rt_uint32_t auto_flow               :1;
    rt_uint32_t reserved                :21;
};

typedef enum _uart_parity
{
    UART_PARITY_NONE,
    UART_PARITY_ODD,
    UART_PARITY_EVEN
} uart_parity_t;

typedef enum _uart_receive_trigger
{
    UART_RECEIVE_FIFO_1,
    UART_RECEIVE_FIFO_8,
    UART_RECEIVE_FIFO_16,
    UART_RECEIVE_FIFO_30,
} uart_receive_trigger_t;
struct uart_configure config = {
    .baud_rate = 9600,
    .data_bits = 8,
    .stop_bits = 1,
    .parity = UART_PARITY_NONE,
    .fifo_lenth = UART_RECEIVE_FIFO_16,
    .auto_flow = 0,
};

if (ioctl(fd, IOC_SET_BAUDRATE, &config)) {
    printf("ioctl failed!\n");
    close(fd);
    return 1;
}