中斷分類
STM32的EXTI控制器支持19 個外部中斷/ 事件請求。每個中斷設有狀態位,每個中斷/ 事件都有獨立的觸發和屏蔽設置。
STM32的19個外部中斷對應著19路中斷線,分別是EXTI_Line0-EXTI_Line18:
線0~15:對應外部 IO口的輸入中斷。
線16:連接到 PVD 輸出。
線17:連接到 RTC 鬧鐘事件。
線18:連接到 USB 喚醒事件。
觸發方式:STM32 的外部中斷是通過邊沿來觸發的,不支持電平觸發。
外部中斷分組:STM32 的每一個GPIO都能配置成一個外部中斷觸發源,STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0為第一組,那么依此類推,我們能得出一共有16 組,STM32 規定,每一組中同時只能有一個中斷觸發源工作,那么,最多工作的也就是16個外部中斷。
寄存器組
EXTICR寄存器組,總共有4 個,因為編譯器的寄存器組都是從0 開始編號的,所以EXTICR[0]~ EXTICR[3],對應《STM32參考手冊》里的 EXTICR1~ EXTICR 4(查了好久才搞明白這個數組的含義!!)。每個 EXTICR只用了其低16 位。
EXTICR[0] ~EXTICR[3]的分配如下:
EXTI寄存器的結構體:
typedef struct
{
vu32 IMR;
vu32 EMR;
vu32 RTSR;
vu32 FTSR;
vu32 SWIER;
vu32 PR;
} EXTI_TypeDef;
IMR:中斷屏蔽寄存器
這是一個 32 寄存器。但是只有前 19 位有效。當位 x 設置為1 時,則開啟這個線上的中斷,否則關閉該線上的中斷。
EMR:事件屏蔽寄存器
同IMR ,只是該寄存器是針對事件的屏蔽和開啟。
RTSR:上升沿觸發選擇寄存器
該寄存器同IMR ,也是一個32為的寄存器,只有前 19位有效。位 x 對應線x 上的上升沿觸發,如果設置為 1 ,則是允許上升沿觸發中斷/ 事件。否則,不允許。
FTSR:下降沿觸發選擇寄存器
同 PTSR,不過這個寄存器是設置下降沿的。下降沿和上升沿可以被同時設置,這樣就變成了任意電平觸發了。
SWIER:軟件中斷事件寄存器
通過向該寄存器的位x 寫入 1 ,在未設置 IMR 和EMR的時候,將設置PR中相應位掛起。如果設置了IMR 和EMR時將產生一次中斷。被設置的SWIER位,將會在PR中的對應位清除后清除。
PR:掛起寄存器
0 ,表示對應線上沒有發生觸發請求。
1,表示外部中斷線上發生了選擇的邊沿事件。通過向該寄存器的對應位寫入 1 可以清除該位。
在中斷服務函數里面經常會要向該寄存器的對應位寫1 來清除中斷請求。
中斷配置步驟
STM32的每個IO口都可以作為中斷輸入,這點很好用。要把IO口作為外部中斷輸入,有以下幾個步驟:
1)初始化IO口為輸入。
這一步設置你要作為外部中斷輸入的IO口的狀態,可以設置為上拉/下拉輸入,也可以設置為浮空輸入,但浮空的時候外部一定要帶上拉,或者下拉電阻。否則可能導致中斷不停的觸發。在干擾較大的地方,就算使用了上拉/下拉,也建議使用外部上拉/下拉電阻,這樣可以一定程度防止外部干擾帶來的影響。
2)開啟IO口復用時鐘,設置IO口與中斷線的映射關系。
STM32的IO口與中斷線的對應關系需要配置外部中斷配置寄存器EXTICR,這樣我們要先開啟復用時鐘,然后配置IO口與中斷線的對應關系。才能把外部中斷與中斷線連接起來。
3)開啟與該IO口相對的線上中斷/事件,設置觸發條件。
這一步,我們要配置中斷產生的條件,STM32可以配置成上升沿觸發,下降沿觸發,或者任意電平變化觸發,但是不能配置成高電平觸發和低電平觸發。這里根據自己的實際情況來配置。同時要開啟中斷線上的中斷,這里需要注意的是:如果使用外部中斷,并設置該中斷的EMR位的話,會引起軟件仿真不能跳到中斷,而硬件上是可以的。而不設置EMR,軟件仿真就可以進入中斷服務函數,并且硬件上也是可以的。建議不要配置EMR位。
4)配置中斷分組(NVIC),并使能中斷。
這一步,我們就是配置中斷的分組,以及使能,對STM32的中斷來說,只有配置了NVIC的設置,并開啟才能被執行,否則是不會執行到中斷服務函數里面去的。關于NVIC的詳細介紹,請參考前面章節。
5)編寫中斷服務函數。
這是中斷設置的最后一步,中斷服務函數,是必不可少的,如果在代碼里面開啟了中斷,但是沒編寫中斷服務函數,就可能引起硬件錯誤,從而導致程序崩潰!所以在開啟了某個中斷后,一定要記得為該中斷編寫服務函數。在中斷服務函數里面編寫你要執行的中斷后的操作。
程序如下:
void EXIT8_IPRT()
{
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
EXTI->IMR = EXTI_IMR_MR8;
EXTI->RTSR = EXTI_RTSR_TR8;
AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI8_PA;
NVIC_EnableIRQ(EXTI9_5_IRQn);
}
void GPIOA8_Init()
{
/* 1. ENABLE GPIOA CLOCK */
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
/* 2. CONFIG PA8*/
GPIOA->CRH &= ~(GPIO_CRH_MODE8 | GPIO_CRH_CNF8);
GPIOA->CRH |= GPIO_CRH_CNF8_1;
EXIT8_IPRT();
while(1)
{
}
}
調試如下
1)初始化IO口為輸入。如圖
2)開啟IO口復用時鐘,設置IO口與中斷線的映射關系。
3)開啟與該IO口相對的線上中斷/事件,設置觸發條件。
4)配置中斷分組(NVIC),并使能中斷。
5)編寫中斷服務函數。
void EXTI9_5_IRQHandler(void)
{
Delay_ms(10);
if((EXTI->PR) & EXTI_PR_PR8)
{
EXTI->PR = EXTI_PR_PR8;
printf("Monitor rising\n");
}
}
上一篇:如何解決STM32F407串口無法發送第一個字節問題
下一篇:【stm32f103】USART TX發送實現(寄存器版)
推薦閱讀
史海拾趣
背景:2003年,福斯特的創始人林建華,一位在紡織業和化工領域有著豐富經驗的工程師,決定跨界進入光伏材料行業。當時,國內光伏組件封裝所需的光伏膠膜幾乎全部依賴進口,被國外幾家大公司壟斷。
發展:林建華憑借在熱熔網膜領域的技術積累,帶領團隊成功研發出EVA膠膜,打破了國外技術壟斷。這一技術突破不僅降低了國內光伏組件的生產成本,也為福斯特在光伏材料領域的崛起奠定了堅實基礎。
成果:2008年,福斯特的EVA膠膜產品憑借優異的性能和價格優勢,成功打入國內光伏組件企業的供應名錄,并躋身全球EVA膠膜供應商前三強。
為了進一步擴大市場份額,Belden公司開始實施全球擴張戰略。公司先后在多個國家和地區設立了分支機構,將優質的產品和服務帶到了世界各地。此外,Belden還積極尋求與其他知名企業的戰略合作,通過強強聯合,共同推動電線電纜行業的發展。這些合作不僅為Belden帶來了更多的商業機會,還提升了公司在全球市場的競爭力。
長運通注重與高校和研究機構的合作,積極引進和培養人才。公司與電子科技大學、西安電子科技大學等知名高校建立了緊密的合作關系,共同開展技術研發和人才培養。通過與高校的合作,長運通不僅獲得了更多的技術資源支持,也為公司培養了一批高素質的研發人才。這些人才為公司的發展提供了強有力的支撐。
隨著業務的快速發展,博巨興公司在2004年決定擴大經營規模,將寫字樓搬遷至福田區彩田路彩虹大廈。這一舉措不僅提升了公司的形象,也為進一步拓展業務提供了更好的條件。同時,公司不斷加強技術研發,成功取得了蘇州市華芯微電子有限公司的代理權,進一步鞏固了在芯片代理領域的地位。
隨著全球化趨勢的加劇,COMPEX公司開始積極實施全球化戰略。公司不僅在國內市場取得了良好的業績,還積極開拓海外市場,與國際知名企業建立了廣泛的合作關系。通過全球化戰略的實施,COMPEX的產品逐漸走向世界,品牌影響力也得到了顯著提升。
基于IAR編譯環境,雖然簡單. 但卻有ucos程序的使用的幾個要素. 為了練習中斷和郵箱,沒有使用系統timer0時間片定時. 而是使用timer1定時,中斷發生后,通過郵箱把要顯示的led燈的位置送給顯示任務. ucosII編程的最大的一個好處是程序符合自然思維, ...… 查看全部問答∨ |
求助: 最近,我碰到一個三相四線制的電機,(因為電機經常性燒壞,引起我注意)我發現,這個電機沒有缺相保護,我想如果要在這個電機上加一個缺相保護,需要用什么器件,或者怎么設計?… 查看全部問答∨ |
手上有LPC17xx的開發板,RT-Thread基本系統已經可運行,內核與finsh shell都啟動起來了《這個是由上海豐寶 NXP 應用工程師移植的》,接下去會繼續完成SPI SD卡驅動,EMAC網卡驅動和LCD液晶驅動這里先上LPC17xx的一些驅動庫、例程RT-Thr ...… 查看全部問答∨ |
|
windowsCE系統文件有什么辦法能夠打開嗎,fopen好像不可以,連在ActiveSync中復制也復制不出來。 windowsCE系統文件有什么辦法能夠打開嗎,fopen好像不可以,連在ActiveSync中復制也復制不出來。 我就想打開一個windowsCE windows文件夾里的一個文件,我現在想通過復制到我的電腦桌面都復制不了,怎么這么強?不可以復制的,有什么辦法嗎?… 查看全部問答∨ |
/******************************************************************************************* ????????: I2C_GetSpeed ?è ??: ???? I2C ?????????? ????????: ?? ????????: ?? ·? &nbs ...… 查看全部問答∨ |
按照LVDS原理,當需要發送差分信號時,應該用LVDS的差分信號發送器,LVDS的輸出時差分信號,應該有兩路即IN+ 和 IN- ,IN=IN+ - IN- ,但我用LVDS模塊進行設計時,輸出端口只有一個,請問一下,這是怎么回事?模塊的輸出跟原理好像有差距?希望高手 ...… 查看全部問答∨ |
這個圖片是在日本的網站上找到了,怎么在中國這個芯片就不宣傳了?<img src="http://bbs.eeworld.com.cn/upfil ...… 查看全部問答∨ |