1.STM32 外部中斷簡介
STM32 的每個 IO 都可以作為外部中斷的中斷輸入口。 STM32F103 的中斷控制器支持 19 個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。代碼主要分布在固件庫的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件。
STM32F103的 19 個外部中斷為:
線 0~15:對應外部 IO 口的輸入中斷。
線 16:連接到 PVD 輸出。
線 17:連接到 RTC 鬧鐘事件。
線 18:連接到 USB 喚醒事件
觸發方式:STM32 的外部中斷是通過邊沿來觸發的,不支持電平觸發。
2.外部中斷分組
STM32 的每一個GPIO都能配置成一個外部中斷觸發源,STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0為第一組,那么依此類推,我們能得出一共有16 組,STM32 規定,每一組中同時只能有一個中斷觸發源工作,那么,最多工作的也就是16個外部中斷。
3.中斷的初始化函數 EXTI_Init()
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
范例:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根據 EXTI_InitStruct 中指定的參數初始化外設 EXTI 寄存器
結構體 EXTI_InitTypeDef 的成員變量:
typedef struct
{
uint32_t EXTI_Line;//中斷線的標號,取值范圍為EXTI_Line0~EXTI_Line15
EXTIMode_TypeDef EXTI_Mode;//中斷模式,可選為中斷 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。
EXTITrigger_TypeDef EXTI_Trigger;//觸發方式,可以是下降沿觸發 EXTI_Trigger_Falling,上升沿觸發 EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發EXTI_Trigger_Rising_Falling
FunctionalState EXTI_LineCmd;//使能中斷線
}EXTI_InitTypeDef;
4.設置 NVIC 中斷優先級
范例:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按鍵外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優先級 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //中斷優先級分組初始化
5.中斷服務函數
中斷服務函數的名字是在 MDK 中事先有定義的, STM32 的 IO 口外部中斷函數只有 6 個。
IO 口外部中斷函數 中斷線
EXTI0_IRQHandler 中斷線 0
EXTI1_IRQHandler 中斷線 1
EXTI2_IRQHandler 中斷線 2
EXTI3_IRQHandler 中斷線 3
EXTI4_IRQHandler 中斷線 4
EXTI9_5_IRQHandler 中斷線 5-9
EXTI15_10_IRQHandler 中斷線 10-15
注:
在編寫中斷服務函數的時候會經常使用到兩個函數,第一個函數是判斷某個中斷線上的中斷是否發生(標志位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
這個函數一般使用在中斷服務函數的開頭判斷中斷是否發生。
另一個函數是清除某個中斷線上的中斷標志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
這個函數一般應用在中斷服務函數結束之前,清除中斷標志位。
6.使用 IO 口外部中斷的一般步驟
1)初始化IO口為輸入。
設置作為外部中斷輸入的IO口的狀態,可以設置為上拉 / 下拉輸入 / 浮空輸入,但浮空的時候外部一定要帶上拉,或者下拉電阻。否則可能導致中斷不停的觸發。在干擾較大的地方,就算使用了上拉/下拉,也建議使用外部上拉/下拉電阻,這樣可以一定程度防止外部干擾帶來的影響。
2)開啟IO口復用時鐘,設置IO口與中斷線的映射關系。
STM32的IO口與中斷線的對應關系需要配置外部中斷配置寄存器EXTICR,這樣我們要先開啟復用時鐘,然后配置IO口與中斷線的對應關系。才能把外部中斷與中斷線連接起來。
3)開啟與該IO口相對的線上中斷/事件,設置觸發條件。
這一步,我們要配置中斷產生的條件,STM32可以配置成上升沿觸發,下降沿觸發,或者任意電平變化觸發,但是不能配置成高電平觸發和低電平觸發。這里根據自己的實際情況來配置。同時要開啟中斷線上的中斷,這里需要注意的是:如果使用外部中斷,并設置該中斷的EMR位的話,會引起軟件仿真不能跳到中斷,而硬件上是可以的。而不設置EMR,軟件仿真就可以進入中斷服務函數,并且硬件上也是可以的。建議不要配置EMR位。
4)配置中斷分組(NVIC),并使能中斷。
這一步,我們就是配置中斷的分組,以及使能,對STM32的中斷來說,只有配置了NVIC的設置,并開啟才能被執行,否則是不會執行到中斷服務函數里面去的。
5)編寫中斷服務函數。
這是中斷設置的最后一步,中斷服務函數,是必不可少的,如果在代碼里面開啟了中斷,但是沒編寫中斷服務函數,就可能引起硬件錯誤,從而導致程序崩潰!所以在開啟了某個中斷后,一定要記得為該中斷編寫服務函數。在中斷服務函數里面編寫你要執行的中斷后的操作。
7.例程分析:
(1)外部中斷初始化函數
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中斷,需要使能AFIO時鐘
KEY_Init();//初始化按鍵對應io模式
//GPIOC.5 中斷線以及中斷初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
EXTI_InitStructure.EXTI_Line=EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿觸發
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根據 EXTI_InitStruct中指定的參數初始化外設EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按鍵所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優先級1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
}
(2) 中斷服務函數
void EXTI0_IRQHandler(void)
{
delay_ms(10); //消抖
if(WK_UP==1)
{
LED0=!LED0;
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0線路掛起位
}
參考:
1.STM32-外部中斷實驗
2.STM32-外部中斷學習筆記
3.STM32之EXTI——外部中斷
上一篇:STM32學習筆記一一時鐘系統
下一篇:STM32學習筆記一一GPIO
推薦閱讀
史海拾趣
品質管理是電子企業生存和發展的關鍵。Clover Display Limited深知這一點,因此在生產過程中始終嚴格把控品質。公司的生產線及工廠獲得了ISO 9001、14001及16949等多項國際認證,這不僅證明了公司產品的高品質,也提升了其在國際市場上的競爭力。同時,公司還積極參與國際標準制定和行業交流活動,以不斷提升自身的技術水平和市場影響力。
這五個故事雖然基于虛構的情節,但它們都基于Clover Display Limited在電子行業發展的真實背景和趨勢。這些故事展示了公司在技術創新、市場拓展、品質管理等方面的努力和成就,也反映了電子行業的快速發展和變革。希望這些故事能夠為您提供一個關于Clover Display Limited發展起來的有趣而全面的視角。
在面臨激烈的市場競爭時,CBM_America_Corporation選擇與一家國際知名的電子制造商建立戰略合作關系。通過共享技術資源和市場渠道,兩家公司共同開發了一款具有競爭力的智能設備。這一合作不僅提升了CBM的品牌影響力,還為其帶來了穩定的訂單和利潤增長。隨著合作的深入,CBM逐漸在電子行業中占據了重要的地位。
CBM_America_Corporation在電子行業的初期,專注于研發具有創新性的半導體技術。通過不懈的努力,公司成功開發出一種高效能、低能耗的芯片,受到了市場的廣泛歡迎。這一技術突破為公司帶來了大量的訂單,也吸引了眾多投資者的關注。隨著資金的注入,CBM開始擴大生產規模,并進軍國際市場,逐步成為了電子行業的領軍企業。
Dexter Research Center Inc.(以下簡稱Dexter)最初是由一群熱衷于電子科技研究的科學家和工程師組成的實驗室。他們熱衷于探索新的傳感器技術,并在實驗室環境下取得了多項技術突破。然而,技術的真正價值在于其商業化應用。Dexter意識到這一點,決定將研究成果轉化為實際產品,推向市場。經過數年的努力,Dexter成功開發出了一系列高性能、高精度的傳感器產品,并受到了市場的熱烈歡迎。
Dexter Research Center Inc.(以下簡稱Dexter)最初是由一群熱衷于電子科技研究的科學家和工程師組成的實驗室。他們熱衷于探索新的傳感器技術,并在實驗室環境下取得了多項技術突破。然而,技術的真正價值在于其商業化應用。Dexter意識到這一點,決定將研究成果轉化為實際產品,推向市場。經過數年的努力,Dexter成功開發出了一系列高性能、高精度的傳感器產品,并受到了市場的熱烈歡迎。
作為一家有社會責任感的企業,Dexter始終關注環境保護和可持續發展問題。公司積極采用環保材料和工藝,減少生產過程中的廢棄物和污染物排放。同時,Dexter還積極參與社會公益事業,為當地社區和弱勢群體提供幫助和支持。這些舉措不僅有助于保護環境、推動社會進步,還提升了Dexter的企業形象和品牌價值。
本帖最后由 jameswangsynnex 于 2015-3-3 20:01 編輯 12月7日消息,上海芯片企業深迪半導體宣布,國內第一款具有中國自主知識產權的商用MEMS陀螺儀誕生,這是國內首顆手機傳感器芯片,將改變我國手機MEMS陀螺儀完全從國外進口的歷史。 中 ...… 查看全部問答∨ |
|
我在VC2005中創建了基于單文檔的MFC工程,實現工程為讀取地圖數據,然后通過DC繪制到屏幕中,但在拖動地圖的時候會出現刷屏現象,即閃得很厲害。然后,在網上了解到可以通過使用雙緩存來解決該問題,實現代碼如下: &nb ...… 查看全部問答∨ |
我要用鉤子來截取WINCE軟鍵盤的消息,參考網上一些其他資料,用如下方法來設置鉤子,可是始終不成功,請教各位! ///////////// 初始化部分 /////////////////////////// &n ...… 查看全部問答∨ |
交叉網線、交叉串口線和非交叉的有什么區別,學習網線下載時看到交叉網線,和非交叉的,但是不知道有什么區別。。還有交叉串口線。。。,求解釋。。。… 查看全部問答∨ |
qq號碼:810674408 郵箱:angjing2006@163.com msn:angjing2006@msn.cn 研發中心 系統產品部DSP軟件工程師 北京 工作職責: 1、負責寬帶無線接入系統無線系統產品物理層算法的驗證及實現; 2、負責無線側基站產品物理層軟件的開發及維護。 ...… 查看全部問答∨ |