RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

GPIO輸入——按鍵檢測

CHANBAEK ? 來源:doc.embedfire.com ? 作者:doc.embedfire.com ? 2023-02-15 15:45 ? 次閱讀

GPIO輸入——按鍵檢測

按鍵檢測使用到GPIO外設(shè)的基本輸入功能,本章中不再贅述GPIO外設(shè)的概念,如您忘記了可重新回到第八章節(jié)進(jìn)行閱讀。

12.1. 硬件設(shè)計

按鍵機械觸點斷開、閉合時,由于觸點的彈性作用,按鍵開關(guān)不會馬上穩(wěn)定接通或一下子斷開,使用按鍵時會產(chǎn)生 圖12_1中的帶波紋信號,需要用軟件消抖處理濾波,不方便輸入檢測。

本實驗用到的野火啟明6M5開發(fā)板的按鍵帶硬件消抖功能,它利用電容充放電的延時,消除了波紋,從而簡化軟件的處理,軟件只需要直接檢測引腳的電平即可。

瑞薩設(shè)計的微處理器MCU)擁有硬件數(shù)字濾波的功能用來實現(xiàn)去除按鍵帶來的紋波影響, 不過前提是按鍵用在外部中斷作為按鍵信號輸入的情況下使用, 通過使用數(shù)字濾波的方式能夠替代掉用電容式濾波的方法來消除紋波, 從而減少我們在硬件上的開發(fā)成本。

野火啟明6M5開發(fā)板的按鍵電路圖如 圖12_2所示,圖中RA6M5芯片的P004、P005引腳分別通過一個10KΩ的貼片電阻連接到電源的正極,所以按鍵在沒有被按下的時候,GPIO引腳的輸入狀態(tài)為高電平狀態(tài), 分別又通過串聯(lián)一個100Ω的貼片電阻和一個按鍵接地,所以按鍵在被按下的時候,GPIO引腳的輸入狀態(tài)為低電平狀態(tài)。 只要我們檢測引腳的輸入電平,即可判斷按鍵是否被按下。

圖 12?1 按鍵抖動說明圖

圖 12?2 按鍵原理圖

若您使用的實驗板按鍵的連接方式或引腳不一樣,只需根據(jù)我們的工程修改引腳即可,程序的控制原理相同。

12.2. 按鍵程序設(shè)計

使用瑞薩官方提供的FPS庫進(jìn)行編程,瑞薩官方提供的FPS庫具有方便、快捷、簡潔的特性。 在下面會教大家如何使用FPS庫進(jìn)行編程。

12.2.1. 新建工程

對于 e2 studio 開發(fā)環(huán)境:拷貝一份我們之前的 e2s 工程模板 “11_GPIO_LED , 然后將工程文件夾重命名為 “12_Key” ,最后再將它導(dǎo)入到我們的 e2 studio 工作空間中。

對于 Keil 開發(fā)環(huán)境:拷貝一份我們之前的 Keil 工程模板 “11_GPIO_LED” , 然后將工程文件夾重命名為 “12_Key” ,并進(jìn)入該文件夾里面雙擊 Keil 工程文件,打開該工程。

工程新建好之后,在工程根目錄的 “src” 文件夾下面新建 “key” 文件夾, 再進(jìn)入 “key” 文件夾里面新建 key 驅(qū)動的源文件和頭文件:“bsp_key.c” 和 “bsp_key.h”。 工程文件結(jié)構(gòu)如下。

文件結(jié)構(gòu)

12_Key
├─ ......
└─ src
   ├─ led
   │  ├─ bsp_led.c
   │  └─ bsp_led.h
   ├─ key
   │  ├─ bsp_key.c
   │  └─ bsp_key.h
   └─ hal_entry.c

警告

注意:對于使用 Keil 開發(fā)環(huán)境的用戶,將代碼文件放到 “src” 文件夾下之后, Keil 軟件并不會自動將它們加入到工程,這時候需要打開 RASC FSP 配置界面, 點擊一次單擊右上角的 “Generate Project Content” 按鈕,從而 “src” 文件夾下的代碼文件就會被自動加進(jìn)工程中。 接著關(guān)閉 FSP 配置界面返回到 Keil,然后進(jìn)行一次編譯會彈出一個提示框提示工程結(jié)構(gòu)發(fā)生了變化,點擊確定即可。 對于使用 e2 studio 的用戶則不需如此。

12.2.2. FSP配置

接下來我們要在fsp里配置芯片的引腳相關(guān)的屬性。

在打開 “FSP” 配置界面后, 在 “FSP” 配置界面里面點開 Pins” -> “Ports” -> “P0” -> “P004” , 然后將連接到按鍵的IO引腳的 “Mode” 屬性配置為 “Input Mode” ,其他的屬性默認(rèn)即可,LED引腳的配置同上節(jié)一樣配置。

圖Pin Configuration 頁面的 IOPORT 屬性介紹:

IOPORT 屬性介紹

IOPORT 屬性 描述
----------------------------------------------------
模式 IO引腳的工作模式,包括輸入模式和輸出模式。
IO引腳是否上拉。
驅(qū)動器容量 IO引腳的驅(qū)動能力設(shè)置。
輸出類型 IO引腳的輸出類型。 可以選 CMOS 推挽輸出或開漏輸出。

配置完成之后的配置界面如圖所示。

圖配置完成之后按下快捷鍵“Ctrl + S”保存,最后點右上角的 “Generate Project Content” 圖標(biāo), 讓軟件根據(jù)我們的設(shè)置自動生成配置代碼即可。

對于 Keil 這邊 RASC 的 FSP 配置也是一樣的,需要先通過 RASC 軟件打開 Keil 工程相關(guān)的 FSP 配置界面。 具體的方法在前面的章節(jié)已經(jīng)詳述過了,這里不再重復(fù)說明。

12.3. 按鍵程序思路

使用瑞薩的FSP對軟件設(shè)計的思路非常地簡單:首先通過R_IOPORT_Open函數(shù)初始化配置 LED 引腳,之后使用R_IOPORT_PinRead 函數(shù)來獲取當(dāng)前引腳的電平的狀態(tài)。

12.3.1. R_IOPORT_PinRead 函數(shù)

通過 R_IOPORT_Open 函數(shù)初始化相應(yīng)的引腳之后,我們使用R_IOPORT_PinRead函數(shù)來獲取引腳的電平的狀態(tài)。 我們通過分析R_IOPORT_PinRead函數(shù),最主要的是通過p_pin_value這個枚舉類型來獲取IO的狀態(tài)。

fsp_err_t R_IOPORT_PinRead (ioport_ctrl_t * const p_ctrl, bsp_io_port_pin_t pin, bsp_io_level_t * p_pin_value)

注解

bsp_io_port_pin_t枚舉來決定需要獲取的引腳,通過bsp_io_level_t來獲取當(dāng)前GPIO的狀態(tài)。

e_bsp_io_level枚舉

/* IOPORT 實例控制塊 */
 typedef enum e_bsp_io_level
 {
     BSP_IO_LEVEL_LOW = 0,              ///< Low
     BSP_IO_LEVEL_HIGH                  ///< High
 } bsp_io_level_t;

12.3.2. 主函數(shù)

在while(1)里不斷調(diào)用R_IOPORT_PinRead函數(shù),并判斷其返回值,若返回值表示按鍵按下,則LED燈的點亮,否則LED燈滅掉。

完整代碼如下:

代碼清單12_4

代碼清單 12-4:主函數(shù)

void hal_entry(void)
 {
     fsp_err_t      err;                                                                 //
     err = R_IOPORT_Open(&g_ioport_ctrl, &g_bsp_pin_cfg);                                //初始化引腳
     assert(FSP_SUCCESS == err);                                                         //判斷是否初始化成功


     bsp_io_level_t Pin_P004;                                                            //定義獲取函數(shù)的結(jié)構(gòu)體
     while(1)
     {
         R_IOPORT_PinRead(&g_ioport_ctrl,BSP_IO_PORT_00_PIN_04, &Pin_P004);              //運行函數(shù)并把獲取的數(shù)據(jù)賦值結(jié)構(gòu)體
         if(Pin_P004 == BSP_IO_LEVEL_LOW){                                               //判斷按鍵有沒有按下
             R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);//點亮LED
         }else if(Pin_P004 == BSP_IO_LEVEL_HIGH){                                        //判斷按鍵有沒有松開
             R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW); //關(guān)閉LED
         }
     }

 #if BSP_TZ_SECURE_BUILD
     /* Enter non-secure code */
     R_BSP_NonSecureEnter();
 #endif
 }

注解

使用這種方式來獲取IO口的狀態(tài)相對會比較復(fù)雜,下面將介紹一種新的寫法來簡化這一個過程,可以使程序看起來更簡單,讓我們開發(fā)起來更加的順暢。

12.4. 封裝 Key 設(shè)備驅(qū)動程序

R_key_read函數(shù)

/*
 * 按鍵讀取函數(shù) 輸入引腳 返回當(dāng)前引腳的狀態(tài)
 * */
 uint32_t R_key_read(bsp_io_port_pin_t key)
 {
     bsp_io_level_t state;
     R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
     return state;
 }

我們這里對R_IOPORT_PinRead進(jìn)行一次封裝,為什么要加這一層封裝呢,因為在對R_IOPORT_PinRead編程中多了一個指向型bsp_io_port_pin_t枚舉類型數(shù)據(jù), 每當(dāng)程序中增加一個需要讀取的IO口時我們就需要增加一個枚舉類型數(shù)據(jù),這樣大大增加了我們程序的冗余程度。 我們封裝的過程中通過輸入當(dāng)前的引腳,然后return返回當(dāng)前的狀態(tài),這樣簡化了我們進(jìn)行程序的編寫。

Key_Scan函數(shù)

/*
 * 按鍵掃描函數(shù)判斷你的手是否松開
 */
 uint32_t Key_Scan(bsp_io_port_pin_t key)
 {
     if(R_key_read(key) == BSP_IO_LEVEL_HIGH)
     {
         return KEY_OFF;
     }
     else
     {
         do  //等待按鍵釋放
         {
             R_key_read(key);
         } while (BSP_IO_LEVEL_LOW == R_key_read(key));
     }
     return KEY_ON;
 }

這是一個對R_IOPORT_PinRead函數(shù)的使用案例,當(dāng)按下按鍵的時候單片機會檢測手是否松開當(dāng)手離開的時候返回KEY_ON數(shù)值,當(dāng)按鍵沒有被按下的時候Key_Scan函數(shù)則返回KEY_OFF的數(shù)值, 下面是一個Key_Scan函數(shù)的實踐案列。

主函數(shù)hal_entry()

void hal_entry(void)
 {
     while(1)
     {
         if( Key_Scan(KEY_SW2_PIN) == KEY_ON )   //掃描判斷按鍵
         {
             LED1_ON;    //宏定義LED開
             LED2_ON;
             LED3_ON;
         }
         if( Key_Scan(KEY_SW3_PIN) == KEY_ON )
         {
             LED1_OFF;   //宏定義LED關(guān)
             LED2_OFF;
             LED3_OFF;
         }
     }

 #if BSP_TZ_SECURE_BUILD
     /* Enter non-secure code */
     R_BSP_NonSecureEnter();
 #endif
 }

在 “hal_entry.c” 文件中添加對頭文件 “bsp_key.h” 的包含, 然后將 hal_entry 入口函數(shù)的內(nèi)容改為如上所示。

12.5. 下載驗證

把編譯好的程序下載到開發(fā)板并復(fù)位,按下按鍵可以控制LED燈亮滅。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 電路圖
    +關(guān)注

    關(guān)注

    10340

    文章

    10720

    瀏覽量

    530195
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    107950
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5032

    瀏覽量

    97371
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1204

    瀏覽量

    52051
  • 按鍵檢測
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    4834
收藏 人收藏

    評論

    相關(guān)推薦

    i.MX6ULL 驅(qū)動開發(fā)7—按鍵輸入捕獲與GPIO輸入配置與高低電平讀取

    本篇主要介紹了i.MX6ULL的按鍵檢測的使用,主要的知識點是設(shè)備樹的修改,以及GPIO輸入配置與高低電平的讀取。
    的頭像 發(fā)表于 05-24 09:11 ?6209次閱讀
    i.MX6ULL 驅(qū)動開發(fā)7—<b class='flag-5'>按鍵</b><b class='flag-5'>輸入</b>捕獲與<b class='flag-5'>GPIO</b><b class='flag-5'>輸入</b>配置與高低電平讀取

    通過MCU不斷檢測按鍵連接GPIO的狀態(tài)變化來確認(rèn)是否有按鍵輸入

    1.簡述對于按鍵,常見的是通過MCU不斷檢測按鍵連接 GPIO 的狀態(tài)變化(高–>低或低—>高),來確認(rèn)是否有按鍵
    發(fā)表于 08-13 06:00

    GPIO外部中斷輸入檢測

    本篇主要講述GPIO外部中斷輸入檢測,實際物理輸入方式是按鍵,但是實際上更適合外部設(shè)備信號的輸入
    發(fā)表于 08-16 09:14

    講講關(guān)于GPIO按鍵輸入的關(guān)鍵要點

    GPIO 端口時鐘;2. 初始化 GPIO 目標(biāo)引腳為輸入模式(浮空輸入);3. 編寫按鍵檢測
    發(fā)表于 12-09 06:33

    GPIO輸入--按鍵

    程序簡介 -工程名稱:GPIO輸入--按鍵 -實驗平臺: 秉火STM32 F429 開發(fā)板 -MDK版本:5.16 -ST固件庫版本:1.5.1 【 !】功能簡介: 使用兩個按鍵控制彩
    發(fā)表于 12-12 19:08 ?3次下載

    一文解析GPIO外部中斷輸入檢測

    本篇主要講述GPIO外部中斷輸入檢測,實際物理輸入方式是按鍵,但是實際上更適合外部設(shè)備信號的輸入
    的頭像 發(fā)表于 08-31 11:46 ?4122次閱讀
    一文解析<b class='flag-5'>GPIO</b>外部中斷<b class='flag-5'>輸入</b><b class='flag-5'>檢測</b>

    STM32F103-入門基礎(chǔ)實驗-GPIO輸入-按鍵(查詢/中斷)控制LED核心代碼(固件庫版)

    GPIO 端口時鐘;2. 初始化 GPIO 目標(biāo)引腳為輸入模式(浮空輸入);3. 編寫按鍵檢測
    發(fā)表于 11-26 13:21 ?0次下載
    STM32F103-入門基礎(chǔ)實驗-<b class='flag-5'>GPIO</b><b class='flag-5'>輸入</b>-<b class='flag-5'>按鍵</b>(查詢/中斷)控制LED核心代碼(固件庫版)

    esp32學(xué)習(xí)之按鍵檢測gpio中斷

    esp32學(xué)習(xí)之gpio中斷前言流程選定gpiogpio配置設(shè)置回調(diào)函數(shù)注冊中斷處理程序前言最近在做一個按鍵檢測,按鍵檢測有兩種方法,一種是
    發(fā)表于 12-04 16:21 ?14次下載
    esp32學(xué)習(xí)之<b class='flag-5'>按鍵</b><b class='flag-5'>檢測</b><b class='flag-5'>gpio</b>中斷

    STM8S自學(xué)筆記-006 GPIO輸入按鍵輸入按鍵濾波

    STM8S自學(xué)筆記-006 按鍵輸入GPIO輸入【修訂記錄】1、20210812,第一版GPIO輸入
    發(fā)表于 12-05 11:36 ?9次下載
    STM8S自學(xué)筆記-006 <b class='flag-5'>GPIO</b><b class='flag-5'>輸入</b>:<b class='flag-5'>按鍵</b><b class='flag-5'>輸入</b> 與 <b class='flag-5'>按鍵</b>濾波

    STM32F103 入門篇 13-GPIO輸入-按鍵檢測

    PA0、PC13同時還具有喚醒功能,上升沿電容作用:按鍵按下后會有20ms的抖動,待穩(wěn)定后通過地線導(dǎo)出。驅(qū)動函數(shù),初始化GPIO使用浮空輸入STM32的四種輸入方式1、上拉
    發(fā)表于 12-07 18:21 ?10次下載
    STM32F103 入門篇 13-<b class='flag-5'>GPIO</b><b class='flag-5'>輸入</b>-<b class='flag-5'>按鍵</b><b class='flag-5'>檢測</b>

    GPIO輸入驅(qū)動實驗-按鍵控制

    GPIO輸入驅(qū)動實驗-按鍵控制寫在前面:和beep實驗一樣,在已有的工程框架上加功能就行了,沖?。?!對了這次會對gpio的操作編寫成一個函數(shù)集合,方便調(diào)用,大家留意。1、bsp下新建k
    發(fā)表于 12-20 19:14 ?1次下載
    <b class='flag-5'>GPIO</b><b class='flag-5'>輸入</b>驅(qū)動實驗-<b class='flag-5'>按鍵</b>控制

    STM32基本GPIO操作:按鍵輸入(掃描+外部中斷)

    STM32基本GPIO操作:按鍵輸入(掃描+外部中斷)本文章向大家介紹STM32基本GPIO操作:按鍵
    發(fā)表于 12-29 19:27 ?13次下載
    STM32基本<b class='flag-5'>GPIO</b>操作:<b class='flag-5'>按鍵</b><b class='flag-5'>輸入</b>(掃描+外部中斷)

    ADC口檢測多個組合按鍵的方法

    一般情況下,一個GPIO口只能連接一個按鍵,通過檢測外部輸入的高、低電平判斷按鍵的開閉狀態(tài)。
    的頭像 發(fā)表于 03-21 10:13 ?5081次閱讀
    ADC口<b class='flag-5'>檢測</b>多個組合<b class='flag-5'>按鍵</b>的方法

    i.MX6ULL學(xué)習(xí)筆記:GPIO按鍵輸入捕獲

    掌握GPIO輸入輸出是必備技能,這篇推文繼續(xù)來學(xué)習(xí)操作GPIO,這篇主要學(xué)習(xí)GPIO輸入,通過使用
    的頭像 發(fā)表于 04-06 10:37 ?1163次閱讀

    【GD32F470紫藤派開發(fā)板使用手冊】第二講 GPIO-按鍵查詢實驗

    通過本實驗主要學(xué)習(xí)以下內(nèi)容: GPIO輸入功能原理; 按鍵查詢輸入檢測原理;
    的頭像 發(fā)表于 04-30 11:39 ?694次閱讀
    【GD32F470紫藤派開發(fā)板使用手冊】第二講 <b class='flag-5'>GPIO</b>-<b class='flag-5'>按鍵</b>查詢實驗
    RM新时代网站-首页