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;
}