RTThread的串口驱动文件浅析

版权声明:文章版权为本人保留,若转载文章,请标明出处。 https://blog.csdn.net/qq_30139269/article/details/85476152

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);//中断接受函数,每接收一个字符,就放入对应串口的循环缓冲区
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串口驱动的基本方法

如果用户要编写新串口的驱动,可参考RTThread已提供的串口驱动实现文件,实现对应的底层硬件驱动函数和相应的结构体。然后编写一个初始化函数,在这个函数中调用注册函数,最后要对这个函数使用INIT_BOARD_EXPORT()宏将其添加到开机初始化列表中。

(日后待更新)

猜你喜欢

转载自blog.csdn.net/qq_30139269/article/details/85476152
今日推荐