32單片機——外部中斷

STM32F103ZET6的系統中斷有10個,外部中斷有60個

1、中斷的概念

????????中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設置的,中斷功能的存在,很大程度上提高了單片機處理外部或內部事件的能力

? ? ? ? eg::你打開火, 燒上一壺水。然后去洗衣服,在洗衣服的過程中,突然聽到水壺發出水開的報警聲,這時,你停止洗衣服動作,立即去關掉火,然后將開水灌入暖水瓶中,灌完開水后,你又回去繼續洗衣服。這個過程中實際上就發生了一次中斷

????????對于單片機來講,中斷是指CPU在處理某一事件A時,發生了另一事件B,請求CPU迅速去處理(中斷發生);CPU暫時停止當前的工作(中斷響應),轉去處理事件B(中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷

2、中斷的作用和意義

作用:

? ? ? ? (1)實時控制

????????????????在確定時間內對相應事件作出響應,如:溫度監控

? ? ? ? (2)故障處理

????????????????檢測到故障,需要第一時間處理,如:電梯門夾人了

? ? ? ? (3)數據傳輸

????????????????不確定數據何時會來,如:串口數據接收

意義:高效處理緊急查詢,不會一直占用CPU資源

3、STM32 GPIO外部中斷簡圖

如下圖所示:

4、NVIC?

NVIC全稱Nested vectored interrupt controller,嵌套向量中斷控制器,屬于內核M3/4/7

NVIC支持:256個中斷(16內核 + 240外部),支持:256個優先級,允許裁剪!

NVIC相關的寄存器如下:

typedef struct{
? __IOM uint32_t ISER[8U]; ? ? ? ? ? ? ? /*??中斷使能寄存器? */
? ? ? ? uint32_t RESERVED0[24U];
? __IOM uint32_t ICER[8U]; ? ? ? ? ? ? ? /*??中斷除能寄存器? ?*/
? ? ? ? uint32_t RSERVED1[24U];
? __IOM uint32_t ISPR[8U]; ? ? ? ? ? ? ? /*? 中斷使能掛起控制寄存器? */
? ? ? ? uint32_t RESERVED2[24U];
? __IOM uint32_t ICPR[8U]; ? ? ? ? ? ? ? /*? 中斷解掛控制寄存器? */
? ? ? ? uint32_t RESERVED3[24U];
? __IOM uint32_t IABR[8U]; ? ? ? ? ? ? ? /*? 中斷激活標志位寄存器? */
? ? ? ? uint32_t RESERVED4[56U];
? __IOM uint8_t ?IP[240U]; ? ? ? ? ? ? ? /*??中斷優先級寄存器??*/
? ? ? ? uint32_t RESERVED5[644U];
? __OM ?uint32_t STIR; ? ? ? ? ? ? ? ? ? /*? 軟件觸發中斷寄存器? */
} ?NVIC_Type;?

4.1 中斷優先級

????????STM32 中的中斷優先級可以分為:搶占式優先級和響應優先級。響應優先級也稱子優先級 , 每個中斷源都需要被指定這兩種優先級?

(1)搶占優先級:搶占優先級高的中斷可以打斷正在執行的搶占優先級低的中斷

(2)響應優先級:搶占優先級相同,響應優先級高的先執行,但是不能互相打斷

(3)當兩個或者多個中斷的搶占式優先級和響應優先級相同時,那么就遵循自然優先級(硬件優先級)

數值越小,優先級越高搶占、響應和自然優先級都是如此

4.2 NVIC的使用

(1)設置中斷分組:

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_x);? ? ? ? //分組x,x:0~4

不用設置,默認有,在stm32f1xx_hal.c的文件中

(2)設置中斷優先級

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

①形參1:中斷號

????????例如:HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);

????????為什么例子中的形參1與聲明不同?

????????因為IRQn_Type是定義的枚舉,EXTI0_IRQn在枚舉中

②形參2:搶占優先級,可以選擇范圍:0到15

③形參3:響應優先級,可以選擇范圍:0到15

(3)使能中斷

HAL_NVIC_EnableIRQ(IRQn_Type IRQn);? ? ? ? //操作ISERx寄存器

5、EXTI

? ? ? ? EXTI是外部中斷或事件控制器,包含20個產生事件/中斷請求的邊沿檢測器,即總共:20條EXTI線(F1)

中斷和事件的區別:

? ? ? ? 中斷:要進入NVIC,有相應的中斷服務函數,需要CPU處理

? ? ? ? 事件:不進入NVIC,僅用于內部硬件自動控制,如:TIM、DMA、ADC

EXTI的主要特征:每條EXTI線都可以單獨配置:選擇類型(中斷或者事件)、觸發方式(上升沿,下降沿或者雙邊沿觸發)、支持軟件觸發、開啟/屏蔽、有掛起狀態位

5.1 工作原理

從上圖可以看到有兩條主線,一條是由輸入線到NVIC中斷控制器,一條是由輸入線到脈沖發生器。這就恰恰是EXTI的兩大部分功能:產生中斷和產生事件

(1)產生中斷的線路

? ? ? ? 標號①:邊沿檢測電路,包括邊沿檢測電路、上升沿觸發選擇寄存器(EXTI_RTSR)和下降沿觸發選擇寄存器(EXTI_FTSR)。以輸入線作為信號輸入端,如果檢測到有邊沿跳變就輸出有效信號‘1’到標號②部分電路,否則輸出無效信號‘0’

EXTI_RTSREXTI_FTSR邊沿檢測電路
00關閉
10有效信號是上升沿
01有效信號是下降沿
11雙邊沿

? ? ? ? 標號②:或門電路,只要輸入端有信號‘1’,就會輸出‘1’到標號③電路和標號④電路。它的兩個信號輸入端分別是軟件中斷事件寄存器(EXTI_SWIER)和邊沿檢測電路的輸入信號

? ? ? ? 標號③:與門電路,輸入都為‘1’才輸出‘1’。它的兩個信號輸入端分別是中斷屏蔽寄存器(EXTI_IMR)和標號②電路輸出信號,如果EXTI_IMR設置為0時,不管從標號②電路輸出的信號特性如何,最終標號③電路輸出的信號都是0;假如EXTI_IMR設置為1時,最終標號③電路輸出的信號才由標號②電路輸出信號決定。這樣子就可以簡單控制EXTI_IMR來實現中斷的目的,標號④電路輸出‘1’就會把請求掛起寄存器(EXTI_PR)對應位置1

(2)產生事件的線路

產生事件線路是從標號2之后與中斷線路有所不用,之前的線路都是共用的

????????標號④:與門電路。輸入端來自標號②電路以及事件屏蔽寄存器(EXTI_EMR)。如果EXTI_EMR寄存器設置為0,那不管標號②電路輸出的信號是‘0’還是‘1’,最終標號④輸出的是‘0’; 如果EXTI_EMR寄存器設置為1,最終標號④電路輸出信號就由標號②電路輸出的信號決定。通過控制EXTI_EMR來實現是否產生事件

????????標號④電路輸出有效信號‘1’就會使脈沖發生器電路產生一個脈沖,而無效信號就不會使其產生脈沖信號。脈沖信號產生可以給其他外設電路使用,例如定時器,模擬數字轉換器等?

(3)產生中斷線路和產生事件線路的目的

????????產生中斷線路目的使把輸入信號輸入到NVIC,進一步運行中斷服務函數,實現功能

????????產生事件線路目的是傳輸一個脈沖信號給其他外設使用,屬于硬件級功能

5.2 EXTI的HAL庫設置步驟(外部中斷)

(1)使能GPIO時鐘:__HAL_RCC_GPIOx_CLK_ENABLE();(x:A~E
(2)配置GPIO/AFIO/EXTI:HAL_GPIO_Init(GPIO_TypeDef ?*GPIOx, GPIO_InitTypeDef *GPIO_Init);
(3)設置中斷分組:HAL_NVIC_SetPriorityGrouping
(4)設置中斷優先級:HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
(5)使能中斷:HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

例子:exit初始化

void exit_init(void){
? ? GPIO_InitTypeDef g_exti_struct;
? ? //一、外部中斷--HAL庫配置
? ? //1、使能時鐘
? ? __HAL_RCC_GPIOA_CLK_ENABLE();
? ? __HAL_RCC_GPIOE_CLK_ENABLE();
? ? //2、配置GPIO/AFIO/EXTI
? ? ? ? //初始化KEY_UP
? ? g_exti_struct.Pin=GPIO_PIN_0;
? ? g_exti_struct.Mode=GPIO_MODE_IT_RISING; ?//上升沿觸發
? ? g_exti_struct.Pull=GPIO_PULLDOWN; ?//下拉
? ? g_exti_struct.Speed=GPIO_SPEED_FREQ_HIGH;
? ? HAL_GPIO_Init(GPIOA,&g_exti_struct);
? ? ? ? //初始化KEY0
? ? g_exti_struct.Pin=GPIO_PIN_4;
? ? g_exti_struct.Mode=GPIO_MODE_IT_FALLING; ?//下降沿觸發
? ? g_exti_struct.Pull=GPIO_PULLUP; ?//上拉
? ? HAL_GPIO_Init(GPIOE,&g_exti_struct);
? ? ? ? //初始化KEY1
? ? g_exti_struct.Pin=GPIO_PIN_3;
? ? g_exti_struct.Mode=GPIO_MODE_IT_FALLING; ?//下降沿觸發
? ? g_exti_struct.Pull=GPIO_PULLUP; ?//上拉
? ? HAL_GPIO_Init(GPIOE,&g_exti_struct);
? ? //3、設置優先級分組--不用設置,默認(main.c-->HAL_Init()下)有
? ? //4、設置優先級
? ? HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); ?//搶占優先級:2,響應優先級:0
? ? HAL_NVIC_SetPriority(EXTI4_IRQn,2,0); ?//搶占優先級:2,響應優先級:0
? ? HAL_NVIC_SetPriority(EXTI3_IRQn,2,0); ?//搶占優先級:2,響應優先級:0
? ? //5、使能中斷
? ? HAL_NVIC_EnableIRQ(EXTI0_IRQn);
? ? HAL_NVIC_EnableIRQ(EXTI4_IRQn);
? ? HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}

5.3 中斷服務處理機制

(1)中斷服務函數:在啟動文件中已經定義過了

(2)要調用中斷公共處理函數

(3)中斷回調函數:在這里編寫中斷處理的邏輯代碼

例子:與5.2的例子是一體的

//二、中斷服務處理機制
//1、中斷服務函數:在啟動文件中已經定義過了
? ? //KEY_UP
void EXTI0_IRQHandler(){
? ? //2、要調用中斷公共處理函數
? ? HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); ?//中斷公共處理函數
? ? __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); ?//清中斷
}
? ? //KEY0
void EXTI4_IRQHandler(){
? ? HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); ?//中斷公共處理函數
? ? __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4); ?//清中斷
}
? ? //KEY1
void EXTI3_IRQHandler(){
? ? HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); ?//中斷公共處理函數
? ? __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3); ?//清中斷
}
//3、中斷回調函數:在這里編寫中斷處理的邏輯代碼
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ ?//弱函數
? ? //消抖
? ? delay_ms(10);
? ? //判斷
? ? if(GPIO_Pin==GPIO_PIN_0){
? ? ? ? //KEY_UP ?控制LED0翻轉
? ? ? ? HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
? ? }else if(GPIO_Pin==GPIO_PIN_4){
? ? ? ? //KEY0 ?控制 LED1翻轉
? ? ? ? HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
? ? }else if(GPIO_Pin==GPIO_PIN_3){
? ? ? ? //KEY1 ?控制KEEP翻轉
? ? ? ? HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
? ? }
}

EXTI0_IRQHandler定義在啟動文件中,來源于startup_stm32f103xe.s第84行的DCD ? ? EXTI0_IRQHandler ? ? ? ? ? ; EXTI Line 0

HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)?;? ? ? ? //為中斷通用入口函數

作用:通過入口參數GPIO_Pin判斷中斷來自哪個IO口

#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__))

__HAL_GPIO_EXTI_CLEAR_IT定義在stm32f1xx_hal_gpio.h文件中,清中斷

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)????????//用__weak修飾的函數是弱函數,用戶可以重新定義
{
? /* 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
? ?*/
}? ? ? ??

HAL_GPIO_EXTI_Callback定義在stm32f1xx_hal_gpio.c文件中

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

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

相關文章

UG NX二次開發(C#)-獲取具有相同屬性名稱的體對象

文章目錄 1、前言2、在UG NX中的屬性的賦予3、通過UG NX二次開發獲取相同屬性的體對象1、前言 UG NX中每個對象都可以屬于屬性的,包括體、面、邊、特征、基準等。在QQ群中有個群有提出一個問題,就是獲取相同屬性的體對象,然后將這個體對象導出到一個part文件中。我們今天先…

手動實現legend 與 echarts圖交互 通過元素和js事件實現圖標某項的高亮 顯示與隱藏

通過html實現legend的樣式 提供調用echarts的api實現與echarts圖表交互的效果 實現餅圖element實現類似于legend與echartstu表交互效果 效果圖 配置代碼 <template><div style"height: 400px; width: 500px;background-color: #CCC;"><v-chart:opti…

SpringBoot與BookKeeper整合,實現金融級別的日志存儲系統

BookKeeper的優勢 高吞吐量和低延遲 分布式架構: Apache BookKeeper采用分布式的架構設計&#xff0c;能夠支持高并發的寫入和讀取操作。 批量寫入: 支持批量寫入日志條目&#xff0c;顯著提高寫入效率。 異步I/O: 使用異步I/O操作&#xff0c;減少等待時間&#xff0c;提升…

【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

當你在進行深度學習相關操作時&#xff0c;若因缺少本地的 CA 證書而無法下載資源&#xff0c;下面為你介紹幾種解決辦法&#xff1a; 方法一&#xff1a;更新 CA 證書 在大多數 Linux 發行版中&#xff0c;你可以使用包管理器來更新 CA 證書。例如&#xff0c;在基于 Debian…

Vue3中AbortController取消請求的用法詳解

在 Vue3 中&#xff0c;AbortController 用于取消 fetch 請求&#xff0c;避免組件卸載后仍執行異步操作導致的潛在問題&#xff08;如內存泄漏或更新已銷毀組件的狀態&#xff09;。以下是詳細用法和最佳實踐&#xff1a; 一、基本用法 創建 AbortController 實例 在組件 setu…

【刷題Day26】Linux命令、分段分頁和中斷(淺)

說下你常用的 Linux 命令&#xff1f; 文件與目錄操作&#xff1a; ls&#xff1a;列出當前目錄的文件和子目錄&#xff0c;常用參數如-l&#xff08;詳細信息&#xff09;、-a&#xff08;包括隱藏文件&#xff09;cd&#xff1a;切換目錄&#xff0c;用于在文件系統中導航m…

Spring Boot 參考文檔導航手冊

&#x1f4da; Spring Boot 參考文檔導航手冊 &#x1f5fa;? ? 新手入門 &#x1f476; 1?? &#x1f4d6; 基礎入門&#xff1a;概述文檔 | 環境要求 | 安裝指南 2?? &#x1f527; 實操教程&#xff1a;上篇 | 下篇 3?? &#x1f680; 示例運行&#xff1a;基礎篇 …

卷積神經網絡(CNN)詳細教程

卷積神經網絡&#xff08;CNN&#xff09;詳細教程 一、引言 卷積神經網絡&#xff08;Convolutional Neural Networks, CNN&#xff09;是一種深度學習模型&#xff0c;廣泛應用于圖像識別、視頻分析、自然語言處理等領域。CNN通過模擬人類視覺系統的層次結構&#xff0c;能夠…

解決SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption faile的問題

問題描述&#xff1a; 在pip安裝第三方庫時&#xff0c;出現SSL的問題。 傳輸層安全性協議&#xff08;TLS&#xff09;及其前身安全套接層&#xff08;SSL&#xff09;是現在的 HTTPS 協議中的一種安全協議&#xff0c;目的是為互聯網通信提供安全及數據完整性保障。而較新版…

SpringBoot程序的創建以及特點,配置文件,LogBack記錄日志,配置過濾器、攔截器、全局異常

目錄 一、創建一個SpringBoot程序 二、SpringBoot的特點 ①主要特點 ②其他特點 ③熱部署 啟動熱部署 關閉熱部署 三、SpringBoot的配置文件 ①SpringBoot三種配置文件的格式&#xff08;以設置端口號為例&#xff09;&#xff1a; ②配置文件的優先級 ③常見配置項 1…

i18n-ai-translate開源程序,可以使用DeepSeek等模型將您的 i18nJSON翻譯成任何語言

一、軟件介紹 文末提供程序和源碼下載 i18n-ai-translate開源程序使用 DeepSeek等模型可以將您的 i18n JSON 翻譯成任何語言。 無縫翻譯本地化文件。支持嵌套翻譯文件的目錄。需要i18next樣式的JSON 文件&#xff08;文末一并提供下載&#xff09;。 二、模式 CSV 模式 三個…

Flask + ajax上傳文件(一)--單文件上傳

一、概述 本教程將教你如何使用Flask后端和AJAX前端實現文件上傳功能,包含完整的代碼實現和詳細解釋。 二、環境準備 1. 所需工具和庫 Python 3.xFlask框架jQuery庫Bootstrap(可選,用于美化界面)2. 安裝Flask pip install flask三、項目結構 upload_project/ ├── a…

如何在 Postman 中,自動獲取 Token 并將其賦值到環境變量

在 Postman 中&#xff0c;你可以通過 預請求腳本&#xff08;Pre-request Script&#xff09; 和 測試腳本&#xff08;Tests&#xff09; 實現自動獲取 Token 并將其賦值到環境變量&#xff0c;下面是完整的操作步驟&#xff1a; ? 一、創建獲取 Token 的請求 通常這個請求…

北斗導航 | 基于Transformer+LSTM+激光雷達的接收機自主完好性監測算法研究

基于Transformer+LSTM+激光雷達的接收機自主完好性監測算法研究 接收機自主完好性監測(RAIM)是保障全球導航衛星系統(GNSS)定位可靠性的核心技術。傳統RAIM算法依賴最小二乘殘差法,存在故障漏檢、對復雜環境適應性差等問題。結合Transformer、LSTM與激光雷達的多模態融合…

基于Python爬蟲的豆瓣電影信息爬取(可以根據選擇電影編號得到需要的電影信息)

# 豆瓣電影信息爬蟲(展示效果如下圖所示:) 這是一個功能強大的豆瓣電影信息爬蟲程序,可以獲取豆瓣電影 Top 250 的詳細信息。 ## 功能特點 - 自動爬取豆瓣電影 Top 250 的所有電影信息 - 支持分頁獲取,每頁 25 部電影,共 10 頁 - 獲取每部電影的詳細信息,包括: - 標題…

Ubuntu22.04/24.04 P104-100 安裝驅動和 CUDA Toolkit

硬件環境 使用一塊技嘉 B85m-DS3H 安裝 P104-100, CPU是帶集成顯卡的i5-4690. 先在BIOS中設置好顯示設備優先使用集成顯卡(IGX). 然后安裝P104-100開機. 登入Ubuntu 后查看硬件信息, 檢查P104-100是否已經被檢測到 # PCI設備 lspci -v | grep -i nvidia lspci | grep NVIDIA …

東南亞與中東小游戲市場出海調研報告

東南亞與中東小游戲市場出海調研報告 目標市場篩選與概況 (The Gaming Market in Southeast Asia (SEA) | Allcorrect)圖:2018–2027年東南亞主要國家游戲市場收入(億美元)趨勢。到2024年東南亞游戲市場規模預計將接近300億美元 (2024年東南亞手游市場怎么樣? - 快出海問…

力扣4-最長公共前綴

一.題目 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 輸入&#xff1a;strs ["flower","flow","flight"] 輸出&#xff1a;"fl"示例 2&…

設計模式和單一原則筆記

單一原則&#xff1a;方法 對象 策略模式&#xff1a;方法實現 // 策略接口&#xff08;單一職責&#xff1a;定義計算規范&#xff09; public interface PriceStrategy {boolean match(String type); // 職責1&#xff1a;判斷是否適用該策略double calculate(double pric…

常見正則表達式整理與Java使用正則表達式的例子

一、常見正則表達式整理 1. 基礎驗證類 郵箱地址 ^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\\.[a-zA-Z]{2,}$ &#xff08;匹配如 userexample.com&#xff09;手機號 ^1[3-9]\\\\d{9}$ &#xff08;匹配國內11位手機號&#xff0c;如 13812345678&#xff09;中文字符 ^[\u4e00-\u9fa5…