UART设备

驱动配置

On-Chip Peripheral RTOS Drivers ‣ Enable UART菜单中选择要使用的UART设备,配置是否要支持DMA。

下面的宏开关表示使能了UART1和UART2两个设备,并且都支持RX DMA

#define BSP_USING_UART
#define BSP_USING_UART1
#define BSP_UART1_RX_USING_DMA
#define BSP_USING_UART2
#define BSP_UART2_RX_USING_DMA

备注

menuconfig选中了DMA只是表示将驱动配置为支持DMA,但驱动是否使用DMA还是要看rt_device_open是传入的flag,如果flag要求使用DMA,但驱动没有配置DMA,rt_device_open会返回失败。反之,如果驱动支持DMA,但open的时候没有指定使用DMA,驱动仍然以非DMA的模式工作

设备名称

  • uart<x>, 其中x为设备编号,如uart1uart2,与操作的外设编号对应

示例代码

// Find and open device
rt_device_t uart_dev = rt_device_find("uart1");
// RX use DMA
rt_err_t err = rt_device_open(uart_dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);

// Configure UART
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
config.baudrate=115200;
rt_device_control(uart_dev, RT_DEVICE_CTRL_CONFIG, &config);

// TX
uint8_t data=[1,2,3,4,5,6,7,8];
rt_device_write(uart_dev, 
	-1, 			// Start offset, for UART, this is ignored.
	data, 			
	sizeof(data));
        
// RX
#define BLOCK_SIZE 256
uint8_t g_rx_data=[BLOCK_SIZE];
static rt_sem_t rx_sem;

// Interrupt callback, try not issue read in interrupt context.
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    rt_sem_release(rx_sem);
    return RT_EOK;
}

...

// Create semphore to communicate with IRQ context
 rt_sem_create("uart_sem", 1, RT_IPC_FLAG_FIFO);
// Set RX indication functions
rt_device_set_rx_indicate(uart_dev, uart_input);
// Wait fo RX interrupt.
rt_sem_take(rx_sem,  1000);
// Read up to BLOCK_SIZE, will return len actually read.
int len=rt_device_read(uart_dev, 
	-1, 
	g_rx_data, 
	BLOCK_SIZE);

RT-Thread参考文档