那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

STM32嵌入式開發 ? 來源:CSDN博客_ ? 作者:CSDN博客_ ? 2020-08-31 11:46 ? 次閱讀

本篇主要講述GPIO外部中斷輸入檢測,實際物理輸入方式是按鍵,但是實際上更適合外部設備信號的輸入檢測,物理按鍵輸入因為有抖動,還需要硬件或者軟件去抖才比較可靠。這個例子不考慮防抖的情況。

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

硬件:OneNet 麒麟座V2.3

在STM32CubeMX中新建項目,選擇正確的MCU型號

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

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

GPIO OUTPUT引腳設置

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

LED名稱標號我用了1/2/3/4,SW名稱標號我用了2/3/4/5,實例中標號也未必相同,但是要做好一一對應關系。

在NVIC(嵌套向量中斷控制器)中,勾選EXIT Line2 interrupt 和 EXIT Line[15:12] interrupt 使能中斷。右邊兩個選項設置搶占優先級和響應優先級。此處我們選擇默認的,不修改。

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

勾選這里。

生成代碼后點擊Open Project在Eclipse中打開項目,然后在在stm32f7xx_it.c中斷服務函數文件中,我們可以找到EXTI2 和EXTI15_10中斷的服務函數。

/******************************************************************************//* 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 */}

右鍵點擊HAL_GPIO_EXTI_IRQHandler 選擇"Open Declaration"會跳轉到如下代碼:

/***@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外部中斷處理函數首先清除中斷標識位,然后調用中斷回調函數HAL_GPIO_EXTI_Callback()。往下看這個回調函數定義的時候使用了__weak修飾符(關于__weak修飾符, 可以參看此博文),里面沒有任何有作用的代碼,我們需要重新定義這個函數。編輯gpio.c(或者main.c也可以),進行如下修改:

/* 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 */

然后右鍵點擊項目,選擇Properties, Run-Debug Settings, 點擊右側的New,在彈出對話框中選擇Ac6 STM32 Debugging。

然后任務欄上點擊Run圖,當然會報錯的,原因請查看另一篇我的博客,所以需要右鍵點擊 項目名Run.cfg ,給它改個名字,

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

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

然后右鍵點擊那個新的cfg文件,選擇"Open With - Text Editor", 進行如下更改:

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

Run一下,就可以了。然后再Run一下,就實現四個按鍵分別控制LED的開關切換了。但是這里沒有防抖處理,你會發現有時候LED會閃一下,或者沒反應,其實是很快地點亮然后熄滅一次或者若干次,只是由于速度太快電流很小導致你看不到。下一篇我們會通過使用SysTick中斷來實現按鍵去抖掃描。在實際項目中,最好加上硬件防抖,因為抖動產生的反向電壓可能會沖擊GPIO導致損壞。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GPIO
    +關注

    關注

    16

    文章

    1216

    瀏覽量

    52377
  • 外部中斷
    +關注

    關注

    1

    文章

    132

    瀏覽量

    15886

原文標題:STM32CubeMX教程-GPIO輸入之外部中斷

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    GPIO如何配置成外部中斷觸發源

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

    STM32 GPIO外部中斷設計

    輸入引腳,還可以通過另外種叫做外部中斷的方式來對引腳的輸入信號進行檢測,本篇首先介紹下EXTI
    發表于 04-14 10:51 ?2214次閱讀
    STM32 <b class='flag-5'>GPIO</b>的<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>設計

    詳細解析STM32的外部中斷

    說明:本文旨在詳細解析STM32的外部中斷,以實現按鍵觸發外部中斷。其中包含“編程流程”、“程序代碼”、“代碼
    發表于 08-13 07:50

    GPIO外部中斷輸入檢測

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

    STM32GPIO外部中斷的詳細解析和總結

    TM32 的每GPIO都能配置成外部中斷觸發源,這點也是 STM32 的強大之處。STM32 通過根據引腳的序號不同將眾多
    的頭像 發表于 12-18 16:38 ?7.1w次閱讀
    STM32<b class='flag-5'>GPIO</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>的詳細<b class='flag-5'>解析</b>和總結

    英創信息技術用GPIO實現多路外部中斷及脈沖計數簡介

    用途,而作為外部中斷輸入便是較常用的功能,通過對外部輸入中斷的響應,可以滿足多種應用需求,脈沖計
    的頭像 發表于 02-11 16:58 ?1955次閱讀
    英創信息技術用<b class='flag-5'>GPIO</b>實現多路<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>及脈沖計數簡介

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

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

    stm32外部中斷系列

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

    ZigBee的GPIO外部中斷原理

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

    STM32CubeMX_環境搭建_GPIO_外部中斷

    STM32CubeMX_環境搭建_GPIO_外部中斷
    發表于 12-05 14:06 ?3次下載
    STM32CubeMX_環境搭建_<b class='flag-5'>GPIO</b>_<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

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

    STM32基本GPIO操作:按鍵輸入(掃描+外部中斷)本文章向大家介紹STM32基本GPIO操作:按鍵
    發表于 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庫開發STM32:GPIO口與外部中斷

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

    STM32外部中斷

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

    STM32的IO外部中斷EXTI的使用

    的方式訪問輸入引腳,還可以通過另外種叫做外部中斷的方式來對引腳的輸入信號進行檢測,本篇首先介紹
    的頭像 發表于 06-22 10:21 ?2207次閱讀
    STM32的IO<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>EXTI的使用

    如何配置GPIO中斷功能呢?

    如何在嵌入式系統中配置GPIO中斷功能。 GPIO基礎 GPIO是General Purpose Input/Output的縮寫,中文
    的頭像 發表于 10-30 09:57 ?3530次閱讀
    威尼斯人娱乐场 新世纪| 百家乐官网游戏机技| 百家乐游戏官网| 东方夏威夷娱乐| 至尊百家乐官网20| 博e百娱乐城注册| 可以玩百家乐官网的博彩网站| 足球.百家乐官网投注网出租| 重庆百家乐的玩法技巧和规则| 真钱百家乐官网哪里最好| 华坪县| 错那县| 长子县| 梦幻城百家乐的玩法技巧和规则| 百家乐手机版| 华侨人百家乐的玩法技巧和规则| 百家乐技巧开户| 永利赌场| 犍为县| 大发娱乐城开户| 鼎龙国际娱乐城| 百家乐官网必胜下注法| 百家乐官网自动投注| 罗盘对应24宿| 百家乐赌博大揭密| 边城棋牌中心| 百家乐官网图形的秘密破解| 绥芬河市| 百家乐官网咋个玩的| 宝马会百家乐娱乐城| 墨尔本百家乐官网的玩法技巧和规则 | 做生意什么花招财| 正安县| 大发888游戏官网| 澳门百家乐游戏说明| 百家乐官网真人游戏攻略| 内丘县| 巴登娱乐城信誉怎么样| 可信百家乐的玩法技巧和规则 | 盈乐博| 桐城太阳城招聘|