RTThread的串口驱动文件浅析

RTThread的串口驱动文件浅析

RTThread的串口驱动部分代码结构和Linux相似,这里将其分为两部分:一、设备无关层,二、硬件驱动层。设备无关层的作用为:一、向下为硬件驱动层提供:需要被实现的操作硬件的基本函数、设备注册函数、中断处理调用函数和需要被实现的结构体,二、在内部调用操作底层硬件的基本函数实现更为复杂的驱动功能,三、向上提供标准的驱动接口

硬件驱动层

在RTThread的stm32f7-disco工程中提供的硬件驱动层文件为:drv_usart.c和drv_usart.h文件。其中实现了需要被实现的硬件驱动函数和相应结构体:

实现的底层操作函数

static rt_err_t drv_configure(struct rt_serial_device *serial,struct serial_configure *cfg);//配置函数,在系初始化时被调用,初始化串口相关寄存器
static rt_err_t drv_control(struct rt_serial_device *serial,int cmd, void *arg);//实现开关中断
static int drv_getc(struct rt_serial_device *serial);//读寄存器返回一个字符串
static int drv_putc(struct rt_serial_device *serial, char c);//向寄存器写入一个字符串进行发送
void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle);//将相关寄存器恢复默认值
void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle);//初始化寄存器配置和引脚配置
int hw_usart_init(void);//最终被系统初始化时调用的初始化函数,主要实现串口相关结构体赋值和注册
void UART4_IRQHandler(void);//中断接收函数,调用设备无关层提供的rt_hw_serial_isr()函数,对中断进行处理
void UART5_IRQHandler(void);
void UART7_IRQHandler(void);
void USART1_IRQHandler(void);
void USART6_IRQHandler(void);

实现的结构体

struct drv_uart
{
    UART_HandleTypeDef UartHandle;
    IRQn_Type irq;
};//底层串口寄存器和中断结构体
struct serial_configure
{
    rt_uint32_t baud_rate;

    rt_uint32_t data_bits               :4;
    rt_uint32_t stop_bits               :2;
    rt_uint32_t parity                  :2;
    rt_uint32_t bit_order               :1;
    rt_uint32_t invert                  :1;
    rt_uint32_t bufsz                   :16;
    rt_uint32_t reserved                :6;
};//描述串口配置参数结构体
struct rt_uart_ops
{
    rt_err_t (*configure)(struct rt_serial_device *serial, struct serial_configure *cfg);
    rt_err_t (*control)(struct rt_serial_device *serial, int cmd, void *arg);

    int (*putc)(struct rt_serial_device *serial, char c);
    int (*getc)(struct rt_serial_device *serial);

    rt_size_t (*dma_transmit)(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction);
};//需要实现的基本硬件操作
struct rt_serial_device
{
    struct rt_device          parent;

    const struct rt_uart_ops *ops;
    struct serial_configure   config;

    void *serial_rx;//接收缓冲区
    void *serial_tx;//发送缓冲区
};//描述串口的结构体

(注:以上是实现的结构体的定义)

设备无关层

设备无关层的实现文件为:serial.c和serial.h。其中头文件定义了一系列驱动相关的结构体、函数和参数宏定义,c文件实现了具体的驱动函数、设备注册函数和向上层提供的接口。设备无关层的主要内容如下图所示:
RTThread的串口驱动文件浅析_第1张图片
如上图所示,RTThread的设备无关层利用了面向对象的思想,将串口的相关信息和操作函数封装为一个结构体struct rt_serial_device,这个结构体继承于struct rt_device,struct rt_device包含了应该提供给上层的设备控制接口,此外struct rt_serial_device还额外定义了一些用于操作和配置串口的成员如struct rt_uart_ops、struct serial_configure等。

实现RTThread串口驱动的基本方法

如果用户要编写新串口的驱动:
1、参考RTThread已提供的串口驱动文件,实现对应的底层硬件驱动函数和相应的结构体,例如定义一个struct rt_serial_device对象usart2。
2、编写一个初始化函数,例如int hw_usart_init(void),在这个函数中对usart2进行填充,然后调需用注册函数rt_err_t rt_hw_serial_register(),对usart2进行注册
3、最后要对初始化函数int hw_usart_init(void)使用INIT_BOARD_EXPORT()宏将其添加到开机初始化列表中,这样在RTThread启动时就会自动调用。
(注意,描述串口相关寄存器的结构体struct drv_uart一般放到struct rt_device的void *user_data成员中去)

你可能感兴趣的:(RTThread学习)