1. 程式人生 > >STM32中斷優先順序--學習心得

STM32中斷優先順序--學習心得

剛開始學習STM32微控制器時,對中斷優先順序的規則不是很明白,通過今天的學習,對這方面的內容有了新的瞭解,記錄下來以便日後檢視。

首先說一下STM32的中斷

STM32有84箇中斷,包括16個核心中斷和68個可遮蔽中斷,具有16級可程式設計的中斷優先順序。
STM32F103系列上面,又只有60個可遮蔽中斷(在107系列才有68個)

中斷的管理方法

1.首先,對STM32中斷進行分組,組0~4。同時,對每個中斷設定一個搶佔優先順序和一個響應優先順序值。
分組配置是在暫存器SCB->AIRCR中配置:

即設定優先順序分組:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

2.然後對單個的中斷進行搶佔優先順序和響應優先順序設定:

typedef struct
{
  uint8_t NVIC_IRQChannel; //設定中斷通道
  uint8_t NVIC_IRQChannelPreemptionPriority;//設定響應優先順序
  uint8_t NVIC_IRQChannelSubPriority; //設定搶佔優先順序
  FunctionalState NVIC_IRQChannelCmd; //使能/使能
} NVIC_InitTypeDef;

NVIC_InitTypeDef   NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串列埠1中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 搶佔優先順序為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子優先順序位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);//根據上面指定的引數初始化NVIC暫存器

對於某些剛學習的人來說對設定分組這一措施不太明白其意義,這裡我就說一下我的理解(分組的意義):分組之後,IP的位也就分配完畢了,原本IP就只有4位,一位上有兩種狀態,也就是0和1,2^4 = 16,也就是有16級可程式設計優先順序,分組後,搶佔優先順序的位數和響應優先順序的位數確定,即可配置各個中斷的優先順序,另一方面也說明了,分組之後不要輕易再改變分組,否則設定好的各個中斷搶佔優先順序和響應優先順序就會改變。