1. 程式人生 > >RTThread的串列埠驅動檔案淺析

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);//中斷接受函式,每接收一個字元,就放入對應串列埠的迴圈緩衝區 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()巨集將其新增到開機初始化列表中。

(日後待更新)