91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

程序小白
認證:優質創作者
所在專題目錄 查看專題
單片機應用與驅動開發之路:這時的你只需要扣動扳機。
RT-Thread驅動之路:stm32設備驅動開發之uart注冊①
RT-Thread驅動之路:stm32設備驅動開發之uart設備創建②
RT-Thread驅動之路:stm32設備驅動開發之uart操作方法③
RT-Thread驅動之路:stm32設備驅動開發之uart中斷處理④
RT-Thread驅動之路:stm32設備驅動開發之淺析注冊機制⑤
作者動態 更多
基于stm32采用PWM驅動伺服控制器學習筆記
05-13 15:25
基于STM32驅動TM1638學習筆記——軟件篇
04-19 12:42
基于TM1638驅動8位數碼管設計分享
02-24 11:26
RT-Thread驅動之路: Studio創建FAL分區⑤
01-02 08:30
RT-Thread驅動之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

RT-Thread驅動之路:stm32設備驅動開發之uart注冊①


      開篇分割線,驅動開發和應用是完全兩條路子,系統里面應用程序想要通過名稱或者句柄找到驅動的必要條件就是,驅動已經被注冊到了系統里了,那么我們的第一篇就聊聊他是如何被注冊到系統里面的,直接上圖看下其調用關系:

      首先我們看到系統初始化過程中,需要對板載硬件進行初始化,調用rt_hw_board_init,而內部使用大量的預編譯宏進行開關控制各個硬件部分是不是需要進行初始化,接下來看下函數rt_hw_usart_init:

int rt_hw_usart_init(void)
{
    rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);
    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
    rt_err_t result = 0;

    stm32_uart_get_dma_config();

    for (int i = 0; i < obj_num; i++)
    {
        uart_obj[i].config = &uart_config[i];
        uart_obj[i].serial.ops    = &stm32_uart_ops;
        uart_obj[i].serial.config = config;
        /* register UART device */
        result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
                                       RT_DEVICE_FLAG_RDWR
                                       | RT_DEVICE_FLAG_INT_RX
                                       | RT_DEVICE_FLAG_INT_TX
                                       | uart_obj[i].uart_dma_flag
                                       , NULL);
        RT_ASSERT(result == RT_EOK);
    }

    return result;
}

      這里我們先不分析代碼里面的大部分內容,而是迎來了系統為我們提供的第一個注冊函數rt_hw_serial_register,它是你理解注冊的第一步接下來我們看下這個函數的原形:

/*
 * serial register
 */
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial)
{
    RT_ASSERT(device != RT_NULL);

    device->type        = RT_Device_Class_Char;
    device->rx_indicate = RT_NULL;
    device->tx_complete = RT_NULL;
    device->init        = rt_serial_init;
    device->open        = rt_serial_open;
    device->close       = rt_serial_close;
    device->read        = rt_serial_read;
    device->write       = rt_serial_write;
    device->control     = rt_serial_control;
    device->user_data   = serial;

    /* register a character device */
    return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
}

      我們注意下它的輸入參數,這非常重要,第一個就是一個對象實體(當然C語言中就是一個結構體變量),第二個參數我們得給這個對象起個名字,這樣方便我們的應用更好的找到我們的對象,第三個參數是對象的人設(舉個例子它可以進行那些操作的合集,比如或者讀or寫),四個參數則是這個對象的私有數據(user_data,也就是我和別人不一樣的點),這個函數的主要任務就是,定義設備的類型:RT_Device_Class_Char,并且設備的動作賦真實可操作的值:初始化/打開/關閉/讀/寫/控制操作。

      最后的最后它需要調用系統提供的rt_device_register完成最終的注冊,原型如下:

      最后的最后我們倒序的方式回憶一下,設備注冊都做了什么:

rt_device_register:設備對象dev  與設備name 建立聯系,并賦值掙得操作flag類型。

rt_hw_serial_register:設備對象dev的操作方法具體賦值,私有數據賦值和類型賦值,豐富dev對象,然后調用rt_device_register。

rt_hw_usart_init:傳入真實的設備操作方法,比如我們用的是stm32芯片,這里就需要將真實的硬件驅動操作方法,串口配置參數傳入到serial結構體中,下一章我們會基于這個API講講設備驅動的詳細實現細節。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 3
收藏 5
關注 151
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 柳州市| 普安县| 扶余县| 宁南县| 大关县| 闽清县| 苏州市| 龙南县| 萨嘎县| 镇安县| 德惠市| 九江市| 绥滨县| 彭泽县| 陇南市| 疏勒县| 镇原县| 金阳县| 会昌县| 贵溪市| 平邑县| 久治县| 平阳县| 肥城市| 定襄县| 赤壁市| 类乌齐县| 利津县| 德钦县| 阿克陶县| 遂溪县| 河间市| 隆尧县| 黄浦区| 富平县| 莱西市| 宁波市| 安溪县| 潍坊市| 普兰店市| 荥经县|