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

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

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

一文解析GPIO外部中斷輸入檢測(cè)

STM32嵌入式開發(fā) ? 來(lái)源:CSDN博客_ ? 作者:CSDN博客_ ? 2020-08-31 11:46 ? 次閱讀

本篇主要講述GPIO外部中斷輸入檢測(cè),實(shí)際物理輸入方式是按鍵,但是實(shí)際上更適合外部設(shè)備信號(hào)的輸入檢測(cè),物理按鍵輸入因?yàn)橛卸秳?dòng),還需要硬件或者軟件去抖才比較可靠。這個(gè)例子不考慮防抖的情況。

軟件版本:
STM32CubeMX V4.25.0
System Workbench V2.4

硬件:OneNet 麒麟座V2.3

在STM32CubeMX中新建項(xiàng)目,選擇正確的MCU型號(hào)

設(shè)置RCC和SYS,然后根據(jù)板子實(shí)際情況設(shè)置時(shí)鐘(麒麟座外部晶振是12M,STM32F103x的最高主頻是72M)

根據(jù)板子的具體連接設(shè)置4個(gè)GPIO_OUTPUT (連接到LED)和4個(gè)GPIO_EXIT*(外部中斷模式,連接到物理按鍵)。

GPIO OUTPUT引腳設(shè)置

麒麟座按鍵有外部上拉,所以GPIO_EXIT*不需要配置內(nèi)部上拉,檢測(cè)下降沿(Falling Edge),GPIO_EXIT*設(shè)置如下

LED名稱標(biāo)號(hào)我用了1/2/3/4,SW名稱標(biāo)號(hào)我用了2/3/4/5,實(shí)例中標(biāo)號(hào)也未必相同,但是要做好一一對(duì)應(yīng)關(guān)系。

在NVIC(嵌套向量中斷控制器)中,勾選EXIT Line2 interrupt 和 EXIT Line[15:12] interrupt 使能中斷。右邊兩個(gè)選項(xiàng)設(shè)置搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)。此處我們選擇默認(rèn)的,不修改。

同樣修改Project - setting ,ToolChain/IDE選擇 SW4STM32

勾選這里。

生成代碼后點(diǎn)擊Open Project在Eclipse中打開項(xiàng)目,然后在在stm32f7xx_it.c中斷服務(wù)函數(shù)文件中,我們可以找到EXTI2 和EXTI15_10中斷的服務(wù)函數(shù)。

/******************************************************************************//* STM32F1xx Peripheral Interrupt Handlers *//* Add here the Interrupt Handlers for the used peripherals. *//* For the available peripheral interrupt handler names, *//* please refer to the startup file (startup_stm32f1xx.s). *//******************************************************************************//***@brief This function handles EXTI line2 interrupt.*/void EXTI2_IRQHandler(void){/* USER CODE BEGIN EXTI2_IRQn 0 *//* USER CODE END EXTI2_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);/* USER CODE BEGIN EXTI2_IRQn 1 *//* USER CODE END EXTI2_IRQn 1 */}/***@brief This function handles EXTI line[15:10] interrupts.*/void EXTI15_10_IRQHandler(void){/* USER CODE BEGIN EXTI15_10_IRQn 0 *//* USER CODE END EXTI15_10_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);/* USER CODE BEGIN EXTI15_10_IRQn 1 *//* USER CODE END EXTI15_10_IRQn 1 */}

右鍵點(diǎn)擊HAL_GPIO_EXTI_IRQHandler 選擇"Open Declaration"會(huì)跳轉(zhuǎn)到如下代碼:

/***@briefThis function handles EXTI interrupt request.*@paramGPIO_Pin: Specifies the pins connected EXTI line*@retvalNone*/voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin){/* EXTI line interrupt detected */if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}}/***@briefEXTI line detection callbacks.*@paramGPIO_Pin: Specifies the pins connected EXTI line*@retvalNone*/__weakvoidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){/* Prevent unused argument(s) compilation warning */UNUSED(GPIO_Pin);/*NOTE:This function Should not be modified, when the callback is needed,the HAL_GPIO_EXTI_Callback could be implemented in the user file*/}

上述代碼中可以看到GPIO外部中斷處理函數(shù)首先清除中斷標(biāo)識(shí)位,然后調(diào)用中斷回調(diào)函數(shù)HAL_GPIO_EXTI_Callback()。往下看這個(gè)回調(diào)函數(shù)定義的時(shí)候使用了__weak修飾符(關(guān)于__weak修飾符, 可以參看此博文),里面沒有任何有作用的代碼,我們需要重新定義這個(gè)函數(shù)。編輯gpio.c(或者main.c也可以),進(jìn)行如下修改:

/* USER CODE BEGIN 2 */voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin == SW2_Pin){HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);}if(GPIO_Pin == SW3_Pin){HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);}if(GPIO_Pin == SW4_Pin){HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);}if(GPIO_Pin == SW5_Pin){HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin);}}/* USER CODE END 2 */

然后右鍵點(diǎn)擊項(xiàng)目,選擇Properties, Run-Debug Settings, 點(diǎn)擊右側(cè)的New,在彈出對(duì)話框中選擇Ac6 STM32 Debugging。

然后任務(wù)欄上點(diǎn)擊Run圖,當(dāng)然會(huì)報(bào)錯(cuò)的,原因請(qǐng)查看另一篇我的博客,所以需要右鍵點(diǎn)擊 項(xiàng)目名Run.cfg ,給它改個(gè)名字,

然后右鍵點(diǎn)擊項(xiàng)目樹里面的項(xiàng)目名稱,選擇“Propeties”,然后在Run/Debug Settings-選擇項(xiàng)目名-Edit-Main-C/C++Application那里點(diǎn)擊“Search Project”,然后選擇出現(xiàn)的默認(rèn)的elf文件:

然后在Debugger-User Defined-Browse 那里選擇你自己改名的配置文件:

然后右鍵點(diǎn)擊那個(gè)新的cfg文件,選擇"Open With - Text Editor", 進(jìn)行如下更改:

source [findinterface/stlink.cfg]//更改為 source [find interface/stlink-v2.cfg]reset_config srst_only srst_nogate connect_assert_srst//這一行改為 reset_config none

Run一下,就可以了。然后再Run一下,就實(shí)現(xiàn)四個(gè)按鍵分別控制LED的開關(guān)切換了。但是這里沒有防抖處理,你會(huì)發(fā)現(xiàn)有時(shí)候LED會(huì)閃一下,或者沒反應(yīng),其實(shí)是很快地點(diǎn)亮然后熄滅一次或者若干次,只是由于速度太快電流很小導(dǎo)致你看不到。下一篇我們會(huì)通過(guò)使用SysTick中斷來(lái)實(shí)現(xiàn)按鍵去抖掃描。在實(shí)際項(xiàng)目中,最好加上硬件防抖,因?yàn)槎秳?dòng)產(chǎn)生的反向電壓可能會(huì)沖擊GPIO導(dǎo)致?lián)p壞。

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

    關(guān)注

    16

    文章

    1204

    瀏覽量

    52104
  • 外部中斷
    +關(guān)注

    關(guān)注

    1

    文章

    131

    瀏覽量

    15826

原文標(biāo)題:STM32CubeMX教程-GPIO輸入之外部中斷

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    個(gè)GPIO如何配置成個(gè)外部中斷觸發(fā)源

    1STM32中斷分組STM32 的每個(gè)GPIO都能配置成個(gè)外部中斷觸發(fā)源,這點(diǎn)也是 STM3
    的頭像 發(fā)表于 01-25 08:44 ?1.6w次閱讀
    每<b class='flag-5'>一</b>個(gè)<b class='flag-5'>GPIO</b>如何配置成<b class='flag-5'>一</b>個(gè)<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>觸發(fā)源

    STM32 GPIO外部中斷設(shè)計(jì)

    輸入引腳,還可以通過(guò)另外種叫做外部中斷的方式來(lái)對(duì)引腳的輸入信號(hào)進(jìn)行檢測(cè),本篇首先介紹下EXTI
    發(fā)表于 04-14 10:51 ?2108次閱讀
    STM32 <b class='flag-5'>GPIO</b>的<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>設(shè)計(jì)

    詳細(xì)解析STM32的外部中斷

    說(shuō)明:本文旨在詳細(xì)解析STM32的外部中斷,以實(shí)現(xiàn)按鍵觸發(fā)外部中斷。其中包含“編程流程”、“程序代碼”、“代碼
    發(fā)表于 08-13 07:50

    GPIO外部中斷輸入檢測(cè)

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

    STM32GPIO外部中斷的詳細(xì)解析和總結(jié)

    TM32 的每個(gè)GPIO都能配置成個(gè)外部中斷觸發(fā)源,這點(diǎn)也是 STM32 的強(qiáng)大之處。STM32 通過(guò)根據(jù)引腳的序號(hào)不同將眾多
    的頭像 發(fā)表于 12-18 16:38 ?7.1w次閱讀
    STM32<b class='flag-5'>GPIO</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>的詳細(xì)<b class='flag-5'>解析</b>和總結(jié)

    英創(chuàng)信息技術(shù)用GPIO實(shí)現(xiàn)多路外部中斷及脈沖計(jì)數(shù)簡(jiǎn)介

    用途,而作為外部中斷輸入便是較常用的功能,通過(guò)對(duì)外部輸入中斷的響應(yīng),可以滿足多種應(yīng)用需求,脈沖計(jì)
    的頭像 發(fā)表于 02-11 16:58 ?1913次閱讀
    英創(chuàng)信息技術(shù)用<b class='flag-5'>GPIO</b>實(shí)現(xiàn)多路<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>及脈沖計(jì)數(shù)簡(jiǎn)介

    GPIO做輸出還能作外部中斷輸入嗎?

    我們這里要談的是基于硬件模式的外部中斷話題。當(dāng)STM32的GPIO作為輸出時(shí),可能是通用GPIO輸出也可能是基于其它外設(shè)復(fù)用情況下的輸出,即復(fù)用輸出。
    的頭像 發(fā)表于 07-05 10:42 ?4722次閱讀
    <b class='flag-5'>GPIO</b>做輸出還能作<b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>輸入</b>嗎?

    stm32外部中斷系列

    實(shí)現(xiàn)步驟1.如果串口中斷先配置串口,gpio中斷先配置gpio2.串口中斷組的選擇3.串口外部
    發(fā)表于 11-26 12:36 ?2次下載
    stm32<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>系列

    ZigBee的GPIO外部中斷原理

    、 cc2530最小系統(tǒng)二、GPIO概述三、IO口的輸入輸出配置上拉輸入:有上拉電阻? 按鍵未按下時(shí)端口接高電平,即高電平 1 狀態(tài)—3.3v
    發(fā)表于 11-30 11:51 ?11次下載
    ZigBee的<b class='flag-5'>GPIO</b>與<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>原理

    STM32CubeMX_環(huán)境搭建_GPIO_外部中斷

    STM32CubeMX_環(huán)境搭建_GPIO_外部中斷
    發(fā)表于 12-05 14:06 ?3次下載
    STM32CubeMX_環(huán)境搭建_<b class='flag-5'>GPIO</b>_<b class='flag-5'>外部</b><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><b class='flag-5'>中斷</b>)

    使用LL庫(kù)開發(fā)STM32:GPIO口與外部中斷

    文章目錄目的輸出與控制輸入與端口值讀取外部中斷總結(jié)目的GPIO口使用是單片機(jī)開發(fā)中最簡(jiǎn)單的塊,STM32的
    發(fā)表于 01-13 16:13 ?13次下載
    使用LL庫(kù)開發(fā)STM32:<b class='flag-5'>GPIO</b>口與<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32外部中斷

    事件(上升沿或下降沿或雙邊沿)并能夠單獨(dú)地屏蔽:有個(gè)掛起寄存器維持所有中斷請(qǐng)求的狀態(tài)。EXTI可以檢測(cè)到脈沖寬度小于內(nèi)部APB2的時(shí)鐘周期。多達(dá)80個(gè)通用IO口連接到16個(gè)外部
    發(fā)表于 01-14 15:14 ?2次下載
    STM32<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32的IO外部中斷EXTI的使用

    的方式訪問輸入引腳,還可以通過(guò)另外種叫做外部中斷的方式來(lái)對(duì)引腳的輸入信號(hào)進(jìn)行檢測(cè),本篇首先介紹
    的頭像 發(fā)表于 06-22 10:21 ?2044次閱讀
    STM32的IO<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>EXTI的使用

    如何配置GPIO中斷功能呢?

    如何在嵌入式系統(tǒng)中配置GPIO中斷功能。 、GPIO基礎(chǔ) GPIO是General Purpose Input/Output的縮寫,中文
    的頭像 發(fā)表于 10-30 09:57 ?3474次閱讀