AiPi-Eyes-S1是安信可开源团队专门为Ai-M61-32S设计的一款开发板,支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口,具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SPI、UART、I2C、I2S、PWM、GPDAC、GPADC、ACOMP 和 GPIO 等。
AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。
从零开始学习小安派:
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter, 通常称为 UART) 是一种异步收发传输器,提供了与外部设备进行全双工数据交换的灵活方式。BL616/BL618 共有 2 组 UART,配合 DMA 使用,可以实现高效的数据通信。
小安派的 UART 是全双工异步通讯,具有丰富的中断控制,DMA 传输、485 协议、10Mbps 波特率、LIN 总线协议等等特征。其有三个时钟源,分别是 XCK、160Mhz CLK 和 BCLK。UART 的控制器分为两个功能模块:发送器和接收器。
数据位长度可选 5 / 6 / 7 / 8 比特
#define UART_DATA_BITS_5 0
#define UART_DATA_BITS_6 1
#define UART_DATA_BITS_7 2
#define UART_DATA_BITS_8 3
#define UART_DATA_BITS_9 4
停止位长度可选 0.5 / 1 / 1.5 / 2 比特
#define UART_STOP_BITS_0_5 0
#define UART_STOP_BITS_1 1
#define UART_STOP_BITS_1_5 2
#define UART_STOP_BITS_2 3
支持 奇 / 偶 / 无 / 校验比特
#define UART_PARITY_NONE 0
#define UART_PARITY_ODD 1
#define UART_PARITY_EVEN 2
#define UART_PARITY_MARK 3
#define
UART_PARITY_SPACE 4
可配置 MSB / LSB 优先输出
#define UART_LSB_FIRST 0
#define UART_MSB_FIRST 1
1.struct bflb_uart_config_s
说明:uart 初始化配置结构体
struct bflb_uart_config_s {
uint32_t baudrate;
uint8_t direction;
uint8_t data_bits;
uint8_t stop_bits;
uint8_t parity;
uint8_t bit_order;
uint8_t flow_ctrl;
uint8_t tx_fifo_threshold;
uint8_t rx_fifo_threshold;
};
parameter | description |
baudrate | 波特率 |
direction | 方向 |
data_bits | data_bits |
stop_bits | 停止位 |
parity | 校验位 |
bit_orders | bit 先行方式 |
flow_ctrl | 流控 |
tx_fifo_threshold | 发送 fifo 中断触发阈值(大于阈值触发中断) |
rx_fifo_threshold | 接收 fifo 中断触发阈值(大于阈值触发中断) |
2.bflb_uart_init
说明: 初始化 uart。使用之前需要开启 uart ip 时钟、设置 uart 时钟源和分频值、选择 gpio 为 uart 中的一个功能。
void bflb_uart_init(struct bflb_device_s *dev, const struct bflb_uart_config_s *config);
parameter | description |
dev | 设备句柄 |
config | 配置项 |
3.bflb_uart_deinit
说明: 反初始化 uart。
void bflb_uart_deinit(struct bflb_device_s *dev);
parameter | description |
dev | 设备句柄 |
4.bflb_uart_link_txdma
说明: uart tx dma 使能开关。
void bflb_uart_link_txdma(struct bflb_device_s *dev, bool enable);
parameter | description |
dev | 设备句柄 |
enable | 是否使能 dma |
5.bflb_uart_link_rxdma
说明: uart rx dma 使能开关。
void bflb_uart_link_rxdma(struct bflb_device_s *dev, bool enable);
parameter | description |
dev | 设备句柄 |
设备句柄 | 是否使能 dma |
6.bflb_uart_putchar
说明: 通过 uart 阻塞式发送一个字符。
int bflb_uart_putchar(struct bflb_device_s *dev, int ch);
parameter | description
|
dev | 设备句柄 |
ch | 字符 |
7.bflb_uart_getchar
说明: 通过 uart 异步接收一个字符。
int bflb_uart_getchar(struct bflb_device_s *dev);
parameter | description |
dev | 设备句柄 |
return | 返回 -1 表示没有数据,返回其他表示接收的字符 |
8.bflb_uart_put
说明:通过 uart 轮询发送数据。
int bflb_uart_put(struct bflb_device_s *dev, uint8_t *data, uint32_t len);
parameter | parameter |
dev | 设备句柄 |
data | 数据指针 |
len | 数据长度 |
9.bflb_uart_put_block
说明:通过 uart 阻塞式发送数据。
int bflb_uart_put_block(struct bflb_device_s *dev, uint8_t *data, uint32_t len);
parameter | description |
dev | 设备句柄 |
data | 数据指针 |
len | 数据长度 |
10.bflb_uart_get
说明:通过 uart 异步阻塞接收数据。
int bflb_uart_get(struct bflb_device_s *dev, uint8_t *data, uint32_t len);
parameter | description |
dev | 设备句柄 |
data | 数据指针 |
len | 数据长度 |
11.bflb_uart_txready
说明: 查询 uart tx fifo 是否准备就绪,准备好才可以填充字符
bool bflb_uart_txready(struct bflb_device_s *dev);
parameter | description |
dev | 设备句柄 |
return | 为 true 表示就绪 |
12.bflb_uart_txempty
说明: 查询 uart tx fifo 是否为空。
bool bflb_uart_txempty(struct bflb_device_s *dev);
parameter | description |
dev | 设备句柄 |
return | 为 true 表示 fifo 已空,无法填充数据 |
13.bflb_uart_rxavailable
说明: 查询 uart rx 是否有数据。
bool bflb_uart_rxavailable(struct bflb_device_s *dev);
parameter | description |
dev | 设备句柄
|
return | 为 true 表示有数据,可以进行读取 |
14.bflb_uart_txint_mask
说明: uart tx fifo 阈值中断屏蔽开关,开启后超过设定阈值则触发中断。
void bflb_uart_txint_mask(struct bflb_device_s *dev, bool mask);
parameter | description |
dev | 设备句柄 |
mask | 是否屏蔽中断 |
15.bflb_uart_rxint_mask
说明: uart rx fifo 阈值中断和超时屏蔽开关,开启后超过设定阈值则或者超时则触发中断。
void bflb_uart_rxint_mask(struct bflb_device_s *dev, bool mask);
parameter | description |
dev | 设备句柄 |
mask | 是否屏蔽中断 |
16.bflb_uart_errint_mask
说明:uart 错误中断屏蔽开关。
void bflb_uart_errint_mask(struct bflb_device_s *dev, bool mask);
parameter | description |
dev | 设备句柄 |
mask | 是否屏蔽中断 |
17.bflb_uart_get_intstatus
说明: 获取 uart 中断标志。
uint32_t bflb_uart_get_intstatus(struct bflb_device_s *dev);
parameter | description |
dev | 设备句柄 |
retrun | 中断标志 |
返回的中断标志有以下选项:
#define UART_INTSTS_TX_END (1 << 0)
#define UART_INTSTS_RX_END (1 << 1)
#define UART_INTSTS_TX_FIFO (1 << 2)
#define UART_INTSTS_RX_FIFO (1 << 3)
#define UART_INTSTS_RTO (1 << 4)
#define UART_INTSTS_PCE (1 << 5)
#define UART_INTSTS_TX_FER (1 << 6)
#define UART_INTSTS_RX_FER (1 << 7)
#if !defined(BL602)
#define UART_INTSTS_RX_LSE (1 << 8)
#endif
#if !defined(BL602) && !defined(BL702)
#define UART_INTSTS_RX_BCR (1 << 9)
#define UART_INTSTS_RX_ADS (1 << 10)
#define UART_INTSTS_RX_AD5 (1 << 11)
#endif
18.bflb_uart_int_clear
说明: 清除 uart 中断标志。
void bflb_uart_int_clear(struct bflb_device_s *dev, uint32_t int_clear);
parameter | description |
dev | 设备句柄 |
int_clear | 清除值 |
清除值可填入以下参数:
#define UART_INTCLR_TX_END (1 << 0)
#define UART_INTCLR_RX_END (1 << 1)
#define UART_INTCLR_RTO (1 << 4)
#define UART_INTCLR_PCE (1 << 5)
#if !defined(BL602)
#define UART_INTCLR_RX_LSE (1 << 8)
#endif
#if !defined(BL602) && !defined(BL702)
#define UART_INTCLR_RX_BCR (1 << 9)
#define UART_INTCLR_RX_ADS (1 << 10)
#define UART_INTCLR_RX_AD5 (1 << 11)
#endif
19.bflb_uart_feature_control
说明:uart 其他特性相关控制,一般不常用。
int bflb_uart_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
parameter | description |
dev | 设备句柄 |
cmd | 控制字 |
arg | 控制参数 |
return | 为负表示不支持该命令 |
cmd 可以填入以下参数:
#define UART_CMD_SET_BAUD_RATE (0x01)
#define UART_CMD_SET_DATA_BITS (0x02)
#define UART_CMD_SET_STOP_BITS (0x03)
#define UART_CMD_SET_PARITY_BITS (0x04)
#define UART_CMD_CLR_TX_FIFO (0x05)
#define UART_CMD_CLR_RX_FIFO (0x06)
#define UART_CMD_SET_RTO_VALUE (0x07)
#define UART_CMD_SET_RTS_VALUE (0x08)
#define UART_CMD_GET_TX_FIFO_CNT (0x09)
#define UART_CMD_GET_RX_FIFO_CNT (0x0a)
#define UART_CMD_SET_AUTO_BAUD (0x0b)
#define UART_CMD_GET_AUTO_BAUD (0x0c)
#define UART_CMD_SET_BREAK_VALUE (0x0d)
#define UART_CMD_SET_TX_LIN_VALUE (0x0e)
#define UART_CMD_SET_RX_LIN_VALUE (0x0f)
#define UART_CMD_SET_TX_RX_EN (0x10)
#define UART_CMD_SET_TX_RS485_EN (0x11)
#define UART_CMD_SET_TX_RS485_POLARITY (0x12)
#define UART_CMD_SET_ABR_ALLOWABLE_ERROR (0x13)
#define UART_CMD_SET_SW_RTS_CONTROL (0x14)
#define UART_CMD_IR_CONFIG (0x15)
#define UART_CMD_SET_TX_FREERUN (0x16)
#define UART_CMD_SET_TX_END_INTERRUPT (0x17)
#define UART_CMD_SET_RX_END_INTERRUPT (0x18)
#define UART_CMD_SET_TX_TRANSFER_LEN (0x19)
#define UART_CMD_SET_RX_TRANSFER_LEN (0x20)
#define UART_CMD_SET_TX_EN (0x21)
#define UART_CMD_SET_BCR_END_INTERRUPT (0x22)
#define UART_CMD_GET_BCR_COUNT (0x23)