STM32中斷優先級的管理(NVIC)

STM32 NVIC 中斷優先級管理

  • CM3 內核支持 256 個中斷,其中包含了 16 個內核中斷和 240 個外部中斷,并且具有 256級的可編程中斷設置。
  • STM32 并沒有使用 CM3 內核的全部東西,而是只用了它的一部分。STM32 有 84 個中斷,包括 16 個內核中斷和 68 個可屏蔽中斷,具有 16 級可編程的中斷優先級。
  • STM32 的 68 個可屏蔽中斷,在 STM32F103 系列上面,又只有 60 個(在 107 系列才有 68 個)。因為我們開發板選擇的芯片是 STM32F103 系列的所以我們就只針對 STM32F103 系列這 60 個可屏蔽中斷進行介紹。

中斷管理方法:
首先,對STM32中斷進行分組,組0~4。同時,對每個中斷設置一個搶占優先級和一個響應優先級值。這里簡單介紹一下 STM32 的中斷分組:STM32 將中斷分為 5 個組,組 0~4。該分組的設置是由 SCB->AIRCR 寄存器的 bit10~8 來定義的。具體的分配關系如表 4.5.1 所示:
在這里插入圖片描述
搶占優先級和響應優先級的區別:

  • 高優先級的搶占優先級是可以打斷正在進行的低搶占優先級中斷的(值越小越高),在搶占優先級不同的情況下響應優先級是沒有用的。
  • 搶占優先級相同的中斷,高響應優先級不可以打斷低響應優先級的中斷。
  • 搶占優先級相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先級高,哪個先執行。
  • 如果兩個中斷的搶占優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行;

舉例:
假定設置中斷優先級組為2,然后設置中斷3(RTC中斷)的搶占優先級為2,響應優先級為1。 中斷6(外部中斷0)的搶占優先級為3,響應優先級為0。中斷7(外部中斷1)的搶占優先級為2,響應優先級為0。那么這3個中斷的優先級順序為:中斷7>中斷3>中斷6。
一般情況下,系統代碼執行過程中,只設置一次中斷優先級分組,比如分組2,設置好分組之后一般不會再改變分組。隨意改變分組會導致中斷管理混亂,程序出現意想不到的執行結果。

中斷優先級分組函數:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

設置為分組二舉例:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

怎么設置單個中斷的搶占優先級和響應優先級:
中斷設置相關寄存器

  • __IO uint8_t IP[240]; //中斷優先級控制的寄存器組
  • __IO uint32_t ISER[8]; //中斷使能寄存器組
  • __IO uint32_t ICER[8]; //中斷失能寄存器組
  • __IO uint32_t ISPR[8]; //中斷掛起寄存器組
  • __IO uint32_t ICPR[8]; //中斷解掛寄存器組
  • __IO uint32_t IABR[8]; //中斷激活標志位寄存器組

MDK中NVIC寄存器結構體

typedef struct
{__IO uint32_t ISER[8];             uint32_t RESERVED0[24];                                   __IO uint32_t ICER[8];                    uint32_t RSERVED1[24];                                    __IO uint32_t ISPR[8];                     uint32_t RESERVED2[24];                                   __IO uint32_t ICPR[8];                   uint32_t RESERVED3[24];                                   __IO uint32_t IABR[8];                     uint32_t RESERVED4[56];                                   __IO uint8_t  IP[240];                     uint32_t RESERVED5[644];                                  __O  uint32_t STIR;                         
}  NVIC_Type; 

每個中斷怎么設置優先級?
中斷優先級控制的寄存器組:IP[240]
全稱是:Interrupt Priority Registers。240個8位寄存器,每個中斷使用一個寄存器來確定優先級。STM32F10x系列一共60個可屏蔽中斷,使用IP[59]~IP[0]。每個IP寄存器的高4位用來設置搶占和響應優先級(根據分組),低4位沒有用到。

中斷使能寄存器組:ISER[8]
作用:用來使能中斷
32位寄存器,每個位控制一個中斷的使能。STM32F10x只有60個可屏蔽中斷,所以只使用了其中的ISER[0]和ISER[1]。ISER[0]的bit0到bit31 分別對應中斷0到31。ISER[1]的bit0到bit27對應中斷32~59;

中斷失能寄存器組:ICER[8]
作用:用來失能中斷
32位寄存器,每個位控制一個中斷的失能。STM32F10x只有60個可屏蔽中斷,所以只使用了其中的ICER[0]和ICER[1]。ICER[0]的bit0到bit31分別對應中斷0到31。ICER[1]的bit0到bit27對應中斷32~59;配置方法跟ISER一樣。

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

中斷掛起控制寄存器組:ISPR[8]
作用:用來掛起中斷

中斷解掛控制寄存器組:ICPR[8]
作用:用來解掛中斷

static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)

中斷激活標志位寄存器組:IABR [8]
作用:只讀,通過它可以知道當前在執行的中斷是哪一個如果對應位為1,說明該中斷正在執行。

static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)

中斷參數初始化函數

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
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寄存器

中斷優先級設置步驟
系統運行后先設置中斷優先級分組。調用函數:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整個系統執行過程中,只設置一次中斷分組。

針對每個中斷,設置對應的搶占優先級和響應優先級:

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

如果需要掛起/解掛,查看中斷當前激活狀態,分別調用相關函數即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272332.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker修改容器名字

查看一下容器的名字 這個laughing_elion是下載es時候默認的名字 修改容器名字 docker rename 容器原來名 要改為的名字 最后可以看到容器名已經修改成功

STM32 串行通信原理

處理器與外部設備通信的兩種方式: 并行通信 傳輸原理:數據各個位同時傳輸。優點:速度快缺點:占用引腳資源多 串行通信 傳輸原理:數據按位順序傳輸。優點:占用引腳資源少缺點:速度相對較慢 …

linus下centos7防火墻設置

CentOS7 默認使用firewalld防火墻,如果想換回iptables防火墻,可關閉firewalld并安裝iptables。 1:安裝firewalld服務 yum install firewalld 2、firewalld的基本使用 啟動: systemctl start firewalld (關閉后顯示notrunning&a…

串口通信寄存器/庫函數配置、實例編寫

常用的串口相關寄存器 USART_SR狀態寄存器USART_DR數據寄存器USART_BRR波特率寄存器 串口操作相關庫函數(省略入口參數): void USART_Init(); //串口初始化:波特率,數據字長,奇偶校驗,硬件流…

使用docker安裝Mongodb

下載mongo3.2的docker鏡像: docker pull mongo:3.2 使用docker命令啟動: docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:3.2 查看已經成功啟動

移動端meta標簽

現在的手機或平板電腦等移動設備上的瀏覽器默認都有雙擊放大的設置&#xff0c;如何阻止雙擊放大&#xff1f;user-scalableno <!-- 禁止縮放 --> <meta name”viewport” content”widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalableno”> <!…

正點原子stm32--串口通信實驗講解里關于USART_RX_STA的問題與思考

這篇博文講的挺詳細的可以參考以下&#xff1a; USART_RX_STA詳解

什么是真正的程序員?

什么是真正的程序員 這篇文章的原文來自&#xff1a;A Little Printf Story作者仿照《小王子》中的情節&#xff0c;通過小printf遇見的不同類型的程序員&#xff0c;最后悟出什么才是真正的程序員&#xff01;第一次翻譯有很多不妥&#xff0c;歡迎留言指正。 文章略長&#x…

為什么會出現docker

docker鏡像&#xff0c;一次構建&#xff0c;到處運行

docker和虛擬機的區別

虛擬機缺點&#xff1a; docker和虛擬機的不同之處&#xff1a;

獨立看門狗實驗

為什么要看門狗 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff0c;而陷入死循環&#xff0c;程序的正常運行被打斷&#xff0c;由單片機控制的系統無法繼續工作&#xff0c;會造成整個系統…

Manthan, Codefest 16

暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void main(String[] args) {Scanner cin new Scanner (new BufferedInputStream (System.in));int a cin.nextInt ();int b cin.nextInt ();int c cin.nextInt ();for…

docker資源

Docker資源 Docker官方英文資源&#xff1a; docker官網&#xff1a;http://www.docker.com Docker windows入門&#xff1a;https://docs.docker.com/windows/ Docker Linux 入門&#xff1a;https://docs.docker.com/linux/ Docker mac 入門&#xff1a;https://docs.do…

ios apple pay 證書配置

一 環境配置 需要開發者賬號 開發者中心https://developer.apple.com/membercenter/index.action 添加一個APP IDs二&#xff0e;配置Merchant IDs商業ID 下面進行appids和商業id的綁定 之后在回到appids中查看id中的apple pay&#xff0c;發現已經變為可使用狀態了 接下來是為…

STM32 通用定時器基本原理

STM32F10x系列總共最多有8個定時器&#xff1a; 三種STM32定時器區別&#xff1a; 通用定時器功能特點描述&#xff1a; ①、 STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定時器功能特點包括&#xff1a; 位于低速的APB1總線上(時鐘來源可以是APB1的時鐘) 16 位向上、向…

初識-Android之智能短信項目相關技術整理

標簽頁切換采用傳統的TabHost&#xff1a; 采用TabActivty實現TabHost。 效果圖-后補&#xff1a; 相關技術詳解推薦&#xff1a; http://blog.csdn.net/zhouli_05/article/details/7696054 這里我解決了一個TabActivity和子Activity共享TabActivity的OptionMenu的問題&#xf…

STM32 定時器中斷

通用定時器工作過程&#xff1a; 時鐘選擇&#xff1a; 計數器時鐘可以由下列時鐘源提供&#xff1a; 內部時鐘(CK_INT)外部時鐘模式1&#xff1a;外部輸入腳(TIx)外部時鐘模式2&#xff1a;外部觸發輸入(ETR)內部觸發輸入(ITRx)&#xff1a;使用一個定時器作為另一個定時器…