日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

RT-Thread Pin设备驱动API应用介绍

發(fā)布時(shí)間:2024/1/23 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RT-Thread Pin设备驱动API应用介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概要

本文主要涉及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);

參數(shù)描述
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);

參數(shù)描述
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);

參數(shù)描述
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);

參數(shù)描述
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);

參數(shù)描述
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);

參數(shù)描述
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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。