STM32F4的每個IO都可以作為外部中斷的中斷輸入口,這點也是STM32F4的強大之處。STM32F407的中斷控制器支持22個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。STM32F407的22個外部中斷為:
EXTI線0~15:對應外部IO口的輸入中斷。
EXTI線16:連接到PVD輸出。
EXTI線17:連接到RTC鬧鐘事件。
EXTI線18:連接到USB OTG FS喚醒事件。
EXTI線19:連接到以太網喚醒事件。
EXTI線20:連接到USB OTG HS(在FS中配置)喚醒事件。
EXTI線21:連接到RTC入侵和時間戳事件。
EXTI線22:連接到RTC喚醒事件。
從上面可以看出,STM32F4供IO口使用的中斷線只有16個,但是STM32F4的IO口卻遠遠不止16個,那么STM32F4是怎么把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,GPIOH.0,GPIOI.0。而中斷線每次只能連接到1個IO口上,這樣就需要通過配置來決定對應的中斷線配置到哪個GPIO上了。下面我們看看GPIO跟中斷線的映射關系圖:
圖1 GPIO和中斷線的映射關系圖
接下來我們講解使用庫函數配置外部中斷的步驟。
1) 使能IO口時鐘,初始化IO口為輸入
首先,我們要使用IO口作為中斷輸入,所以我們要使能相應的IO口時鐘,以及初始化相應的IO口為輸入模式。這里就不做過多講解。
2) 開啟SYSCFG時鐘,設置IO口與中斷線的映射關系。
接下來,我們要配置GPIO與中斷線的映射關系,那么我們首先需要打開SYSCFG時鐘。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘
這里大家一定要注意,只要我們使用到外部中斷,就必須打開SYSCFG時鐘。
接下來,我們配置GPIO與中斷線的映射關系。在庫函數中,配置GPIO與中斷線的映射關系的函數SYSCFG_EXTILineConfig ()來實現的:
void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);
該函數將GPIO端口與中斷線映射起來,使用范例是:
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
將中斷線0與GPIOA映射起來,那么很顯然是GPIOA.0與EXTI1中斷線連接了。設置好中斷線映射之后,那么到底來自這個IO口的中斷是通過什么方式觸發的呢?接下來我們就要設置該中斷線上中斷的初始化參數了。
3) 初始化線上中斷,設置觸發條件等。
中斷線上中斷的初始化是通過函數EXTI_Init()實現的。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寄存器
上面的例子設置中斷線4上的中斷為下降沿觸發。STM32的外設的初始化都是通過結構體來設置初始值的,這里就不再講解結構體初始化的過程了。我們來看看結構體EXTI_InitTypeDef的成員變量:
typedef struct
{ uint32_t EXTI_Line;
EXTIMode_TypeDef EXTI_Mode;
EXTITrigger_TypeDef EXTI_Trigger;
FunctionalState EXTI_LineCmd;
}EXTI_InitTypeDef;
從定義可以看出,有4個參數需要設置。第一個參數是中斷線的標號,對于我們的外部中斷,取值范圍為EXTI_Line0~EXTI_Line15。這個在上面已經講過中斷線的概念。也就是說,這個函數配置的是某個中斷線上的中斷參數。第二個參數是中斷模式,可選值為中斷EXTI_Mode_Interrupt和事件EXTI_Mode_Event。第三個參數是觸發方式,可以是下降沿觸發EXTI_Trigger_Falling,上升沿觸發EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發EXTI_Trigger_Rising_Falling,相信學過51的對這個不難理解。最后一個參數就是使能中斷線了。
4) 配置中斷分組(NVIC),并使能中斷。
我們設置好中斷線和GPIO映射關系,然后又設置好了中斷的觸發模式等初始化參數。既然是外部中斷,涉及到中斷我們當然還要設置NVIC中斷優先級。這個在前面已經講解過,這里我們就接著上面的范例, 設置中斷線2的中斷優先級。
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中事先有定義的。這里需要說明一下,STM32F4的IO口外部中斷函數只有7個,分別為:
EXPORT EXTI0_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI15_10_IRQHandler
中斷線0-4每個中斷線對應一個中斷函數,中斷線5-9共用中斷函數EXTI9_5_IRQHandler,中斷線10-15共用中斷函數EXTI15_10_IRQHandler。在編寫中斷服務函數的時候會經常使用到兩個函數,第一個函數是判斷某個中斷線上的中斷是否發生(標志位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
這個函數一般使用在中斷服務函數的開頭判斷中斷是否發生。另一個函數是清除某個中斷線上的中斷標志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
這個函數一般應用在中斷服務函數結束之前,清除中斷標志位。
常用的中斷服務函數格式為:
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判斷某個線上的中斷是否發生
{ …中斷邏輯…
EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE上的中斷標志位
}
}
在這里需要說明一下,固件庫還提供了兩個函數用來判斷外部中斷狀態以及清除外部狀態標志位的函數EXTI_GetFlagStatus和EXTI_ClearFlag,他們的作用和前面兩個函數的作用類似。只是在EXTI_GetITStatus函數中會先判斷這種中斷是否使能,使能了才去判斷中斷標志位,而EXTI_GetFlagStatus直接用來判斷狀態標志位。
講到這里,相信大家對于STM32的IO口外部中斷已經有了一定了了解。下面我們再總結一下使用IO口外部中斷的一般步驟:
1)使能IO口時鐘,初始化IO口為輸入。
2)使能SYSCFG時鐘,設置IO口與中斷線的映射關系。
3)初始化線上中斷,設置觸發條件等。
4)配置中斷分組(NVIC),并使能中斷。
5)編寫中斷服務函數。
通過以上幾個步驟的設置,我們就可以正常使用外部中斷了。
上一篇:STM32外部中斷映射
下一篇:STM32啟動后系統初始化SystemInit()
推薦閱讀
史海拾趣
為了滿足全球客戶的需求,EECO Switch公司積極實施全球化戰略。公司在墨西哥、臺灣和中國等地設立了制造工廠,并在英國劍橋設立了銷售辦事處。這些海外機構不僅為公司提供了更廣闊的市場空間,還幫助公司更好地了解當地市場的需求和趨勢。展望未來,EECO Switch將繼續秉承創新、質量、服務的核心價值觀,致力于成為全球領先的人機界面產品提供商。
近年來,電子行業經歷了多次技術變革和市場調整。面對這些變化,Baton Lock公司積極調整戰略,加大了對新興技術如物聯網、人工智能等領域的研發投入。同時,公司還通過優化生產流程、降低成本等方式提高競爭力,成功應對了行業變革帶來的挑戰。
在電子行業的初創期,Avasem公司以其獨特的技術創新而嶄露頭角。創始人團隊在半導體材料領域擁有深厚的研究背景,他們成功研發出了一種新型的、性能卓越的芯片材料。這一突破不僅大幅提升了電子設備的運算速度和能效,還降低了生產成本。隨著市場對該材料的需求日益增長,Avasem公司迅速獲得了風險投資的青睞,并通過與各大電子制造商的合作,將產品推向全球市場。公司因此實現了快速擴張,并在行業中建立了良好的口碑。
ES Systems非常重視與產業鏈上下游企業的合作。通過與供應商、渠道商等合作伙伴的緊密合作,公司能夠及時了解市場需求和技術趨勢,從而快速調整產品策略。此外,ES Systems還積極與高校和科研機構開展產學研合作,共同研發新技術、新產品。這種合作模式為ES Systems帶來了持續的創新動力和市場競爭力。
隨著電子行業的快速發展,Fair Rite迅速捕捉到新的市場機遇。公司不斷推出創新產品,以滿足醫療、照明、汽車、通訊、航空、國防、智能能源和工業市場等領域的需求。Fair Rite通過技術創新和品質保證,贏得了客戶的信賴和市場的認可。
面對日新月異的電子科技行業,Ecera Comtek Corp公司深知只有持續創新才能保持領先地位。因此,公司不斷加大對新技術、新產品的研發投入,積極探索新的商業模式和市場機會。同時,Ecera Comtek Corp公司還積極引進外部創新資源,與高校、科研機構等建立緊密的合作關系,共同推動電子科技行業的發展。在Ecera Comtek Corp公司的引領下,電子科技行業正朝著更加智能、高效、環保的方向發展。
請注意,以上故事均基于虛構情節,旨在模擬Ecera Comtek Corp公司可能的發展經歷。如有雷同,純屬巧合。
摘要:介紹用MCS-51系列單片機控制手機收發短信息的原理、硬件電路、PDU數據格式和符合GSM07.05協議要求的短信息發送/接收程序,同時給出了一個應用實例。 關鍵詞:單片機 短信息 PDU GSM 接口 GSM(Global System for Mobile comm ...… 查看全部問答∨ |
那位高手能幫忙解決一下s3c2410的spi口讀寫無線模塊cc2420的問題?? 我的問題主要是spi口到底是用查詢方式還是中斷方式。由于水平有限本人用了查詢方式。 下面是主要的程序: /************************************************* SPI low lever fuctions **********************************************/ void ...… 查看全部問答∨ |
我用的是三星的2440,在用spi對外設進行配置時,用示波器觀察輸出波形,發現nSS信號始終是高電平,數據信號和始終信號的波形都是對的。 問下大家,這個nSS我們怎么控制?還是說2440配置位master后,nSS是cpu自動控制的? PS:我現在的做法是將nSS ...… 查看全部問答∨ |
|
假設我現在有一個基于Arm核的單片機,并且有了一個基于這款單片機的開發平臺。現在想增加一塊多媒體芯片(比如中芯微968或者簡單些的芯片)來擴展一些功能,接線配置方面的事情我已經做好了,假設我用CS3作為片選。我不解的是:我用什么方法來讀寫多 ...… 查看全部問答∨ |
先把老師的程序寫到這里,慢慢研讀,#include <string.h>#include \"..\\inc\\44b.h\"#include \"..\\inc\\44blib.h\"#include \"..\\inc\\iic.h\"volatile int f_nGetACK;//獲取中斷響應標志//初始化IIC接口void Iic_init(void){ rIICCON=(1 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 答題抽獎:Mentor Tessent Automotive相關測試解決方案(獎品池還剩不少獎品喲)
- Mouser&TE直播:解鎖智能家居部件新技術,探索連接黑科技
- 全球首款Cortex-M23內核物聯網芯片SAML10和SAM L11系列 闖關獲取SAML10/SAML11法寶,拆除電子界安全危機,贏好禮!
- 有獎電源設計問卷調查
- 直播已結束【用于光伏逆變器/儲能系統的歐姆龍繼電器 /開關/連接器解決方案】
- 【搶樓贏禮】聊聊我用過的MOSFET!
- 【已結束】有獎直播【TI 全新CC2340無線 MCU,助力低功耗藍牙應用】
- 羅姆有獎直播 | 高輸出功率激光二極管—助力激光雷達性能提升
- 有獎評測:50套來自恩智浦全新快速物聯網原型設計套件(價值350元)
- 您的電路保護有足夠的空間嗎?Littelfuse的881系列保險絲迎接這一挑戰