STM32——外部中斷

文章目錄

    • 0.中斷關系映射
    • 1.使能 IO 口時鐘,初始化 IO 口為輸入
    • 2.設置 IO 口模式,觸發條件,開啟 SYSCFG 時鐘,設置 IO 口與中斷線的映射關系。
    • 3.配置NVIC優先級管理,并使能中斷
    • 4.編寫中斷服務函數。
    • 5.編寫中斷處理回調函數 HAL_GPIO_EXTI_Callback

0.中斷關系映射

STM32F103 的中斷控制器支持 19
個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。
STM32F103 的 19 個外部中斷為:
EXTI 線 0~15:對應外部 IO 口的輸入中斷。
EXTI 線 16:連接到 PVD 輸出。
EXTI 線 17:連接到 RTC 鬧鐘事件。
EXTI 線 18:連接到 USB 喚醒事件。
EXTI 線 19:連接到以太網喚醒事件。
從上面可以看出,STM32F1 供 IO 口使用的中斷線只有 16 個,但是 STM32F1 的 IO 口卻 遠遠不止 16 個,那么 STM32F1 是怎么把 16 個中斷線和 IO 口一一對應起來的呢?于是 STM32 就這樣設計,GPIO 的管教 GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G,H,I)分別對應中斷線 0~15。這 樣每個中斷線對應了最多 9 個 IO 口,以線 0 為例:它對應了 GPIOA.0、GPIOB.0、GPIOC.0、 GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中斷線每次只能連接到 1 個 IO 口上,這樣就需要 通過配置來決定對應的中斷線配置到哪個 GPIO 上了。下面我們看看 GPIO 跟中斷線的映射關系圖:
在這里插入圖片描述

1.使能 IO 口時鐘,初始化 IO 口為輸入

__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();

2.設置 IO 口模式,觸發條件,開啟 SYSCFG 時鐘,設置 IO 口與中斷線的映射關系。

GPIO_InitTypeDef GPIO_Initure; 
GPIO_Initure.Pin=GPIO_PIN_0; //PA0 
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //外部中斷,上升沿觸發 
GPIO_Initure.Pull=GPIO_PULLDOWN; //默認下拉 
HAL_GPIO_Init(GPIOA,&GPIO_Initure); 

當我們調用 HAL_GPIO_Init 設置 IO 的 Mode 值為 GPIO_MODE_IT_RISING(外部中斷上 升 沿 觸 發 ), GPIO_MODE_IT_FALLING ( 外 部 中 斷 下 降 沿 觸 發 ) 或 者 GPIO_MODE_IT_RISING_FALLING(外部中斷雙邊沿觸發)的時候,該函數內部會通過判斷 Mode 的值來開啟 SYSCFG 時鐘,并且設置 IO 口和中斷線的映射關系。
此時如果有新的IO口在同一條中斷線上映射,后面的會覆蓋前面的,比如,此時PA0已經初始化了上升沿觸發的中斷線0,如果再配置PB0,就會清除PA0的中斷配置,改為PB0,

3.配置NVIC優先級管理,并使能中斷

HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //搶占優先級為 2,子優先級為 0 
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中斷線 2 

4.編寫中斷服務函數。

我們配置完中斷優先級之后,接著要做的就是編寫中斷服務函數。中斷服務函數的名字是
在 HAL 庫中事先有定義的。這里需要說明一下,STM32F1 的 IO 口外部中斷函數只有 7 個,分
別為:

void EXTI0_IRQHandler(); 
void EXTI1_IRQHandler(); 
void EXTI2_IRQHandler(); 
void EXTI3_IRQHandler(); 
void EXTI4_IRQHandler(); 
void EXTI9_5_IRQHandler(); 
void EXTI15_10_IRQHandler(); 

中斷線 0-4 每個中斷線對應一個中斷函數,中斷線 5-9 共用中斷函數 EXTI9_5_IRQHandler,中
斷線 10-15 共用中斷函數 EXTI15_10_IRQHandler

5.編寫中斷處理回調函數 HAL_GPIO_EXTI_Callback

我之前使用標準庫開發的時候,對中斷服務函數中直接編寫邏輯,清除中斷標志位,然后寫中斷對應的引腳功能。但是HAL庫對后面所說的“中斷對應引腳功能代碼編寫”又進行了庫函數的封裝,即HAL_GPIO_EXIT_Callback()回調函數。
那么在HAL庫中的中斷服務函數是:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 
{ if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); HAL_GPIO_EXTI_Callback(GPIO_Pin); } 
} 

然后我們把中斷功能的編寫寫在Callback回調函數中。
這個中斷標志位是在中斷觸發的時候,硬件中斷控制器就會設置中斷標志位,我們進入中斷服務函數先將中斷標志位清除,表示正在處理這個中斷,防止重復觸發同一個中斷,保證這個中斷每次響應后只處理一次。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163792.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163792.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163792.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot多數據源集成

springboot多數據源集成 1、添加依賴2、添加配置3、代碼使用4、動態切換數據庫 1、添加依賴 <!--多數據源--> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version…

[個人筆記] Windows的IT運維筆記

IT技術 - 運維篇 第二章 Windows的IT運維筆記 IT技術 - 運維篇系列文章回顧一、Windows10專業版添加gpedit.msc二、海康威視前端頁面導出通道名稱參考鏈接 系列文章回顧 第一章 快速下載微軟評估版本鏡像的方法 一、Windows10專業版添加gpedit.msc 執行以下bat腳本 echo off…

Rust使用iced構建UI時,如何在界面顯示中文字符

注&#xff1a;此文適合于對rust有一些了解的朋友 iced是一個跨平臺的GUI庫&#xff0c;用于為rust語言程序構建UI界面。 iced的基本邏輯是&#xff1a; UI交互產生消息message&#xff0c;message傳遞給后臺的update&#xff0c;在這個函數中編寫邏輯&#xff0c;然后通過…

護法革命:CIMIVO+SOTUY洗前發膜讓發絲重獲“芯”生

愛美之心人皆有之,經常燙染或者是在太陽下暴曬,都會對發絲造成一定的傷害,一旦發絲受損,就會導致發芯內部角蛋白流失、化學鍵連接斷裂,進而出現各種發質問題。為此,日本知名化妝品集團NABOCUL旗下發芯修護引領品牌ENNEO創新研發兩大核心成分:CIMIVO、SOTUY,能夠從根源修護發芯內…

EXCEL小技巧

1、兩列文本合并顯示&#xff1a; CONCATENATE(B6,E6) &#xff08;如果顯示公式而非文本&#xff0c;就是公式輸錯了&#xff0c;比如后缺少空格&#xff09;

mac 終端配置

Mac iTerm2 配置 安裝 brew install iTerm2安裝完成之后&#xff0c;需要重新打開終端&#xff0c;既可以看見安裝 iTerm2 的效果。 iTerm2 美化 使用 oh-my-zsh 美化 iTerm2 終端 安裝 brew install wget sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/mast…

宇宙工具箱:辦公娛樂兩不誤堪稱手機的百寶箱

宇宙工具箱 宇宙工具箱&#xff0c;提供大量實用工具&#xff0c;多種類型盡在其中&#xff0c;支持圖片/視頻處理、計算、查詢、娛樂等多方內容&#xff0c;滿足用戶使用需求&#xff0c;超多工具直接使用。 獲取資源 詳細獲取地址請點擊 宇宙工具箱 功能特點 1、計算工具…

【硬核HeyGen平替】在window平臺上使用MyHeyGen

最近在研究HeyGen的平替開源項目&#xff0c;然后發現了MyHeyGen這個項目&#xff0c;但是文檔上面并沒有說明如果在window平臺上使用&#xff0c;考慮到非window平臺安裝顯卡驅動什么的比較繁瑣&#xff0c;所以嘗試硬著頭皮干... 前提 開源項目中所需的環境準備要先準備好 1…

測試15k薪資第1步 —— 自動化測試理論基礎

目錄 1、自動化測試定義 2、自動化測試分類&工具 3、未來發展趨勢 1.1、什么是自動化測試 自動化測試指的是利用軟件工具或腳本來執行測試任務&#xff0c;以替代手動測試過程的一種測試方法。它的主要目的是通過自動化執行、驗證和評估軟件應用的功能、穩定性、性能等方面…

Kotlin(十一) 標準函數with、run和apply

with with函數接收兩個參數&#xff1a;第一個參數可以是一個任意類型的對象&#xff0c;第二個參數是一個Lambda表達式。with函數會在Lambda表達式中提供第一個參數對象的上下文&#xff0c;并使用Lambda表達式中的最后一行代碼作為返回值返回。示例代碼如下&#xff1a; va…

python常用第三方模塊 --- Pyinstaller(把程序打包成可執行程序)

打包方法&#xff1a; 在cmd下進行 pyinstaller -F 路徑/程序文件名 注意&#xff1a;使用pyinstaller之前需要安裝 pip install pyinstaller

ELK架構

經典的ELK 經典的ELK主要是由Filebeat Logstash Elasticsearch Kibana組成&#xff0c;如下圖&#xff1a;&#xff08;早期的ELK只有Logstash Elasticsearch Kibana&#xff09; 此架構主要適用于數據量小的開發環境&#xff0c;存在數據丟失的危險。 整合消息隊列Ngin…

如何用網格交易做ETF套利

ETF套利是指利用ETF基金的交易機制&#xff0c;通過短期的買賣差價或組合投資來獲取利潤。 具體來說&#xff0c;ETF套利最常用的套利方法則是&#xff1a;價格套利和波動套利。 1. 價格套利&#xff1a;當ETF二級市場的價格與一級市場的凈值出現偏差時&#xff0c;投資者可以通…

【SwiftUI】7.預覽及其內部機制

上一篇講到了組件及組件化&#xff0c;從概念和優/缺點兩個方向說明了組件化的意義&#xff0c;更為重要的是&#xff0c;組件和組件化是一個在編程領域&#xff0c;放之四海皆可以的概念&#xff0c;理解和運用它是非常必要的&#xff0c;希望大家能掌握。今天我們介紹另一個特…

Element UI的Tabs 標簽頁位置導航欄去除線條

在實際開發中&#xff0c;我們調整了相關樣式&#xff0c;導致導航欄的相關樣式跟隨不上&#xff0c;如下圖所示&#xff1a; 因為我跳轉了前邊文字的樣式并以在導航欄添加了相關頭像&#xff0c;導致右邊的線條定位出現問題&#xff0c;我在想&#xff0c;要不我繼續調整右邊…

開發B2B商城的意義

開發B2B商城的意義主要體現在以下幾個方面&#xff1a; 采購成本低&#xff1a;利用互聯網采購&#xff0c;B2B商城的采購商可直接通過線上完成全部流程操作&#xff0c;在提高采購效率的同時&#xff0c;大大降低了B2B工業品企業采購成本。推廣優勢大&#xff1a;B2B商城的曝…

YM5411 WIFI 5模塊 完美替代AP6256

YM5411是沃特沃德推出的一款低成本&#xff0c;低功耗的模塊&#xff0c;該模塊具有Wi-Fi&#xff08;2.4GHz和5GHz IEEE 802.11 a/b/g/n/ac&#xff09;藍牙&#xff08;BT5.0&#xff09;功能&#xff0c;并通過了SRRC認證&#xff0c;帶mesh&#xff0c;完美替換AP6256。高度…

OpenHarmony之NAPI框架介紹

張志成 誠邁科技高級技術專家 NAPI是什么 NAPI的概念源自Nodejs&#xff0c;為了實現javascript腳本與C庫之間的相互調用&#xff0c;Nodejs對V8引擎的api做了一層封裝&#xff0c;稱為NAPI。可以在Nodejs官網&#xff08;https://nodejs.org/dist/latest-v20.x/docs/api/n-api…

【python爬蟲】scrapy在pycharm 調試

scrapy在pycharm 調試 1、使用scrapy創建一個項目 scrapy startproject tutorial 2、在朋友pycharm中調試scrapy 2.1 通過文件run.py調試 在根目錄下新建一個文件run.py(與scrapy.cfg文件的同一目錄下), debug ‘run’即可 # -*- coding:utf-8 -*- from scrapy import c…

深入淺出理解libevent——2萬字總結

概述 libevent,libev,libuv都是c實現的異步事件庫&#xff0c;注冊異步事件&#xff0c;檢測異步事件&#xff0c;根據事件的觸發先后順序&#xff0c;調用相對應回調函數處理事件。處理的事件包括&#xff1a;網絡 io 事件、定時事件以及信號事件。這三個事件驅動著服務器的運…