MM32/STM32中斷和事件梳理


Interrupt_event梳理


1.預備資料

MM32/stm32中文參考手冊
Cortex-M3權威指南(深入了解中斷和異常)
MM32F103產品手冊(配置GPIO的復用功能可能用到)


2.提出問題

什么是中斷?
怎樣配置一個中斷?


3.思維導圖整體框架(CTRL+中鍵縮放查看)


4.什么是中斷?

中斷,Interrupt,就是CPU正在執行某項任務,被此項任務外的其他事務打斷,CPU將正在執行的任務暫停(保護現場)轉而執行其他高優先級的事務(處理中斷),等此項事務執行完成,CPU再來執行先前被打斷的任務(返回/恢復現場)。
對於用戶而言,我們不必關心CPU怎樣跳轉(保護/恢復現場),我們主要關注CPU響應我們的預置中斷請求即可。
因此,中斷的配置主要關注:怎樣進入中斷和中斷中做什么事情。


5.NVIC(嵌套中斷向量中斷控制器)


中斷和異常向量

中斷與異常是ARM內核的東西,需要深入了解可以看《Cortex-M3權威指南》
這里分析stm32中的中斷向量表的使用與查詢

表中的幾個重要參數:
位置:配置中斷是,告訴CPU中斷的位置
名稱:外設請求的中斷名稱,詳情可以看“說明”字段
優先級:當同時發生多個中斷請求時,CPU需要一種合理高效的調度模式,決定處理各個中斷請求的次序(搶占優先級,響應優先級)

以表中的EXTI0說明:
這里需要配置EXTI0上的中斷,即當EXTI0線上發生上升沿或者下降沿(可配置)時,我們需要CPU跳轉到相應的中斷服務函數中執行我們想執行的任務,可以這樣配置:

  • 設置NVIC的中斷位置為6
  • 設置邊沿觸發模式(上升沿/下降沿/雙邊沿)
  • 適當的時候在EXTI0上產生觸發信號,激活中斷執行中斷服務函數

關於產生EXTI0觸發信號
查閱外部中斷通用I/O映射可以知道,通過配置GPIO[x]0連接到EXTI0線


6.EXTI(外部中斷/事件控制器)


框圖

  • 配置1-3 + NVIC響應中斷使能 可以觸發硬件的外部中斷
  • 配置2-3 + NVIC響應中斷使能 可以觸發軟件的外部中斷
  • 配置1-4可以觸發硬件的外部事件(事件可用於sleep mode喚醒等)
  • 配置2-4可以觸發軟件的外部事件

配置一個中斷(EXTI0外部中斷)


配置時鍾和GPIO(EXTI0輸入)

    GPIO_InitTypeDef  GPIO_InitStructure;                 //GPIO
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE);
    RCC_PCLK2Config(RCC_HCLK_Div8);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL,ENABLE);
    RCC_PCLK2Config(RCC_HCLK_Div8);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置EXTI0的觸發信號,具體查閱--外部中斷/事件線路映射
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //input mode
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;	   //50M
    GPIO_Init(GPIOA, &GPIO_InitStructure);

配置EXTI控制器

    NVIC->ISER[0]=(1<<6);//使能CPU的中斷響應,其中位置為6,在中斷和異常向量表中可以查詢得到
    EXTI->IMR=(0x1<<0);  //配置EXTI的中斷使能,請看上邊的框圖分析   
    EXTI->RTSR=(0x1<<0); //line 0 rising    配置上升沿觸發 
    EXTI->FTSR=(0x1<<0); //line 0 falling   配置下降沿觸發,細節請看EXTI的寄存器描述
    while(EXTI->IMR&0x100);       //等待進入中斷

寫中斷服務函數

void EXTI0IRQHandler(void)   //中斷服務函數,請到庫函數查看各個中斷對應的預定義中斷函數名
{
    EXTI->PR=0x1;            //清除掛起中斷
    print("Hello EXTI0\n");  
    EXTI->IMR&=0xfffffc1f;   //除能中斷
}

觸發

這樣通過在GPIO引腳輸入脈沖即可進入中斷函數。

7.總結中斷配置步驟

  • 配置NVIC寄存器NVIC->ISER[0]=(0x1<<6)
  • 配置外設中斷寄存器,使能中斷
  • 根據定義的中斷子函數名寫中斷函數,例如void EXTI0IRQHandler(void
  • 運行程序,使之產生中斷
  • 查看進入中斷情況,是否觸發中斷

參考資料

[1]. MM32參考手冊
[2]. stm32中文參考手冊
[3]. Cortex-M3權威指南
[4]. MM32F103產品手冊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM