UART驅(qū)動(dòng)包括兩層:硬件訪問層(HAL)和RT-Thread的適配層。
硬件訪問層提供用于訪問 UART 外設(shè)寄存器的基本 API。 有關(guān)詳細(xì)信息,請參閱 UART HAL 的 API 文檔。
適配層提供對 RT-Thread 驅(qū)動(dòng)框架的支持。 用戶可以使用 RT-Thread POSIX 驅(qū)動(dòng)程序接口進(jìn)行 UART 編程。 請參閱 RT-Thread 驅(qū)動(dòng)程序的 API 文檔。
主要功能包括:
- 多實(shí)例支持
- 支持UART波特率高達(dá)3Mbps
- 支持偶/奇/無奇偶校驗(yàn),5/6/7/8/位數(shù),1/2停止位
如果奇偶校驗(yàn)為奇偶校驗(yàn),位數(shù)為8,芯片組需要設(shè)置為9 位,即使用第9 位作為奇偶校驗(yàn)
- 支持基于中斷的 RX 和 TX
- RX 和 TX 均支持 DMA
驅(qū)動(dòng)配置
UART 驅(qū)動(dòng)程序可以使用 UART 外設(shè)的多個(gè)實(shí)例。 可以使用 menuconfig 工具為每個(gè)項(xiàng)目選擇外設(shè)和 DMA 支持配置的實(shí)例,通常保存在 C 頭文件中。 默認(rèn)情況下,配置保存為 rtconfig.h。
以下示例顯示了在一個(gè)項(xiàng)目頭文件中定義的標(biāo)志,該項(xiàng)目正在使用具有 RX DMA 支持的 uart1 和 uart2 實(shí)例:
#define BSP_USING_UART
#define BSP_USING_UART1
#define BSP_UART1_RX_USING_DMA
#define BSP_USING_UART2
#define BSP_UART2_RX_USING_DMA
配置完成后,用戶需要在所有需要訪問驅(qū)動(dòng)程序的源代碼中包含頭文件。
使用UART驅(qū)動(dòng)
適配器層注冊 RT-Thread 請求的硬件支持功能,并使用 HAL 實(shí)現(xiàn)這些功能。 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,開發(fā)者需要在打開設(shè)備時(shí)設(shè)置相應(yīng)的標(biāo)志。