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


RTT內核對象——設備

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

內核繼承關系圖如下:

設備繼承關系圖如下:

device對象對應的結構體如下:

其中,設備類型type有如下幾類:

設備的操作方法結構體:

I/O設備模型框架

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

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

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

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

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

設備的兩種注冊方式

1、 對於操作邏輯簡單的設備,可以不經過設備驅動框架層,直接將設備注冊到 I/O 設備管理器中:

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

I/O設備接口

1、創建及注冊I/O設備

設備創建:

設備注冊:

2、訪問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/

我的微信公眾號:嵌入式大雜燴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM