Skip to Main Content

UART 驱动

结构体

波特率定义:

typedef enum {
UART_BAUDRATE_300 = 300,
UART_BAUDRATE_600 = 600,
UART_BAUDRATE_1200 = 1200,
UART_BAUDRATE_2400 = 2400,
UART_BAUDRATE_4800 = 4800,
UART_BAUDRATE_9600 = 9600,
UART_BAUDRATE_19200 = 19200,
UART_BAUDRATE_38400 = 38400,
UART_BAUDRATE_57600 = 57600,
UART_BAUDRATE_115200 = 115200,
UART_BAUDRATE_230400 = 230400,
UART_BAUDRATE_460800 = 460800,
UART_BAUDRATE_921600 = 921600,
UART_BAUDRATE_1500000 = 1500000,
UART_BAUDRATE_MAX,
} sunxi_serial_baudrate_t;

校验位定义

typedef enum {
UART_PARITY_NO = 0,
UART_PARITY_ODD,
UART_PARITY_EVEN,
} sunxi_serial_parity_t;

停止位定义

typedef enum {
UART_STOP_BIT_0 = 0,
UART_STOP_BIT_1,
} sunxi_serial_stop_bit_t;

数据长度定义

typedef enum {
UART_DLEN_5 = 0,
UART_DLEN_6,
UART_DLEN_7,
UART_DLEN_8,
} sunxi_serial_dlen_t;

UART 设备描述结构体

typedef struct {
uint32_t base; /* Base address of the serial device */
uint8_t id; /* ID of the serial device */
sunxi_serial_baudrate_t baud_rate; /* Baud rate configuration */
sunxi_serial_parity_t parity; /* Parity configuration */
sunxi_serial_stop_bit_t stop; /* Stop bit configuration */
sunxi_serial_dlen_t dlen; /* Data length configuration */
gpio_mux_t gpio_tx; /* GPIO pin for data transmission */
gpio_mux_t gpio_rx; /* GPIO pin for data reception */
} sunxi_serial_t;

API 接口

sunxi_serial_init

void sunxi_serial_init(sunxi_serial_t *uart);
  • 描述:使用指定的配置初始化 Sunxi 串口接口。
  • 参数:
    • uart:指向 Sunxi 串口接口结构的指针。

sunxi_serial_putc

void sunxi_serial_putc(void *arg, char c);
  • 描述:通过 Sunxi 串口接口发送一个字符。
  • 参数:
    • arg:指向 Sunxi 串口接口参数的指针。
    • c:要发送的字符。

sunxi_serial_tstc

int sunxi_serial_tstc(void *arg);
  • 描述:检查 Sunxi 串口接口是否有可读取的字符。
  • 参数:
    • arg:指向 Sunxi 串口接口参数的指针。
  • 返回值:如果有可用字符则返回1,否则返回0。

sunxi_serial_getc

char sunxi_serial_getc(void *arg);
  • 描述:从 Sunxi 串口接口读取一个字符。
  • 参数:
    • arg:指向 Sunxi 串口接口参数的指针。
  • 返回值:从接口读取的字符。

使用示例

简易模式

配置串口 0 为 115200-8-1,引脚 PB9 PB10,配置如下:

sunxi_serial_t uart_dbg = {
.base = SUNXI_UART0_BASE,
.id = 0,
.gpio_tx = {GPIO_PIN(GPIO_PORTB, 9), GPIO_PERIPH_MUX2},
.gpio_rx = {GPIO_PIN(GPIO_PORTB, 10), GPIO_PERIPH_MUX2},
};

使用示例:

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <types.h>
#include <log.h>
#include <common.h>

sunxi_serial_t uart_dbg = {
.base = SUNXI_UART0_BASE,
.id = 0,
.gpio_tx = {GPIO_PIN(GPIO_PORTB, 9), GPIO_PERIPH_MUX2},
.gpio_rx = {GPIO_PIN(GPIO_PORTB, 10), GPIO_PERIPH_MUX2},
};

int main(void) {
sunxi_serial_init(&uart_dbg);
printk_info("Hello World!\n");
abort();
return 0;
}

专业模式

配置串口 0 为 1500000-8-1,引脚 PB9 PB10,配置如下:

sunxi_serial_t uart_dbg_1m5 = {
.base = SUNXI_UART0_BASE,
.id = 0,
.baud_rate = UART_BAUDRATE_1500000,
.dlen = UART_DLEN_8,
.stop = UART_STOP_BIT_0,
.parity = UART_PARITY_NO,
.gpio_tx = {GPIO_PIN(GPIO_PORTB, 9), GPIO_PERIPH_MUX2},
.gpio_rx = {GPIO_PIN(GPIO_PORTB, 10), GPIO_PERIPH_MUX2},
};

使用示例:

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <types.h>
#include <log.h>
#include <common.h>

sunxi_serial_t uart_dbg_1m5 = {
.base = SUNXI_UART0_BASE,
.id = 0,
.baud_rate = UART_BAUDRATE_1500000,
.dlen = UART_DLEN_8,
.stop = UART_STOP_BIT_0,
.parity = UART_PARITY_NO,
.gpio_tx = {GPIO_PIN(GPIO_PORTB, 9), GPIO_PERIPH_MUX2},
.gpio_rx = {GPIO_PIN(GPIO_PORTB, 10), GPIO_PERIPH_MUX2},
};

int main(void) {
sunxi_serial_init(&uart_dbg_1m5);
printk_info("Hello World!\n");
abort();
return 0;
}