RT-Thread Pin设备驱动API应用介绍
概要
本文主要涉及Pin驅(qū)動(dòng)相關(guān)的API接口的簡(jiǎn)要介紹及使用示例,有興趣深入了解Pin驅(qū)動(dòng)程序框架可參考:RT-Thread pin設(shè)備驅(qū)動(dòng)代碼結(jié)構(gòu)剖析
PIN設(shè)備的操作方法
應(yīng)用程序通過(guò)RT-Thred提供的pin設(shè)備管理接口來(lái)操作GPIO,函數(shù)接口如下表:
| rt_pin_mode() | 設(shè)置引腳模式 |
| rt_pin_write() | 設(shè)置引腳電平 |
| rt_pin_read() | 讀取引腳電平 |
| rt_pin_attach_irq() | 綁定引腳中斷回調(diào)函數(shù) |
| rt_pin_detach_irq() | 脫離引腳中斷回調(diào)函數(shù) |
| rt_pin_irq_enable() | 使能引腳中斷 |
1. 設(shè)置引腳模式
在使用引腳之前需要先設(shè)定引腳的工作模式,通過(guò)下面函數(shù)完成:
void rt_pin_mode(rt_base_t pin, rt_base_t mode);
| pin | 引腳編號(hào) |
| mode | 引腳工作模式 |
| 返回 | 描述 |
| 無(wú) | 無(wú) |
1.1 參數(shù) pin
RT-Thread 提供的引腳編號(hào)需要和芯片的引腳號(hào)區(qū)分開來(lái),它們并不是同一個(gè)概念,引腳編號(hào)由 PIN 設(shè)備驅(qū)動(dòng)程序定義,和具體的芯片相關(guān)。有2種方式可以獲取引腳編號(hào):使用宏定義或者查看PIN 驅(qū)動(dòng)文件。
如果使用 rt-thread/bsp/stm32 目錄下的 BSP 則可以使用下面的宏獲取引腳編號(hào):
GET_PIN(port, pin)
獲取引腳號(hào)為 PF9 的 LED0 對(duì)應(yīng)的引腳編號(hào)的示例代碼如下所示:
#define LED0_PIN GET_PIN(F, 9)
如果使用其他 BSP 則需要查看 PIN 驅(qū)動(dòng)代碼 drv_gpio.c 文件確認(rèn)引腳編號(hào)。此文件里有一個(gè)數(shù)組存放了每個(gè) PIN 腳對(duì)應(yīng)的編號(hào)信息,如下所示:
static const rt_uint16_t pins[] = {__STM32_PIN_DEFAULT,__STM32_PIN_DEFAULT,__STM32_PIN(2, A, 15),__STM32_PIN(3, B, 5),__STM32_PIN(4, B, 8),__STM32_PIN_DEFAULT,__STM32_PIN_DEFAULT,__STM32_PIN_DEFAULT,__STM32_PIN(8, A, 14),__STM32_PIN(9, B, 6),... ... }以__STM32_PIN(2, A, 15)為例,2 為 RT-Thread 使用的引腳編號(hào),A 為端口號(hào),15 為引腳號(hào),所以 PA15 對(duì)應(yīng)的引腳編號(hào)為 2。
1.2 參數(shù) mode
RT-Thread目前支持的模式有下面5種:
#define PIN_MODE_OUTPUT 0x00 /*推挽輸出*/ #define PIN_MODE_INPUT 0x01 /*浮空輸入*/ #define PIN_MODE_INPUT_PULLUP 0x02 /*上拉輸入*/ #define PIN_MODE_INPUT_PULLDOWN 0x03 /*下拉輸出*/ #define PIN_MODE_OUTPUT_OD 0x04 /*開漏輸出*/1.3 示例
使用示例如下所示:
#define BEEP_PIN_NUM GET_PIN(B, 0) /* PB0 *//* 蜂鳴器引腳為輸出模式 */ rt_pin_mode(BEEP_PIN_NUM, PIN_MODE_OUTPUT);2. 設(shè)置引腳電平
設(shè)置引腳輸出電平的函數(shù)如下所示:
void rt_pin_write(rt_base_t pin, rt_base_t value);
| pin | 引腳編號(hào) |
| value | 電平邏輯值,可取 2 種宏定義值之一:PIN_LOW 低電平,PIN_HIGH 高電平 |
使用示例如下所示:
#define BEEP_PIN_NUM 35 /* PB0 *//* 蜂鳴器引腳為輸出模式 */ rt_pin_mode(BEEP_PIN_NUM, PIN_MODE_OUTPUT); /* 設(shè)置低電平 */ rt_pin_write(BEEP_PIN_NUM, PIN_LOW);3. 讀取引腳電平
讀取引腳電平的函數(shù)如下所示:
int rt_pin_read(rt_base_t pin);
| pin | 引腳編號(hào) |
| 返回 | —— |
| PIN_LOW | 低電平 |
| PIN_HIGH | 高電平 |
使用示例如下所示:
#define BEEP_PIN_NUM 35 /* PB0 */ int status;/* 蜂鳴器引腳為輸出模式 */ rt_pin_mode(BEEP_PIN_NUM, PIN_MODE_OUTPUT); /* 設(shè)置低電平 */ rt_pin_write(BEEP_PIN_NUM, PIN_LOW);status = rt_pin_read(BEEP_PIN_NUM);4. 綁定引腳中斷回調(diào)函數(shù)
若要使用到引腳的中斷功能,可以使用如下函數(shù)將某個(gè)引腳配置為某種中斷觸發(fā)模式并綁定一個(gè)中斷回調(diào)函數(shù)到對(duì)應(yīng)引腳,當(dāng)引腳中斷發(fā)生時(shí),就會(huì)執(zhí)行回調(diào)函數(shù):
rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args);
| pin | 引腳編號(hào) |
| mode | 中斷觸發(fā)模式 |
| hdr | 中斷回調(diào)函數(shù),用戶需要自行定義這個(gè)函數(shù) |
| args | 中斷回調(diào)函數(shù)的參數(shù),不需要時(shí)設(shè)置為 RT_NULL |
| 返回 | —— |
| RT_EOK | 綁定成功 |
| 錯(cuò)誤碼 | 綁定失敗 |
中斷觸發(fā)模式 mode 可取如下 5 種宏定義值之一:
#define PIN_IRQ_MODE_RISING 0x00 /* 上升沿觸發(fā) */ #define PIN_IRQ_MODE_FALLING 0x01 /* 下降沿觸發(fā) */ #define PIN_IRQ_MODE_RISING_FALLING 0x02 /* 邊沿觸發(fā)(上升沿和下降沿都觸發(fā))*/ #define PIN_IRQ_MODE_HIGH_LEVEL 0x03 /* 高電平觸發(fā) */ #define PIN_IRQ_MODE_LOW_LEVEL 0x04 /* 低電平觸發(fā) */使用示例如下所示:
#define KEY0_PIN_NUM 55 /* PD8 */ /* 中斷回調(diào)函數(shù) */ void beep_on(void *args) {rt_kprintf("turn on beep!\n");rt_pin_write(BEEP_PIN_NUM, PIN_HIGH); } static void pin_beep_sample(void) {/* 按鍵0引腳為輸入模式 */rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);/* 綁定中斷,下降沿模式,回調(diào)函數(shù)名為beep_on */rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL); }5. 使能引腳中斷
綁定好引腳中斷回調(diào)函數(shù)后使用下面的函數(shù)使能引腳中斷:
rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled);
| pin | 引腳編號(hào) |
| enabled | 狀態(tài),可取 2 種值之一:PIN_IRQ_ENABLE(開啟),PIN_IRQ_DISABLE(關(guān)閉) |
| 返回 | —— |
| RT_EOK | 使能成功 |
| 錯(cuò)誤碼 | 使能失敗 |
使用示例如下所示:
#define KEY0_PIN_NUM 55 /* PD8 */ /* 中斷回調(diào)函數(shù) */ void beep_on(void *args) {rt_kprintf("turn on beep!\n");rt_pin_write(BEEP_PIN_NUM, PIN_HIGH); } static void pin_beep_sample(void) {/* 按鍵0引腳為輸入模式 */rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);/* 綁定中斷,下降沿模式,回調(diào)函數(shù)名為beep_on */rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);/* 使能中斷 */rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE); }6. 脫離引腳中斷回調(diào)函數(shù)
可以使用如下函數(shù)脫離引腳中斷回調(diào)函數(shù):
rt_err_t rt_pin_detach_irq(rt_int32_t pin);
| pin | 引腳編號(hào) |
| 返回 | —— |
| RT_EOK | 脫離成功 |
| 錯(cuò)誤碼 | 脫離失敗 |
引腳脫離了中斷回調(diào)函數(shù)以后,中斷并沒(méi)有關(guān)閉,還可以調(diào)用綁定中斷回調(diào)函數(shù)再次綁定其他回調(diào)函數(shù)。
#define KEY0_PIN_NUM 55 /* PD8 */ /* 中斷回調(diào)函數(shù) */ void beep_on(void *args) {rt_kprintf("turn on beep!\n");rt_pin_write(BEEP_PIN_NUM, PIN_HIGH); } static void pin_beep_sample(void) {/* 按鍵0引腳為輸入模式 */rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);/* 綁定中斷,下降沿模式,回調(diào)函數(shù)名為beep_on */rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);/* 使能中斷 */rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);/* 脫離中斷回調(diào)函數(shù) */rt_pin_detach_irq(KEY0_PIN_NUM); }注意:脫離中斷回調(diào)函數(shù)后,中斷并沒(méi)有關(guān)掉,只是不再執(zhí)行被脫離的回調(diào)函數(shù)
PIN 設(shè)備使用示例
PIN 設(shè)備的具體使用方式可以參考如下示例代碼,示例代碼的主要步驟如下:
設(shè)置蜂鳴器對(duì)應(yīng)引腳為輸出模式,并給一個(gè)默認(rèn)的低電平狀態(tài)。
設(shè)置按鍵 0 和 按鍵1 對(duì)應(yīng)引腳為輸入模式,然后綁定中斷回調(diào)函數(shù)并使能中斷。
按下按鍵 0 蜂鳴器開始響,按下按鍵 1 蜂鳴器停止響。
/** 程序清單:這是一個(gè) PIN 設(shè)備使用例程* 例程導(dǎo)出了 pin_beep_sample 命令到控制終端* 命令調(diào)用格式:pin_beep_sample* 程序功能:通過(guò)按鍵控制蜂鳴器對(duì)應(yīng)引腳的電平狀態(tài)控制蜂鳴器 */#include <rtthread.h> #include <rtdevice.h>/* 引腳編號(hào),通過(guò)查看設(shè)備驅(qū)動(dòng)文件drv_gpio.c確定 */ #ifndef BEEP_PIN_NUM#define BEEP_PIN_NUM 35 /* PB0 */ #endif #ifndef KEY0_PIN_NUM#define KEY0_PIN_NUM 55 /* PD8 */ #endif #ifndef KEY1_PIN_NUM#define KEY1_PIN_NUM 56 /* PD9 */ #endifvoid beep_on(void *args) {rt_kprintf("turn on beep!\n");rt_pin_write(BEEP_PIN_NUM, PIN_HIGH); }void beep_off(void *args) {rt_kprintf("turn off beep!\n");rt_pin_write(BEEP_PIN_NUM, PIN_LOW); }static void pin_beep_sample(void) {/* 蜂鳴器引腳為輸出模式 */rt_pin_mode(BEEP_PIN_NUM, PIN_MODE_OUTPUT);/* 默認(rèn)低電平 */rt_pin_write(BEEP_PIN_NUM, PIN_LOW);/* 按鍵0引腳為輸入模式 */rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);/* 綁定中斷,下降沿模式,回調(diào)函數(shù)名為beep_on */rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);/* 使能中斷 */rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);/* 按鍵1引腳為輸入模式 */rt_pin_mode(KEY1_PIN_NUM, PIN_MODE_INPUT_PULLUP);/* 綁定中斷,下降沿模式,回調(diào)函數(shù)名為beep_off */rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_off, RT_NULL);/* 使能中斷 */rt_pin_irq_enable(KEY1_PIN_NUM, PIN_IRQ_ENABLE); } /* 導(dǎo)出到 msh 命令列表中 */ MSH_CMD_EXPORT(pin_beep_sample, pin beep sample);總結(jié)
以上是生活随笔為你收集整理的RT-Thread Pin设备驱动API应用介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 详解C语言中 # 和 ## 的用法
- 下一篇: C语言string.h文件函数汇总详解