簡體   English   中英

如何在 stm32 中設置中斷處理程序?

[英]How to setup the interrupt handler in stm32?


void EXTI4_15_IRQHandler()
{
if(EXTI->PR & EXTI_PR_PR8)
    {
    EXTI->PR |= EXTI_PR_PR8;
    // handle interrupt here
    GPIOA->BSRR |= GPIO_BSRR_BS_10;
    Delay(500);
    GPIOA->BSRR |= GPIO_BSRR_BR_10;
    Delay(500);

    }
}

中斷初始化在 main.c 中初始化,設置正確。 處理程序 function 中有什么我遺漏的嗎?

您只發布了中斷處理程序 function,這本身並沒有多大幫助。 基本上,您的 MCU 要么進入它並完全執行它,要么不執行它。 因此,如果它(中斷處理程序)沒有運行,則意味着沒有觸發中斷。 這意味着,問題出在其他地方,所以我將 go 遍歷在 STM32 上獲取 EXTI 中斷的整個邏輯,確保您已完成所有這些。

為了讓 EXTI 中斷工作,我們需要將 3 個內部外圍設備連接在一起:GPIO、EXTI 和 NVIC。 您沒有指定特定的微控制器,但它們都 (STM32) 以相同/相似的方式執行此操作,因此我將以 STM32F746 為例,因為我的桌子上有它。

首先,您需要設置 EXTI。 如果你想在引腳 GPIOx8 上中斷,你需要根據你想觸發中斷的事件在 EXTI 寄存器的適當位置設置第 8 位。

其次,您需要將 GPIO 端口連接到 EXTI。 你想中斷 PA8 嗎? 還是PB8? 還是PC8? EXTI 只知道它是“Pin 8”。 不知道是PA8還是PB8。 您在 SYSCFG 外設中執行的操作。 在寄存器EXTI->EXTICR3 ,您需要為 EXTI8 設置端口。 這是您決定觸發中斷的是 PB8 而不是 PA8,或者您擁有的任何端口。

現在,根據 EXTI 中定義的 GPIO 行為事件,EXTI 將向 NVIC 報告 EXTI9_5 事件。 現在,如果 EXTI 中斷事件發生,NVIC 將設置掛起位,但它不會執行中斷,因為它沒有被激活。 所以我們需要配置 NVIC 並在那里激活 EXTI9_5 中斷。 此時你的中斷應該工作。

回顧一下,操作順序如下:

  1. 使用要中斷的引腳數配置 EXTI。 引腳數,但不是 GPIO 端口。 對你來說,它將是引腳 8。
  2. 將 SYSCFG 配置為該 EXTI 引腳的 select GPIO 端口。 將引腳 8 配置為引腳 PB8 而不是 PA8(或中斷打開的任何端口)。
  3. 激活相應的 NVIC 中斷。

由此也可以得出,您不能同時在 PA8 和 PB8 上進行中斷。

編輯:在 ISR 中出現延遲是非常不可取的。 另外,請確保中斷引腳上的輸入信號已去抖動。

EDIT2:我認為不言而喻,您使用的每個外圍設備都需要向其提供時鍾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM