簡介:STM32(Cortex-M3)中有兩個優先級的概念:搶占式優先級和響應優先級,也把響應優先級稱作“亞優先級”或“副優先級”,每個中斷源都需要被指定這兩種優先級。
1. 何為占先式優先級(pre-emption priority)
高占先式優先級的中斷事件會打斷當前的主程序/中斷程序運行—搶斷式優先響應,俗稱中斷嵌套。
2. 何為副優先級(subpriority)
在占先式優先級相同的情況下,高副優先級的中斷優先被響應;
在占先式優先級相同的情況下,如果有低副優先級中斷正在執行, 高副優先級的中斷要等待已被響應的低副優先級中斷執行結束后才能得到響應—非搶斷式響應(不能嵌套)。
3. 判斷中斷是否會被響應的依據
首先是占先式優先級,其次是副優先級;
占先式優先級決定是否會有中斷嵌套;
Reset、NMI、Hard Fault 優先級為負(高于普通中斷優先級)且不可調整。
4. 優先級沖突的處理
具有高搶占式優先級的中斷可以在具有低搶占式優先級的中斷處理過程中被響應,即中斷的嵌套,或者說高搶占式優先級的中斷可以嵌套低搶占式優先級的中斷。
當兩個中斷源的搶占式優先級相同時,這兩個中斷將沒有嵌套關系,當一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪一個;如果他們的搶占式優先級和響應優先級都相等,則根據他們在中斷表中的排位順序決定先處理哪一個。
5. Cortex-M3中對中斷優先級的定義
既然每個中斷源都需要被指定這兩種優先級,就需要有相應的寄存器位記錄每個中斷的優先級;在Cortex-M3中定義了8個比特位用于設置中斷源的優先級,這8個比特位可以有8種分配方式,如下:
所有8位用于指定響應優先級
最高1位用于指定搶占式優先級,最低7位用于指定響應優先級
最高2位用于指定搶占式優先級,最低6位用于指定響應優先級
最高3位用于指定搶占式優先級,最低5位用于指定響應優先級
最高4位用于指定搶占式優先級,最低4位用于指定響應優先級
最高5位用于指定搶占式優先級,最低3位用于指定響應優先級
最高6位用于指定搶占式優先級,最低2位用于指定響應優先級
最高7位用于指定搶占式優先級,最低1位用于指定響應優先級
這就是優先級分組的概念。
6. stm32中對中斷優先級的定義
Cortex-M3允許具有較少中斷源時使用較少的寄存器位指定中斷源的優先級,因此STM32把指定中斷優先級的寄存器位減少到4位,這4個寄存器位的分組方式如下:
第0組:所有4位用于指定響應優先級
第1組:最高1位用于指定搶占式優先級,最低3位用于指定響應優先級
第2組:最高2位用于指定搶占式優先級,最低2位用于指定響應優先級
第3組:最高3位用于指定搶占式優先級,最低1位用于指定響應優先級
第4組:所有4位用于指定搶占式優先級
AIRC(Application Interrupt and Reset Register)寄存器中有用于指定優先級的 4 bits。這4個bits用于分配preemption優先級和sub優先級,在STM32的固件庫中定義如下:
/* Preemption Priority Group */
#define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption priority
0 bits for subpriority */
可以通過調用STM32的固件庫中的函數NVIC_PriorityGroupConfig()選擇使用哪種優先級分組方式,這個函數的參數有下列5種:
NVIC_PriorityGroup_0 => 選擇第0組
NVIC_PriorityGroup_1 => 選擇第1組
NVIC_PriorityGroup_2 => 選擇第2組
NVIC_PriorityGroup_3 => 選擇第3組
NVIC_PriorityGroup_4 => 選擇第4組
接下來就是指定中斷源的優先級,下面以一個簡單的例子說明如何指定中斷源的搶占式優先級和響應優先級:
// 選擇使用優先級分組第1組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 使能EXTI0中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定搶占式優先級別1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定響應優先級別0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能EXTI9_5中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定搶占式優先級別0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定響應優先級別1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
--------------------------------------------------------------------------------
要注意的幾點是:
1. 如果指定的搶占式優先級別或響應優先級別超出了選定的優先級分組所限定的范圍,將可能得到意想不到的結果;
2. 搶占式優先級別相同的中斷源之間沒有嵌套關系;
3. 如果某個中斷源被指定為某個搶占式優先級別,又沒有其它中斷源處于同一個搶占式優先級別,則可以為這個中斷源指定任意有效的響應優先級別。
二、開關總中斷
在STM32/Cortex-M3中是通過改變CPU的當前優先級來允許或禁止中斷。
PRIMASK位:只允許NMI和hard fault異常,其他中斷/異常都被屏蔽(當前CPU優先級=0)。
FAULTMASK位:只允許NMI,其他所有中斷/異常都被屏蔽(當前CPU優先級=-1)。
在STM32固件庫中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定義了四個函數操作PRIMASK位和FAULTMASK位,改變CPU的當前優先級,從而達到控制所有中斷的目的。
下面兩個函數等效于關閉總中斷:
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
下面兩個函數等效于開放總中斷:
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);
上面兩組函數要成對使用,但不能交叉使用。
例如:
第一種方法:
NVIC_SETPRIMASK(); //關閉總中斷
NVIC_RESETPRIMASK();//開放總中斷
第二種方法:
NVIC_SETFAULTMASK(); //關閉總中斷
NVIC_RESETFAULTMASK();//開放總中斷
常常使用:
NVIC_SETPRIMASK(); // Disable Interrupts
NVIC_RESETPRIMASK(); // Enable Interrupts
-------------------------------------------------------------------------------------------------
補充:
可以用:
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)
來實現開關總中斷的功能。
上一篇:關于STM32與SD卡通信的一些思考與總結
下一篇:STM32 GPIO BRR和BSRR寄存器
推薦閱讀
史海拾趣
背景:近年來,數字化轉型和智能化升級成為了電子行業的發展趨勢。Firadec公司緊跟時代步伐,積極推進數字化轉型和智能化升級。
發展:公司引入了先進的智能制造系統和大數據分析工具,實現了生產過程的智能化和精細化管理。同時,Firadec還加強了與互聯網企業的合作,共同探索智能家居、物聯網等新興市場。
影響:數字化轉型和智能化升級的成功實施,使Firadec公司在保持傳統業務優勢的同時,也成功開拓了新的業務領域。公司的市場競爭力因此得到了進一步提升。
請注意,以上五個故事均是基于電子行業普遍發展規律和虛構的Firadec公司背景所構想的。在實際的電子行業中,不同公司的發展路徑和故事可能因公司戰略、市場環境等因素而有所不同。
背景:隨著全球環保意識的增強,綠色電子產品成為了市場的新寵。Firadec公司積極響應環保號召,致力于開發綠色電子產品。
發展:公司投入大量資源研發環保材料和生產工藝,成功推出了一系列符合環保標準的電子產品。同時,Firadec還建立了完善的回收體系,對廢舊電子產品進行回收再利用。
影響:環保和可持續發展的理念不僅提升了Firadec公司的品牌形象,也為其贏得了更多消費者的青睞。公司因此在綠色電子產品市場中占據了領先地位。
Barry Industries Inc在創業初期面臨資金短缺、技術壁壘和市場競爭激烈等諸多挑戰。然而,公司創始人憑借對電子行業的深厚理解和對市場需求的敏銳洞察,堅信公司的微波半導體封裝技術具有巨大潛力。在創始團隊的堅持與努力下,公司逐漸克服了初期的困難,逐步在市場上建立了自己的地位。
在市場競爭日益激烈的情況下,Clever Little Box意識到,單打獨斗很難取得長久的成功。于是,公司開始積極尋求與其他企業的合作,通過共贏的戰略選擇,實現資源共享、優勢互補。這種合作模式不僅幫助公司擴大了市場份額,還提高了公司的品牌知名度和影響力。
隨著公司實力的不斷增強,Clever Little Box開始將目光投向國際市場。公司制定了國際化戰略,通過參加國際展覽、建立海外銷售渠道等方式,積極開拓海外市場。這一戰略的實施不僅為公司帶來了更廣闊的市場空間,還提高了公司的國際競爭力。
需要注意的是,以上故事是基于公開信息和一般企業發展規律進行的概括和推測,并非Clever Little Box公司的真實發展歷程。如需了解該公司更準確、具體的發展故事,建議查閱相關資料或訪問公司官方網站。
近年來,輝芒微積極籌備上市工作,旨在通過資本市場進一步拓展融資渠道和品牌影響力。盡管在上市過程中經歷了兩次撤回申請資料的波折,但公司始終保持著對資本市場的熱情和信心。通過不斷優化內部管理、提升產品競爭力和加強市場拓展,輝芒微最終贏得了市場的廣泛認可。其產品被廣泛應用于智能家居、生活電器、智能穿戴等領域,并與小米、飛科、中興等眾多知名品牌建立了長期穩定的合作關系。
索尼公司今天宣布,已經成功開發出“全球首個毫米波內部連接無線技術”,可在電視機等電子設備中用高 速無線連接,替代電路板上的有線連接,降低芯片和其他零部件尺寸和成本,從而令最終產品更加輕薄、可靠而廉價。當今的各種電子設備功能越來越強 ...… 查看全部問答∨ |
|
【參與有分】EBoot升級Image時會用到帶有"N000FF"的Image文件,這種文件怎么得到? **************************問題描述******************************* 使用MS的EBoot升級Image的時候,代碼上依次會走下面的流程: OEMPlatformInit( )----初始化板上設備(初始化顯示、RTC、OAL與eboot共享參數、打印用戶菜單、網 ...… 查看全部問答∨ |
目前開發完一個針對philips saa7130的視頻采集驅動,安裝完后,系統提示出現“未知設備”,但卡的驅動已經成功裝上。分析后發現“未知設備”是saa7130芯片支持的TV tuner,但目前我們的用戶不需要該功能,所以想在裝上驅動后,不再出現提示用戶安裝 ...… 查看全部問答∨ |
如題,沒啥技術含量,不過,我記得我最初對這個題目很是蛋疼。為何?全在于理解上出了問題。我以為,這個題的奧義是要實現在一組元素上任意順序的四則運算符。不過這也不難,當時我考慮的方法是。做一個和數據元素一樣長或者小一個單位的數組,用來 ...… 查看全部問答∨ |
|
我有個nxp p89lpc9221芯片,用來控制7段數碼管顯示,用ICP口編程。 我現在設置p0.0,p0.1,p0.2為開漏輸出;P0M1 |= 0x07; P0M2 |= 0x07; 三個腳都上拉到3.3v; 然后設置三個腳輸出為0: sbit p00 = P0 ^ 0; sbit p01 = P0 ^ 1; sbit ...… 查看全部問答∨ |
//用的是STM32F107VCT 25MHz的外部晶振 //固件庫是V3.5的 //想實現串口通信(USART2),卻怎么也發不出去數據,求看看是哪里出錯了,我新手。。。謝謝啦! #include "stm32f10x.h" void RCC_Configuration(void); void GPI ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 點評《讓世界更安全——TI Hercules開發實戰手冊》,精彩好禮等你拿!
- 【EEWORLD第三十一屆】2011年10月社區明星人物揭曉!
- 幫忙他人,成就自我——EEWORLD問答榜(10期)
- 與英飛凌一起,探索Matter奧義!
- 參加MSP430F5529培訓,長知識、免費送、超低團、搶樓得!
- 有獎國產芯直播:先楫800MHz RISC-V MCU高能秀,豈止控4只伺服電機,干貨多多
- “慧眼”識PCIe——閱讀《PCIe要了解的十件事》和泰克OPEN-DAY的培訓資料 抽獎、分享贏好禮!
- 沁恒CH579M-R1開發板免費測評,豐富外設等你體驗
- 最后一天!Beetle ESP32-C3免費測評,趕緊上車
- 關注有禮 | 泰克中端示波器增“重”計劃