我相信大多數(shù)學(xué)習(xí)嵌入式的朋友學(xué)習(xí)單片機(jī)的第一個(gè)程序都是點(diǎn)燈,畢竟點(diǎn)燈簡單嘛,操作下GPIO即可。當(dāng)然,本教程的第一個(gè)應(yīng)用也從GPIO的使用開始。
1 RT-Thread PIN設(shè)備驅(qū)動(dòng)簡介
RT-Thread 提供了一套簡單的 I/O 設(shè)備模型框架,如下圖所示。
它位于硬件和應(yīng)用程序之間,共分成三層,從上到下分別是 I/O 設(shè)備管理層、設(shè)備驅(qū)動(dòng)框架層、設(shè)備驅(qū)動(dòng)層。
應(yīng)用程序通過 I/O 設(shè)備管理接口獲得正確的設(shè)備驅(qū)動(dòng),然后通過這個(gè)設(shè)備驅(qū)動(dòng)與底層 I/O 硬件設(shè)備進(jìn)行數(shù)據(jù)(或控制)交互。關(guān)于I/O模型的詳細(xì)描述請(qǐng)參看RT-Thread官方手冊(cè)。
I/O設(shè)備模型:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device
PIN設(shè)備屬于Miscellaneous類型,在驅(qū)動(dòng)文件pin.c中的rt_device_pin_register()函數(shù)可以看到其注冊(cè)的設(shè)備類型,PIN設(shè)備是很多驅(qū)動(dòng)的基礎(chǔ),其他驅(qū)動(dòng)的開發(fā)還會(huì)依賴PIN設(shè)備,比如軟件I2C的驅(qū)動(dòng)就是在PIN設(shè)備的基礎(chǔ)上開發(fā)的。
應(yīng)用程序通過 RT-Thread 提供的 PIN 設(shè)備管理接口來訪問 GPIO,相關(guān)接口如下所示:
函數(shù) | 描述 |
---|---|
rt_pin_get() | 獲取引腳編號(hào) |
rt_pin_mode() | 設(shè)置引腳模式 |
rt_pin_write() | 設(shè)置引腳電平 |
rt_pin_read() | 讀取引腳電平 |
rt_pin_attach_irq() | 綁定引腳中斷回調(diào)函數(shù) |
rt_pin_irq_enable() | 使能引腳中斷 |
rt_pin_detach_irq() | 脫離引腳中斷回調(diào)函數(shù) |
關(guān)于PIN驅(qū)動(dòng)API的詳細(xì)描述請(qǐng)參看以下內(nèi)容:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pin/pin
2 PIN設(shè)備使用實(shí)例之按鍵
筆者這里使用的是EK-RA6E2開發(fā)板,MCU資源很豐富,但是板載資源較少。EK-RA6E2開發(fā)板的用戶LED已經(jīng)在主線程中使用了,因此這里就用戶按鍵來舉例說明如何使用PIN設(shè)備。
2.1 硬件電路
首先看下電路圖:
[]()Figure ? 按鍵電路
當(dāng)然不同開發(fā)板,其引腳可能不同,請(qǐng)根據(jù)具體情況使用。由以上電路圖可以看到,當(dāng)P304輸入低電平,表示按鍵按下,反之亦然。
2.2 按鍵實(shí)現(xiàn)
核心代碼如下:
#define KEY_PIN BSP_IO_PORT_03_PIN_04 /* Onboard LED3 pins */
/* 按鍵檢測線程入口函數(shù)*/
static void key_thread_entry(void *parameter)
{
static rt_uint8_t key_up = 1; /* 按鍵松開標(biāo)志 */
/* 初始化按鍵 */
rt_pin_mode(KEY_PIN, PIN_MODE_INPUT);
while (1)
{
/* 檢測按鍵是否按下 */
if (key_up && (rt_pin_read(KEY_PIN) == PIN_LOW) )
{
rt_thread_mdelay(50); /* 延時(shí)消抖*/
key_up = 0;
if (rt_pin_read(KEY_PIN) == PIN_LOW)
{
/* 按鍵KEY按下,按鍵按下處理*/
rt_kprintf("KEY pressed!n");
}
}
else if((rt_pin_read(KEY_PIN) == PIN_HIGH) )
{
key_up = 1; /* 按鍵已松開 */
}
rt_thread_mdelay(100);
}
}
/* 線程初始化*/
int key_init(void)
{
/* 創(chuàng)建線程,名稱是 key_thread,入口是 key_thread*/
rt_thread_t key_tid= RT_NULL;
key_tid = rt_thread_create( "gpio",
key_thread_entry,
RT_NULL,
1024,
3,
10);
/* 如果獲得線程控制塊,啟動(dòng)這個(gè)線程 */
if(key_tid == RT_NULL)
{
rt_kprintf("Thread_gpio ERROR");
return RT_ERROR;
}
else
{
rt_thread_startup(key_tid);
return RT_EOK;
}
}
/* 導(dǎo)出到 msh 命令列表中 */
MSH_CMD_EXPORT(key_init, key init);
構(gòu)建并下載程序,并使用msh 命令初始化KEY線程,按下按鍵,則可以看到串口終端輸出以下信息:
當(dāng)然啦,在finsh輸入list device可以查到注冊(cè)到RT-Thread的PIN設(shè)備:
-
單片機(jī)
+關(guān)注
關(guān)注
6071文章
45249瀏覽量
659854 -
嵌入式
+關(guān)注
關(guān)注
5172文章
19963瀏覽量
324158 -
GPIO
+關(guān)注
關(guān)注
16文章
1299瀏覽量
55226
發(fā)布評(píng)論請(qǐng)先 登錄
【EK-RA6E2開發(fā)指南】開發(fā)環(huán)境搭建

評(píng)論