天天看點

STM32中斷相關

一般IO口的初始化過程

下面以初始化E端口的0、1、2、3引腳為例。

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable--端口時鐘初始化*/
  __HAL_RCC_GPIOE_CLK_ENABLE();

  /*Configure GPIO pin Output Level--初始化為低電平 */
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pins : PE2 PE3 PE0 PE1--初始化引腳 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
           

在core_cm4.h中定義NVIC結構體

typedef struct
{
  __IOM uint32_t ISER[];  /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register中斷使能寄存器 */
 uint32_t RESERVED0[];
  __IOM uint32_t ICER[]; /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register 中斷清除寄存器*/
uint32_t RSERVED1[];
  __IOM uint32_t ISPR[]; /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register中斷挂起使能寄存器 */
uint32_t RESERVED2[];
  __IOM uint32_t ICPR[]; /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register 中斷挂起清除寄存器*/
uint32_t RESERVED3[];
  __IOM uint32_t IABR[]; /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register 中斷标志位激活寄存器*/
uint32_t RESERVED4[];
 __IOM uint8_t  IP[]; /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) 中斷優先級寄存器(8位)*/
uint32_t RESERVED5[];
 __OM  uint32_t STIR; /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register軟體觸發中斷寄存器 */
}  NVIC_Type;
           

在配置中斷時,最常用的就是ISER、ICER和IP這三個寄存器。

ISER用來使能中斷,ICER用來失能中斷,IP用來設定中斷優先級。

(1)ISER:STM32F407可屏蔽的中斷隻有82個。

ISER數組中的每一位對應一個中斷,要是能某個中斷隻要将相應的ISER為設定為1即可。

(2)ICER:想要失能某個中斷并不是在ISER寄存器中寫入0.而是要在ISPR寄存器中的對應為寫入1.

(3)ISPR:中斷挂起控制寄存器,一位控制一個中斷,可以将正在進行的中斷挂起,而執行同級或更進階别的中斷。

(4)ICPR:與上一個寄存器作用相反,寫1有效。

(5)IABR:隻讀寄存器,為1表示改位對應的中斷正在執行,在中斷執行完了由硬體自動清零。

(6)IP:中斷優先級控制器,沒有可屏蔽中斷占用8bit。但是隻有高4位被使用。4位又被分為搶占優先級和響應優先級(子優先級)。

  • 搶占優先級:具有高搶占優先級的中斷可以在低搶占式優先級的中斷處理過程中被響應,形成中斷嵌套。
  • 響應優先級:是在幾個搶占優先級相同的中斷到來時,決定中斷的處理順序。

優先級的分組有核心外設SCB的應用程式中斷及複位控制寄存器AIRCR的PRIGROUP[10:8]位決定,有5個可選分組。

STM32中斷相關

NVIC相關函數

STM32中斷相關

編号3電路實際是一個或門電路,一個輸入為編号2的電路,另一個輸入來自軟體中斷事件寄存器(EXIT_EWIER)。EXIT_EWIER允許我們通過程式控制就可以啟動中斷/事件線。

編号3的輸出信号在進入EXIT_PR之後,就會把狀态值儲存在EXIT_PR寄存器對應位上,說明有中斷的發生。在處理完中斷事件後必須對該寄存器位寫“1”清除EXIT_PR寄存器,使得對應位位0,否則總是會發生中斷請求。

編号4的電路輸出由中斷屏蔽位寄存器和編号3的輸出信号共同決定,因為為“與”門,隻有中斷屏蔽位有效時才會輸出。

繼續閱讀