深入解析STM32中斷機制:從原理到外部中斷實戰

知識點1【中斷的介紹】

單片機的中斷——硬件中斷

Linux操作系統的中斷——軟件中斷

中斷是指計算機運行過程中,出現某種意外情況需要主機干預,機器能自動停止正在運行的程序并轉入處理新情況的程序,處理完畢后有返回原本暫停的程序繼續運行。

1、程序中斷和簡單中斷

程序中斷:系統外部、內部或者現行程序本身若出現緊急事件,處理機立即中止現行程序的運行,自動轉入相應的中斷服務程序,待處理完畢后,再返回原來的程序運行,這整個過程稱為程序中斷

簡單中斷:當處理機接收中斷后,只需暫停一個或幾個周期而不執行對應的中斷服務函數,稱為簡單中斷

2、中斷相關的概念

中斷是一種硬件處理機制——一旦觸發,就不需要程序判斷,CPU內部自動執行。

中斷源:能夠觸發中斷的事件(如按鍵:按壓按鍵會產生一個跳變沿),串口的收發也可以觸發中斷。一旦中斷源被觸發,那么在芯片內部就會產生一個中斷請求。

事件:在中斷部分,我們在使用中斷之前,需要首先確定產生中斷的事件。

在單片機中不是所有的事件都可以觸發中斷的,在手冊中我們可以查到,那些事件可以觸發中斷。我們以串口為例

上圖便是USART能夠觸發中斷的請求。

中斷服務程序:一旦中斷觸發,CPU需要停止當前的任務,去執行其他的任務,我們稱其他任務為中斷服務程序。

優先級:當有多個中斷觸發的時候,中斷的處理順序——數字越大,優先級越低

中斷嵌套,在一個中斷中可以出發另一個中斷。

(1)中斷優先級

搶占優先級:決定一個中斷能否打斷當前正在執行的中斷

搶占優先級高的可以搶占搶占優先級低的中斷。 如果搶占優先級相同,則無法互相搶占

次級優先級:當多個中斷共享相同搶占優先級時,決定它們的處理順序

刺激優先級高的中斷先被處理,但不能打斷正在執行的同搶占優先級的中斷

次級優先級 是不具有打斷功能的。

那么 搶占優先級 和次級優先級是如何管理的呢?

是通過優先級分組 來管理的

(2)優先級分組

在ARM Cortex-M中,優先級數值的位數的分配是由 優先級分組 決定的。通過分組,可以分配搶占優先級次級優先級的位數。

NVIC(嵌套向量中斷控制器)

NVIC可配置的中斷最大數目是240,每個中斷的中斷優先級 是1-256級

如上圖使用8位來配置中斷優先級的

那么 如果小于八位是如何配置呢?

——通過犧牲低位來配置,如 如果配置4位,就只有4-7位有效

3、中斷注意事項:

終端服務函數中,不能出現死循環,也不能寫入大量的循環語句。

原則:快進快出

知識點2【外部中斷】

1、外部中斷框圖

流程介紹:

1、觸發條件判斷

外部中斷信號 通過輸入線進入,首先經過邊沿檢測電路,判斷是上邊沿,下邊沿還是雙邊沿觸發

判斷方式即是由上邊沿觸發選擇寄存器下邊沿觸發選擇寄存器決定。

2、經過 或門

軟件硬件都可以觸發中斷事件

3、事件屏蔽寄存器

用來選擇傳遞的中斷事件。

未被屏蔽的事件可以繼續傳遞到后續模塊

4、脈沖發生器

被篩選后的事件被轉換為單周期脈沖信號,發出 事件請求信號

以上兩個步驟是事件的處理流程,滿足事件不一定會觸發中斷,可能是為了實現其他功能。

5、中斷狀態記錄

請求掛起寄存器:鎖存當前有效的中斷請求狀態,知道處理器響應后清除

6、二次屏蔽

中斷屏蔽寄存器,通過APB總線 過濾請求,避免非使能中斷占用NVIC資源

2、外部中斷請求

外部中斷/事件控制器 是由19個產生事件/中斷請求邊沿檢測器組成

所以說:外部中斷,其實就是IO口跳變產生的中斷

知識點3【外部中斷配置寄存器介紹】

1、外部中斷配置寄存器

我們從上一張圖片可以看到,每一個外部中斷端口,都對應著很多個引腳如EXTI1對應這A1,B1……,因此我們需要配置其定義關系。

這里我們以外部中斷寄存器2為例

可見上面有EXTI4-EXTI7,那么可以這樣的寄存器一共4個。

注意

我們配置的時候,這個寄存器是按照數組的方式 來操作的。

詳細配置 看下面的代碼演示即可,很易理解,寫代碼的時候細心就好。

2、中斷屏蔽寄存器

這里是配置 哪一個中斷使能的

3、上 下邊沿寄存器

知識點4【外部中斷代碼演示】

exti.c

void Exit1_Key_Config()
{//配置時鐘:按鍵(PE4)和復用按鍵RCC->APB2ENR |= (0x01 << 0);RCC->APB2ENR |= (0x01 << 6);//中斷配置//由于映射到EXIT2的端口有很多,因此需要選擇AFIO->EXTICR[1] |= (0x04 << 0);//下邊沿觸發(線4)EXTI->FTSR |= (0x01 << 4);//中斷屏蔽設置EXTI->IMR |= (0x01 << 4);//NVIC配置NVIC_SetPriority(EXTI4_IRQn,0x06);NVIC_EnableIRQ(EXTI4_IRQn);
}//按鍵中斷服務函數
void EXTI4_IRQHandler(void)
{//中斷觸發條件判斷if(EXTI->PR & (0x01 << 4)){//清除中斷掛起位EXTI->PR &= ~(0x01 << 4);//執行中斷函數while(1){//延時消抖if((GPIOE->IDR & (0x01 << 4)) == 0){Delay_ms(40);if((GPIOE->IDR & (0x01 << 4)) == 0){while((GPIOE->IDR & (0x01 << 4)) == 0);printf("你好\\n");}}}}
}

main.c

#include "stm32f10x.h"   // 相當于51單片機中的  #include <reg51.h>
#include "stdio.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
int main(void)
{// 來到這里的時候,系統的時鐘已經被配置成72M?//第五組NVIC_SetPriorityGrouping(0X05);Exit1_Key_Config();Usart1_Config(9600);printf("USART1 is ok!!\\r\\n");while(1){		}}

代碼感悟

1、串口一次只能接收 / 發送一位數據

2、中斷服務函數 需要 軟件清除中斷標志位

3、外部中斷是通過 輔助接口(AFIO) 來設置的

知識點5【事件中斷】

首先我們要清楚,不是所有事件都能觸發中斷的,因此我們要實現知道那些事件能夠產生中斷,我們以串口為例。可以在寄存器手冊中查到。

可見,事件中斷觸發,的前提是 使能對應事件的中斷標志位,如當 接收事件完畢即RXNE被置位 后,并且軟件置為RXNEIE,會產生一個對應的串口中斷

在事件觸發,并且對應的中斷標志位被置位 的情況下,事件中斷就會被觸發,即會執行對應的中斷服務程序。

這里寄存器不過多介紹 我們直接進入實戰

知識點6【事件中斷代碼演示】

邏輯:

只有RXNE 被置位,且RXNEIE 被置位,才會發生中斷

我們知道串口每次接收到一個數據,RXNE會被置位,又由于我們循環軟件置為RXNEIE 是的接收數據中斷持續生效。

那么我們該如何判斷所有位的數據 都被接收呢

我們就需要利用串口的空閑中斷 即 IDLE狀態位,詳細大家看手冊。

這是我們就 引入一個flag位,當進入空閑狀態,flag置1,即接收全部數據完成。

代碼演示

exti.c文件

#include "exti.h"u8 over_flag=0;
u8 rev_data[64]={0};
u8 rev_count=0;
void USART1_IRQHandler(void)
{u8 data=0;if((USART1->SR &(0X01<<5))){USART1->SR &=~(0X01<<5);//進入了接收中斷,可以接受外部傳輸過來的數據rev_data[rev_count++]=USART1->DR;}//當數據接受完成的時候,就會進入空閑中斷if((USART1->SR &(0X01<<4))){USART1->SR &=~(0X01<<4);//清除空閑中斷標志data=USART1->DR;//設置一個接收完成的標志位over_flag=1;	}
}//中斷接受完成數據之后,在以下函數中處理數據void Usart1_CtrlLED(void)
{int i=0;if(over_flag==1){over_flag=0;//避免影響下一次的數據接收中斷//處理接收到的數據printf("接收到的數據個數:%d\\r\\n",rev_count);for(i=0;i<rev_count;i++){printf("rev_data[%d]=%x\\r\\n",i,rev_data[i]);}if(rev_data[0]==0xaa && rev_data[2]==0xff){//控制LED1if(rev_data[1]==0x11) GPIOB->ODR &=~(0X01<<5);else GPIOB->ODR |=(0X01<<5);}rev_count=0;memset(rev_data,0,sizeof(rev_data));}
}int fputc(int c, FILE * stream)
{while(!(USART1->SR &(0X01<<7)));USART1->DR=c;return c;	
}

main函數

#include "stm32f10x.h"   // 相當于51單片機中的  #include <reg51.h>
#include "stdio.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
int main(void)
{// 來到這里的時候,系統的時鐘已經被配置成72M?//第五組NVIC_SetPriorityGrouping(0X05);Led_Config();Usart1_Config(9600);printf("USART1 is ok!!\\r\\n");while(1){Usart1_RevInterrupt();Usart1_CtrlLED();}
}

結束

最近的分析是關于寄存器的,當然后面我會分享標準庫的,因為寄存器是基礎,我們先學習寄存器有利于我們深度理解后面標準庫的原理,我的分享是一個由繁入簡的過程,希望大家能夠理解。

補充:

? ? ? ? 這兩天由于身體狀態原因,沒有正常更新,但學習過程沒有間斷。大家也注意身體,畢竟身體是革命的本錢。

????????望體諒!

最后:

????????代碼重在練習!

????????代碼重在練習!

????????代碼重在練習!

今天的分享就到此結束了,希望對你有所幫助。如果你喜歡我的分享,請點贊收藏加關注,謝謝大家!!!

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

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

相關文章

【入門】打印字母塔

描述 輸入行數N,打印圖形. 輸入描述 輸入只有一行&#xff0c;包括1個整數。(N<15) 輸出描述 輸出有N行. #include <bits/stdc.h> using namespace std; int main() { char t;int n,f;cin>>n;for(int i1;i<n;i){tchar(65i);for(int j1;j<n-i;j){cout…

CentOS 7.9 安裝詳解:手動分區完全指南

CentOS 7.9 安裝詳解&#xff1a;手動分區完全指南 為什么需要手動分區&#xff1f;CentOS 7.9 基本分區說明1. /boot/efi 分區2. /boot 分區3. swap 交換分區4. / (根) 分區 可選分區&#xff08;進階設置&#xff09;5. /home 分區6. /var 分區7. /tmp 分區 分區方案建議標準…

油冷式電動滾筒設計:關鍵技術解析與應用前景

引言 電動滾筒作為一種集動力傳輸、減速和驅動功能于一體的機電一體化設備&#xff0c;在輸送機械、礦山設備、食品加工等領域廣泛應用。隨著工業設備向高效化、緊湊化和智能化發展&#xff0c;傳統風冷式電動滾筒的散熱效率與負載能力已逐漸難以滿足需求。油冷式電動滾筒憑借…

Android開發-Activity附加信息

在Android應用開發中&#xff0c;除了基本的界面跳轉和數據傳遞之外&#xff0c;我們還經常需要為Activity添加一些附加信息&#xff08;Metadata&#xff09;&#xff0c;以支持更復雜的配置需求或與系統進行交互。這些附加信息可以通過<meta-data>標簽在AndroidManifes…

2025第九屆御網杯網絡安全大賽線上賽 區域賽WP (MISC和Crypto)(詳解-思路-腳本)

蕪湖~ 御網杯線上分是越來越精細 區域賽都有了 然后不過多評價 整體不算難 以下是我自己的一些思路和解析 有什么問題或者建議隨時都可以聯系我 目錄 蕪湖~ MISC #被折疊的顯影圖紙 #光隙中的寄生密鑰 #ez_xor #套娃 #easy_misc #ez_pictre Crypto #easy簽到題 …

?中繼器:網絡中的“血包”與“加時器”?

在探討網絡技術時&#xff0c;我們往往會遇到各種專業術語和設備&#xff0c;中繼器便是其中之一。然而&#xff0c;對于非技術人員或初學者來說&#xff0c;這些概念可能顯得抽象且難以理解。今天&#xff0c;我將通過一個生動的比喻——將中繼器比作網絡中的“血包”與“加時…

MySQL----高級查詢

目錄標題 ?**多表查詢的格式**?**查詢前說明**一.**使用內連接**inner join**進行多表查詢****1.介紹****2.事例** 二.**使用外連接**outer join**進行多表查詢**1.**介紹** ?多表查詢的格式 其一 select *&#xff5c;字段列表 from 表1[查詢類型] join 表名2 on 連接條件…

SpringBoot主入口類分析

1 &#xff09;SpringBoot主入口類 SpringBoot 主入口類如下所示&#xff0c;這個類的main方法就是整個springboot項目的入口。 package com.example.demo3;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootA…

【RabbitMQ】 RabbitMQ高級特性(一)

文章目錄 一、消息確認1.1、消息確認機制1.2、手動確認方法1.2.1、AcknowledgeMode.NONE1.2.2、AcknowledgeMode.AUTO1.3.3、AcknowledgeMode.MANUAL 二、持久性2.1、 交換機持久化2.2、隊列持久化2.3、消息持久化 三、發送方確認3.1、confirm確認模式3.2、return退回模式3.3、…

探索Hello Robot開源移動操作機器人Stretch 3的技術亮點與市場定位

Hello Robot 推出的 Stretch 3 機器人憑借其前沿技術和多功能性在眾多產品中占據優勢。Stretch 3 機器人采用開源設計&#xff0c;為開發者提供了靈活的定制空間&#xff0c;能夠滿足各種不同的需求。其配備的靈活手腕組件和 Intel Realsense D405 攝像頭&#xff0c;顯著增強了…

expo多網絡請求設定。

在使用 npx expo start 啟動 Expo 開發服務器時&#xff0c;你可以通過設置網絡模式來控制你的應用如何連接到開發服務器。Expo 提供了幾種網絡模式供你選擇&#xff1a; LAN (Default): 這是默認模式。在這種模式下&#xff0c;你的應用會通過本地局域網 (LAN) 連接到你的開發…

Nginx 安全防護與HTTPS部署

目錄 一、核心安全配置 1、隱藏版本號 2、限制危險請求方法 3、請求限制&#xff08;CC攻擊防御&#xff09; &#xff08;1&#xff09;使用Nginx的limit_req模塊限制請求速率 &#xff08;2&#xff09;壓力測試驗證 4、防盜鏈 &#xff08;1&#xff09;修改 Window…

windows 環境下 python環境安裝與配置

運行環境安裝 第一步安裝包下載 python開發工具安裝包下載官網&#xff1a; https://www.python.org/ 根據自己的實際需求選擇。 這里記錄了各個版本的區別和差異。根據區別和差異選擇適合自己的版本。 Windows Installer和Windows embeddable package是兩種不同的軟件包類…

TB6600HG是一款PWM(脈寬調制)斬波型單芯片雙極性正弦波微步進電機驅動集成電路。

該驅動器支持電機的正向和反向旋轉控制&#xff0c;并具有多種激勵模式&#xff0c;包括2相、1-2相、W1-2相、2W1-2相和4W1-2相。 使用這款驅動器&#xff0c;只需時鐘信號即可驅動2相雙極性步進電機&#xff0c;且振動小、效率高。 主要特點&#xff1a; 單芯片雙極性正弦波…

【JS逆向基礎】爬蟲核心模塊:request模塊與包的概念

前言&#xff1a;這篇文章主要介紹JS逆向爬蟲中最常用的request模塊&#xff0c;然后引出一系列的模塊的概念&#xff0c;當然Python中其他比較常用的還有很多模塊&#xff0c;正是這些模塊也可以稱之為庫的東西構成了Python強大的生態&#xff0c;使其幾乎可以實現任何功能。下…

極狐Gitlab 里程碑功能介紹

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 里程碑 (BASIC ALL) 極狐GitLab 中的里程碑是一種跟蹤議題和合并請求的方法&#xff0c;這些請求是為了在特定時間段內實現更…

【日擼 Java 三百行】Day 10(綜合任務 1)

目錄 Day 10&#xff1a;綜合任務 1 一、題目分析 1. 數據結構 2. 相關函數基本知識 二、模塊介紹 1. 初始化與成績矩陣的構建 2. 創建總成績數組 3. 尋找成績極值 三、代碼與測試 小結 拓展&#xff1a;關于求極值的相關算法 Day 10&#xff1a;綜合任務 1 Task&…

c++:庫(Library)

目錄 什么是庫&#xff1f; C中庫的兩種形態&#xff1a;靜態庫 和 動態庫 靜態鏈接 vs 動態鏈接&#xff08;鏈接 ≠ 庫&#xff09; &#x1f512; 靜態鏈接&#xff08;Static Linking&#xff09; &#x1f517; 動態鏈接&#xff08;Dynamic Linking&#xff09; C標…

Java線程池深度解析:從使用到原理全面掌握

在高并發場景下&#xff0c;線程管理是提升系統性能的關鍵。本文將深入探討Java線程池的核心機制&#xff0c;帶你從基礎使用到底層實現全面掌握這一重要技術。 一、線程池存在的意義 1.1 線程的隱形成本 盡管線程相比進程更輕量&#xff0c;但當QPS達到萬級時&#xff1a; 頻…

PostgreSQL 的 pg_advisory_lock_shared 函數

PostgreSQL 的 pg_advisory_lock_shared 函數詳解 pg_advisory_lock_shared 是 PostgreSQL 提供的共享咨詢鎖函數&#xff0c;允許多個會話同時獲取相同鍵值的共享鎖&#xff0c;但排斥排他鎖。 共享咨詢鎖 vs 排他咨詢鎖 鎖類型共享鎖 (pg_advisory_lock_shared)排他鎖 (pg…