STM32之外部中斷控制

2021-09-06 15:36:46 字數 4017 閱讀 9188

一、stm32外部中斷

1、stm32外部中斷結構圖

如上圖所示:主要包括四個環節,gpio、afio、exti、nvic。以stm32f103ve(100腳)為例說明硬體模組的數量:

gpio:       80個

afio選擇通道:   16個

外部中斷線exti:  16 + 3 = 19個

nvic      :   1個 

2、exti控制器結構圖

① 功能

② 功能詳細說明  

如果要產生中斷,必須事先配置好並使能中斷線。根據需要的邊沿檢測設定2個觸發暫存器,同時在中斷遮蔽暫存器的相應位寫』1』 允許中斷請求。當外部中斷線上發生了需要的邊沿時,將產生乙個中斷請求,對應的掛起位也隨之被置』1』 。在掛起暫存器的對應位寫』1』,可以清除該中斷請求。

如果要為產生事件,必須事先配置好並使能事件線。根據需要的邊沿檢測通過設定2個觸發暫存器,同時在事件遮蔽暫存器的相應位寫』1』允許事件請求。當事件線上發生了需要的邊沿時,將產生乙個事件請求脈衝,對應的掛起位不被置』1』。

通過在軟體中斷/事件暫存器寫』1』,也可以通過軟體產生中斷/事件請求。

3、stm32外部中斷軟體配置步驟

① 配置nvic控制器

② 使能gpio和afio時鐘 

③ 配置gpio (復用功能的輸入輸出配置)

④ 配置afio (選定要配置為exti的i/o口線)

⑤  exti控制器的配置

配置暫存器就好像是我們在更改stm32的硬體電路,讓它們處於一種新的工作狀態--外部中斷模式。

二、stm32外部中斷軟體配置細節

以pa0引腳的外部中斷為例進行介紹:

1、配置nvic控制器

pa0引腳對應的外部中斷線是exti_line0,而exti_line0對應的中斷源是exti0_irqn。

呼叫nvic_init函式設定中斷源exti0_irqn的搶占優先順序和響應優先順序,並且使能中斷。

nvic_initstructure.nvic_irqchannel =exti0_irqn;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 0

; nvic_initstructure.nvic_irqchannelsubpriority = 0

; nvic_initstructure.nvic_irqchannelcmd =enable;

nvic_init(&nvic_initstructure);

nvic_irqchannel

定義配置的物件,是哪乙個中斷源,它不能使用 「exti0_irqn|exti0_irqn」方式呼叫一次nvic_init函式配置多個中斷源

2、使能gpio和afio時鐘

gpio用作exti外部中斷或使用重對映功能的時候,不僅需要開啟外設時鐘rcc_apb2periph_gpioa,還需要開啟afio時鐘rcc_apb2periph_afio。 

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_afio,enable);
3、配置gpio(復用功能的輸入輸出配置)

配置pa0為上拉輸入。

gpio_initstructure.gpio_pin =gpio_pin_0;       

gpio_initstructure.gpio_mode = gpio_mode_ipu; //

上拉輸入

gpio_init(gpioa, &gpio_initstructure);

4、配置afio(選定要配置為exti的i/o口線)

pa0引腳對應的外部中斷線是exti_line0,但是pb0~pg0對應的也都是這個外部中斷線。所以,需要通過多路選擇器確定到底是哪乙個引腳對映到exti_line0。

gpio_extilineconfig(gpio_portsourcegpioa, gpio_pinsource0);
5、exti控制器的配置配置外部中斷線exti_line0的工作模式,為中斷模式,下降沿觸發中斷,並且使能外部中斷線exti_line0。

exti_initstructure.exti_line =exti_line0;

exti_initstructure.exti_mode =exti_mode_interrupt;

exti_initstructure.exti_trigger = exti_trigger_falling; //

下降沿中斷

exti_initstructure.exti_linecmd =enable;

exti_init(&exti_initstructure);

三、中斷配置過程以及stm中斷結構解惑1、為什麼nvic有使能中斷,exti控制器還有乙個使能控制呢?nvic控制器是在arm公司設計的cortex-m3核心中,exti控制器是st公司自己設計的外設。

在nvic控制器中,有「interrupt set-enable  register&interrupt clear-enable  register」,它們來控制是否使能中斷源exti0_irqn。

而exti控制器中,有「interrupt mask register」來控制中斷線exti_line0的中斷標誌位是否傳送給nvic控制器。

2、為什麼nvic控制器使能中斷源的暫存器要兩種?

中斷的使能與除能分別使用各自的暫存器來控制——這與傳統的,使用單一位元的兩個狀態來表達使能與除能是不同的。cm3 中可以有 240 對使能位/除能位(setena 位/clrena 位),每個中斷擁有一對。這 240 個對子分布在 8 對32位暫存器中(最後一對沒有用完)。欲使能乙個中斷,我們需要寫1 到對應setena的位中;欲除能乙個中斷,你需要寫 1 到對應的clrena位中。如果往它們中寫0,則不會有任何效果。

寫零無效是個很關鍵的設計理念:通過這種方式,使能/除能中斷時只需把「當事位」寫成 1,其它的位可以全部為零。再也不用像以前那樣,害怕有些位被寫入0 而破壞其對應的中斷設定(反正現在寫 0 沒有效果了),從而實現每個中斷都可以自顧地設定,而互不侵犯——只需單一的寫指令,不再需要讀-改-寫三步曲。(摘自《cm3權威指南》)

3、在清除中斷標誌位的時候,為什麼只需要清除exti的中斷標誌位就行,而不需要清除nvic的懸起暫存器setpend?

有些程式設計師在中斷服務程式結束的位置清除中斷源的時候,還呼叫了nvic_clearpendingirq()函式清除中斷源的懸起標誌位,其實是不需要的。  

如果中斷發生時,正在處理同級或高優先順序異常,或者被掩蔽,則中斷不能立即得到響應。此時中斷被懸起。中斷的懸起狀態可以通過「中斷設定懸起暫存器(setpend) 」和「中斷懸起清除暫存器(clrpend) 」來讀取,還可以寫它們來手工懸起中斷。(這段文字摘自《cm3權威指南》)

由此我們可以得出結論:如果中斷服務程式得到執行(中斷得到響應),此時中斷就不會被懸起。所以我們的中斷服務程式不需要清除「懸起標誌位」。

有人可能還會這麼想:倘若乙個中斷服務程式因為處理器正在執行同級中斷服務程式而不能被執行,中斷被懸起,那麼當輪到這個中斷得到響應後,這個中斷服務程式需要清楚「懸起標誌位」嗎?

我認為還是不需要,因為中斷標誌位的懸起和解懸,硬體都是可以自動控制的。也就是說,當懸起的中斷被響應的時候,「懸起標誌位」自動被硬體予以清除,不必手動清除。

STM32之外部中斷

首先配置外部中斷的輸入引腳和中斷源 void lcr config void 選了gpio8作為中斷輸入,中斷源為exti line8 中斷服務函式由於啟動函式定義 export exti9 5 irqhandler weak 故在檔案stm32f10x it.c m3為例 中定義了各類中斷服務函式...

stm32之外部中斷

外部中斷 事件控制器包含多達 19 個用於產生事件 中斷請求的邊沿檢測器。每根輸入線都可單獨進行配置,以選擇型別 中斷或事件 和相應的觸發事件 上公升沿觸發 下降沿觸 發或邊沿觸發 每根輸入線還可單獨遮蔽。掛起暫存器用於保持中斷請求的狀態線。其中有16條是對應於gpio的 核心中會有乙個nvic 巢...

STM32學習之外部中斷

外部中斷 事件控制器由19 個產生事件 中斷要求的邊沿檢測器組成。每個輸入線可以獨 地配置輸入型別 脈衝或掛起 和對應的觸發事件 上公升沿或下 沿或者雙邊沿都觸發 每個輸入線都可以被獨 的遮蔽。掛起暫存器保持著狀態線的中斷要求。nvic驅動有多種用途 例如使能或者失能irq中斷,使能或者失能單獨的i...