UART驱动包括两层:硬件访问层(HAL)和RT-Thread的适配层。
硬件访问层提供用于访问 UART 外设寄存器的基本 API。 有关详细信息,请参阅 UART HAL 的 API 文档。
适配层提供对 RT-Thread 驱动框架的支持。 用户可以使用 RT-Thread POSIX 驱动程序接口进行 UART 编程。 请参阅 RT-Thread 驱动程序的 API 文档。
主要功能包括:
- 多实例支持
- 支持UART波特率高达3Mbps
- 支持偶/奇/无奇偶校验,5/6/7/8/位数,1/2停止位
如果奇偶校验为奇偶校验,位数为8,芯片组需要设置为9 位,即使用第9 位作为奇偶校验
- 支持基于中断的 RX 和 TX
- RX 和 TX 均支持 DMA
驱动配置
UART 驱动程序可以使用 UART 外设的多个实例。 可以使用 menuconfig 工具为每个项目选择外设和 DMA 支持配置的实例,通常保存在 C 头文件中。 默认情况下,配置保存为 rtconfig.h。
以下示例显示了在一个项目头文件中定义的标志,该项目正在使用具有 RX DMA 支持的 uart1 和 uart2 实例:
#define BSP_USING_UART
#define BSP_USING_UART1
#define BSP_UART1_RX_USING_DMA
#define BSP_USING_UART2
#define BSP_UART2_RX_USING_DMA
配置完成后,用户需要在所有需要访问驱动程序的源代码中包含头文件。
使用UART驱动
适配器层注册 RT-Thread 请求的硬件支持功能,并使用 HAL 实现这些功能。 UART HAL 公开的API 详见 UART 。 对于使用 RT-Thread 的用户,可以使用以下代码作为示例:
rt_device_t uart_dev = rt_device_find("uart1");
rt_err_t err = rt_device_open(uart_dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
config.baudrate=115200;
rt_device_control(uart_dev, RT_DEVICE_CTRL_CONFIG, &config);
uint8_t
data=[1,2,3,4,5,6,7,8];
rt_device_write(uart_dev,
-1,
#define BLOCK_SIZE 256
uint8_t g_rx_data=[BLOCK_SIZE];
static rt_sem_t rx_sem;
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
rt_sem_release(rx_sem);
return RT_EOK;
}
...
rt_sem_create("uart_sem", 1, RT_IPC_FLAG_FIFO);
rt_device_set_rx_indicate(uart_dev, uart_input);
rt_sem_take(rx_sem, 1000);
int len=rt_device_read(uart_dev,
-1,
g_rx_data,
BLOCK_SIZE);
- Note
- DMA 支持是通过 menuconfig 工具配置的,要使用 DMA,开发者需要在打开设备时设置相应的标志。