【RT-Thread筆記】IO設備模型及GPIO設備

RTT內核對象——設備

RT-Thread有多種內核對象,其中設備device就是其中一種。git

內核繼承關係圖以下:github

設備繼承關係圖以下:微信

device對象對應的結構體以下:框架

其中,設備類型type有以下幾類:函數

設備的操做方法結構體:線程

I/O設備模型框架

RT-Thread 提供了一套簡單的 I/O 設備模型框架 :3d

應用程序經過 I/O 設備管理接口得到正確的設備驅動,而後經過這個設備驅動與底層 I/O 硬件設備進行數據(或控制)交互。code

I/O 設備管理層:實現了對設備驅動程序的封裝。 設備驅動程序的升級、更替不會對上層應用產生影響, 從而下降了代碼的耦合性、複雜性,提升了系統的可靠性。component

設備驅動框架層: 對同類硬件設備驅動的抽象, 將不一樣廠家的同類硬件設備驅動中相同的部分抽取出來。對象

設備驅動層: 是一組驅使硬件設備工做的程序,實現訪問硬件設備的功能。 這一層是與硬件有關的,不一樣的芯片的同種外設驅動是不一樣的,STM32的GPIO驅動與NXP的GPIO驅動是不一樣的。這一層負責建立與註冊I/O設備,對於操做邏輯簡單的設備,能夠不通過設備驅動框架層。

設備的兩種註冊方式

一、 對於操做邏輯簡單的設備,能夠不通過設備驅動框架層,直接將設備註冊到 I/O 設備管理器中:

二、 對於另外一些設備,如看門狗等,則會將建立的設備實例先註冊到對應的設備驅動框架中,再由設備驅動框架向 I/O 設備管理器進行註冊 :

I/O設備接口

一、建立及註冊I/O設備

設備建立:

設備註冊:

二、訪問I/O設備

應用程序經過 I/O 設備管理接口來訪問硬件設備,當設備驅動實現後,應用程序就能夠訪問該硬件。
I/O 設備管理接口與 I/O 設備的操做方法的映射關係下圖所示:

查找設備:

初始化設備:

打開和關閉設備:

控制設備:

讀寫設備:

數據收發回調:

GPIO(PIN)設備模型

上面說的設備驅動層有兩種註冊設備的方式,對應的應用程序也有兩種訪問設備的方式。一種是經過設備操做接口訪問,另外一種是經過通用的設備驅動來訪問。這裏咱們使用通用的GPIO設備驅動(對應源碼:pin.c)來訪問GPIO設備。其中通用的設備驅動在RT-Thread代碼中做爲一個組件,對應的路徑爲:

rt-thread\components\drivers

這個文件夾下有不少驅動框架:

咱們用的GPIO(PIN)設備驅動pin.c存在於文件夾misc下。

GPIO輸入輸出實驗(按鍵點燈):

建立一個pin線程:

按鍵按下LED被點亮,按鍵鬆開LED熄滅。

static void pin_thread_entry(void *parameter)
{
    unsigned int count = 1;
    
    /* 設置LED引腳爲輸出模式 */
    rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
    
    /* 設置KEY0引腳爲輸入模式 */
    rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);
    
    while (count > 0)
    {
        /* 讀取KEY0引腳狀態 */
        if (rt_pin_read(PIN_KEY0) == PIN_LOW)
        {
            rt_thread_mdelay(50);
            if (rt_pin_read(PIN_KEY0) == PIN_LOW)
            {
                count++;
                rt_kprintf("KEY0 pressed!  LED ON! count = %d\n", count);
                rt_pin_write(PIN_LED_R, PIN_LOW);
            }
        }
        else
        {
            rt_pin_write(PIN_LED_R, PIN_HIGH);
        }
        rt_thread_mdelay(10);
    }
}

int main(void)
{
    /* 線程句柄定義 */
    rt_thread_t tid;  
    
    /* 建立動態pin線程 :優先級 25 ,時間片 5個系統滴答,線程棧512字節 */
    tid = rt_thread_create("pin_thread",
                            pin_thread_entry,
                            RT_NULL,
                            STACK_SIZE,
                            THREAD_PRIORITY,
                            TIMESLICE);
    
    /* 建立成功則啓動動態線程 */
    if (tid != RT_NULL)
    {
        rt_thread_startup(tid);
    } 

    return 0;
}

下載程序,在終端輸入list_device命令:

能夠看到device是pin,類型是Miscellaneous Device,說明咱們正在使用通用的GPIO設備驅動。這個實驗中有三個文件值得關注,分別是

device.c:設備管理層
pin.c:設備驅動框架層
drv_gpio.c:設備驅動層

其中device.cpin.c屬於RT-Thread的範疇,drv_gpio.c與具體的硬件有關,這個文件裏操控的就是與硬件有關的東西,如:

程序中用到的rt_pin_modert_pin_write等都是PIN設備管理接口。PIN設備管理有以下幾個接口:

設置引腳模式:

RT-Thread 提供的引腳編號須要和芯片的引腳號區分開來,它們並非同一個概念,引腳編號由 PIN設備驅動程序定義,和具體的芯片相關。

設置引腳電平:

讀取引腳電平:

綁定引腳中斷回調函數:

使能引腳中斷:

脫離引腳中斷回調函數:

以上就是本次的筆記,若有錯誤,歡迎指出。


個人我的博客:https://zhengnianli.github.io/

個人微信公衆號:嵌入式大雜燴

相關文章
相關標籤/搜索