STM32-EXTI外部中斷

目錄

一、中斷系統

二、STM32中斷

三、NVIC(嵌套中斷向量控制器)基本結構

四、NVIC優先級分組

五、EXTI外部中斷

5.1 外部中斷基本知識

5.2 外部中斷(EXTI)基本結構

?編輯

5.2.1開發步驟:?

5.3 AFIO復用IO口

5.4 EXTI內部框圖

六、AFIO庫函數

七、EXTI庫函數?

八、NVIC庫函數

九、中斷函數

以上函數具體使用請參考”第十章、實驗“?

十、實驗

10.1對射式紅外傳感器計次

10.2旋轉編碼器計次

十一、中斷編程建議


一、中斷系統

中斷:在主程序運行過程中,出現了特定的中斷觸發條件(中斷源),使得CPU暫停當前正在運行的程序,轉而去處理中斷程序,處理完成后又返回原來被暫停的位置繼續運行

中斷優先級:當有多個中斷源同時申請中斷時,CPU會根據中斷源的輕重緩急進行裁決,優先響應更加緊急的中斷源

中斷嵌套:當一個中斷程序正在運行時,又有新的更高優先級的中斷源申請中斷,CPU再次暫停當前中斷程序,轉而去處理新的中斷程序,處理完成后依次進行返回

二、STM32中斷

?68個可屏蔽中斷通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多個外設

使用NVIC統一管理中斷,每個中斷通道都擁有16個可編程的優先等級,可對優先級進行分組,進一步設置搶占優先級和響應優先級

三、NVIC(嵌套中斷向量控制器)基本結構

作用:統一分配中斷優先級和管理中斷

四、NVIC優先級分組

NVIC的中斷優先級由優先級寄存器的4位(0~15)決定,這4位可以進行切分,分為高n位的搶占優先級和低4-n位的響應優先級

搶占優先級高的可以中斷嵌套,響應優先級高的可以優先排隊,搶占優先級和響應優先級均相同的按中斷號排隊

五、EXTI外部中斷

5.1 外部中斷基本知識

①EXTI(Extern Interrupt)外部中斷

②EXTI可以監測指定GPIO口的電平信號,當其指定的GPIO口產生電平變化時,EXTI將立即向NVIC發出中斷申請,經過NVIC裁決后即可中斷CPU主程序,使CPU執行EXTI對應的中斷程序
③支持的觸發方式:上升沿/下降沿/雙邊沿/軟件觸發
④支持的GPIO口:所有GPIO口,但相同的Pin不能同時觸發中斷
⑤通道數:16個GPIO_Pin,外加PVD輸出、RTC鬧鐘、USB喚醒、以太網喚醒
⑥觸發響應方式:中斷響應/事件響應

中斷響應:引腳電平變化觸發中斷

事件響應:不觸發中斷,觸發其他外設操作

5.2 外部中斷(EXTI)基本結構

5.2.1開發步驟:?

①配置RCC,把涉及到的外設時鐘都打開

②配置GPIO,選擇端口為輸入模式

③配置AFIO,選擇用的某一路GPIO,連接到后面的EXTI

④配置EXTI,選擇邊沿觸發方式、觸發響應方式(中斷響應/事件響應)

⑤配置NVIC,給中斷選擇合適的優先級

5.3 AFIO復用IO口

AFIO主要用于引腳復用功能的選擇和重定義

在STM32中,AFIO主要完成兩個任務:復用功能引腳重映射、中斷引腳選擇

5.4 EXTI內部框圖

六、AFIO庫函數

void GPIO_AFIODeInit(void);//復位AFIO

//配置AFIO事件輸出功能

void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);

/*下面兩個重要*/
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

//引腳重映射,第一個參數:重映射的方式;第二個參數:新的狀態
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

//配置AFIO的數據選擇器,本節中斷用到的函數


void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

//以太網相關

AFIO中斷選擇函數詳解

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);?

第一個參數:GPIO_PortSourceGPIOx where x can be (A..G)

第二個參數:GPIO_PinSourcex where x can be (0..15)

七、EXTI庫函數?

void EXTI_DeInit(void);//清除所有EXTI配置,復位
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//結構體方式初始化EXTI
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//給結構體變量賦默認值


void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//軟件觸發外部中斷

/*主函數查看和清除標志位*/
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//獲取指定標志位是否被置1
void EXTI_ClearFlag(uint32_t EXTI_Line);//對置1的標志位清除

/*中斷函數查看和清除標志位*/
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

八、NVIC庫函數

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//中斷分組的方式,整個芯片只能用一種,最好放在主函數中
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//結構體方式初始化NVIC

/*下面兩個不常用*/
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//設置中斷向量表
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);//系統低功耗配置

九、中斷函數

每個通道對應一個中斷函數,在啟動文件中可查看

開發技巧:

在中斷函數中,先進行中斷標志位的判斷,確保是我們想要的中斷源觸發的函數;然后再使用清除標志位函數清除,否則會一直執行中斷函數,在中斷函數里卡死。

以上函數具體使用請參考”第十章、實驗“?

十、實驗

10.1對射式紅外傳感器計次

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1,1 ,"Count:");while (1){OLED_ShowNum(1,7,CountSensor_Get(),5);}
}

CountSensor.c

#include "stm32f10x.h"                  // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void)
{/*一、開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟APB2時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//開啟AFIO時鐘/*二、GPIO配置*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);/*三、AFIO配置*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);/*四、EXTI第14個線路配置為中斷模式,下降沿觸發,開啟中斷*/EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;//EXTI線EXTI_InitStructure.EXTI_LineCmd = ENABLE;//開啟或關閉EXTIEXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷模式或者事件模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//指定觸發信號的有效邊沿EXTI_Init(&EXTI_InitStructure);/*五、配置NVIC*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//優先級分組NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//選擇中斷通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能或失能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶占優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//響應優先級NVIC_Init(&NVIC_InitStructure);
}uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14) == SET)    //判斷標志位,是否是EXTI_Line14觸發的中斷{CountSensor_Count++;  EXTI_ClearITPendingBit(EXTI_Line14);//清除標志位}}

CountSensor.h

#ifndef __COUNTSENSOR_H
#define __COUNTSENSOR_Hvoid CountSensor_Init(void);
uint16_t CountSensor_Get(void);#endif

10.2旋轉編碼器計次

?mian.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"int16_t Num;int main(void)
{OLED_Init();Encoder_Init();OLED_ShowString(1,1,"Num:");while (1){Num += Encoder_Get();OLED_ShowSignedNum(1,5,Num,5);  }
}

Encoder.c

#include "stm32f10x.h"                  // Device headerint16_t Encoder_Count;//無符號變量/*初始化操作*/
void Encoder_Init(void)
{/*一、開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟APB2時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//開啟AFIO時鐘/*二、GPIO配置*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);/*三、AFIO配置*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);/*四、EXTI第0/1個線路配置為中斷模式,下降沿觸發,開啟中斷*/EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);/*五、配置NVIC*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//優先級分組NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶占優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//響應優先級NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶占優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//響應優先級NVIC_Init(&NVIC_InitStructure);
}int16_t Encoder_Get(void)
{int16_t Temp;Temp = Encoder_Count;Encoder_Count = 0;return Temp;
}/*正轉中斷函數*/
void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1) == SET)					//B相下降沿(中斷){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)	//A相低電平{Encoder_Count ++;}EXTI_ClearITPendingBit(EXTI_Line1);}
}/*反轉中斷函數*/
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) == SET)					//A相下降沿(中斷){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)	//B相低電平{Encoder_Count --;}EXTI_ClearITPendingBit(EXTI_Line0);}
}

Encoder.h

#ifndef __ENCODER_H
#define __ENCODER_Hvoid Encoder_Init(void);
int16_t Encoder_Get(void);#endif

十一、中斷編程建議

①在中斷函數中,不要執行耗時過長的代碼,中斷函數要簡短快速,不要執行Delay函數,防止主程序受到嚴重阻塞

②不要在主函數和中斷函數中調用相同的函數或者操作同一個硬件

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

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

相關文章

ADAudit Plus:強大的網絡安全衛士

隨著數字化時代的不斷發展,企業面臨著越來越復雜和多樣化的網絡安全威脅。在這個信息爆炸的時代,保護組織的敏感信息和確保網絡安全已經成為企業發展不可或缺的一環。為了更好地管理和監控網絡安全,ADAudit Plus應運而生,成為網絡…

ThreadLocal系列-ThreadLocalMap源碼

1.ThreadLocalMap.Entry key&#xff1a;指向key的是弱引用 value&#xff1a;強引用 public class ThreadLocal<T> {static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always…

32、卷積參數 - 長寬方向的公式推導

有了前面三節的卷積基礎 padding, stride, dilation 之后,大概就可以了解一個卷積算法的全貌了。 一個完整的卷積包含的輸入和輸出有: 輸入圖像,表示為[n, hi, wi, ci] 卷積核,表示為[co, kh, kw, ci] 輸出特征圖,表示為[n, ho, wo, co] 以上為卷積算法的兩個輸入 tensor…

【持更】python數據處理-學習筆記

1、讀取excel /csv及指定sheet&#xff1a; pd.read_excel("路徑",sheetname"xx") 修改列名df.rename 修改字符串類型到數字 pandas.to_numeric&#xff08;&#xff09; 2、刪除drop、去重drop_duplicates &#xff08;1&#xff09;空值所在行/列 行&am…

Redis分布式鎖有什么缺陷?

Redis分布式鎖有什么缺陷&#xff1f; Redis 分布式鎖不能解決超時的問題&#xff0c;分布式鎖有一個超時時間&#xff0c;程序的執行如果超出了鎖的超時時間就會出現問題。 1.Redis容易產生的幾個問題&#xff1a; 2.鎖未被釋放 3.B鎖被A鎖釋放了 4.數據庫事務超時 5.鎖過期了…

centos 7 卸載圖形化界面步驟記錄

centos7 服務器操作系統&#xff0c;挺小一配置&#xff0c;裝了圖形化界面&#xff0c;現在運行程序的時候跑不動了&#xff0c;我想這圖形界面也沒啥用&#xff0c;卸載了算了&#xff01; 卸載步驟 yum grouplist 查詢已經安裝的組件 可以看到 圖形化界面 等是以分組存在的…

深入理解Spring IOC的工作流程

理解Spring IOC&#xff08;Inversion of Control&#xff09;的工作流程是理解Spring框架的核心之一。下面是Spring IOC的基本工作流程&#xff1a; 配置&#xff1a; 開發者通過XML配置文件、Java配置類或者注解等方式&#xff0c;定義應用中的Bean以及它們之間的依賴關系。這…

TCP數據粘包的處理

TCP數據粘包的處理 背鍋俠TCP解決方案2.1 發送端2.2 接收端 背鍋俠TCP 在前面介紹套接字通信的時候說到了TCP是傳輸層協議&#xff0c;它是一個面向連接的、安全的、流式傳輸協議。因為數據的傳輸是基于流的所以發送端和接收端每次處理的數據的量&#xff0c;處理數據的頻率可…

Qt練習題

1.使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff0c;密碼是否…

代碼隨想錄 96. 不同的二叉搜索樹

題目 給你一個整數 n &#xff0c;求恰由 n 個節點組成且節點值從 1 到 n 互不相同的 二叉搜索樹 有多少種&#xff1f;返回滿足題意的二叉搜索樹的種數。 示例 1&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;5 示例 2&#xff1a; 輸入&#xff1a;n 1 輸出&#xff1…

【Angular開發】Angular 16發布:發現前7大功能

Angular 于2023年5月3日發布了主要版本升級版Angular 16。作為一名Angular開發人員&#xff0c;我發現這次升級很有趣&#xff0c;因為與以前的版本相比有一些顯著的改進。 因此&#xff0c;在本文中&#xff0c;我將討論Angular 16的前7個特性&#xff0c;以便您更好地理解。…

機器學習基礎介紹

百度百科&#xff1a; 機器學習是一門多領域交叉學科&#xff0c;涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為&#xff0c;以獲取新的知識或技能&#xff0c;重新組織已有的知識結構使之不斷改善自身的性能。 …

手工酸奶店如何選址?開在哪里比較合適?

手工酸奶店是一個非常受歡迎的創業項目&#xff0c;但想要成功開店&#xff0c;選址是非常重要的。 本人開酸奶店5年時間&#xff0c;下面我將為大家分享一些選址的小技巧&#xff0c;希望對大家有所幫助。&#xff08;可以點贊收藏&#xff0c;方便以后隨時查閱&#xff09; …

入職字節外包一個月,我離職了。。。

有一種打工人的羨慕&#xff0c;叫做“大廠”。 真是年少不知大廠香&#xff0c;錯把青春插稻秧。 但是&#xff0c;在深圳有一群比大廠員工更龐大的群體&#xff0c;他們頂著大廠的“名”&#xff0c;做著大廠的工作&#xff0c;還可以享受大廠的伙食&#xff0c;卻沒有大廠…

12.11 C++ 作業

完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示”登錄成功“&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面 如果賬號和密碼不匹配&#xf…

樹根研習社|數據為王,洞察“工業數據采集”背后的價值與實踐

一、工業數據采集是什么&#xff1f; 數據采集是將各種信息傳感設備通過網絡結合起來&#xff0c;實現任何時間、任何地點&#xff0c;人、機、物的互聯互通。數據采集的主要的作用是&#xff1a; “翻譯官”&#xff1a;不同程序語言的設備數據通過協議解析“翻譯”為上層系…

淘寶權益玩法平臺的Serverless化實踐

通過對權益玩法平臺現有業務應用的Serverless化改造&#xff0c;權益團隊在雙十一期間完美地支撐了業務需求&#xff0c;在研發效率、運維保障等方面都體現出了很高的價值和收益。 項目背景 淘寶權益平臺是負責淘寶權益營銷的核心團隊&#xff0c;團隊除了負責拉菲權益平臺外&a…

1.cloud-微服務架構編碼構建

1.微服務cloud整體聚合父工程 1.1 New Project 1.2 Maven選版本 1.3 字符編碼 1.4 注解生效激活 主要為lombok中的Data 1.5 java編譯版本選8 1.6 File Type過濾 *.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;v…

Nginx配置文件的基本用法

Nginx簡介 1.1概述 Nginx是一個高性能的HTTP和反向代理服務器。 是一款輕量級的高性能的web服務器/反向代理服務器/電子郵件&#xff08;IMAP/POP3&#xff09;代理服務器 單臺物理服務器可支持30 000&#xff5e;50 000個并發請求。 1.2Nginx和Apache的優缺點 &#xff…

mybatis數據輸出-insert操作時獲取自增列的值給對應的屬性賦值

jdbc-修改 水果庫存系統的 BaseDao 的 executeUpdate 方法支持返回自增列-CSDN博客 1、建庫建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSE…