STM32(Cortex-M3)中的優先級理解

2020-12-20 電子產品世界
很多人在配置STM32中斷時對固件庫中的這個函數NVIC_PriorityGroupConfig()——配置優先級分組方式,會很不理解,尤其是看中文翻譯版的,因為中文翻譯版裡把這裡翻譯成「先佔優先級和從優先級」這樣翻譯其實是不對的,很容易讓人誤解。為了便於大家理解,有必要先解釋兩個概念:

搶佔式優先級/響應優先級:

本文引用地址:http://www.eepw.com.cn/article/201611/322703.htm

STM32(Cortex-M3)中有兩個優先級的概念——搶佔式優先級和響應優先級,有人把響應優先級稱作亞優先級或副優先級,每個中斷源都需要被指定這兩種優先級。

具有高搶佔式優先級的中斷可以在具有低搶佔式優先級的中斷處理過程中被響應,即中斷嵌套,或者說高搶佔式優先級的中斷可以嵌套在低搶佔式優先級的中斷中。

當兩個中斷源的搶佔式優先級相同時,這兩個中斷將沒有嵌套關係,當一個中斷到來後,如果正在處理另一個中斷,這個後到來的中斷就要等到前一個中斷處理完之後才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪一個;如果他們的搶佔式優先級和響應優先級都相等,則根據他們在中斷表中的排位順序決定先處理哪一個。

看了上面的介紹後,相信大家都明白了這裡面的關係了,總結下便是:搶佔式優先級>響應優先級>中斷表中的排位順序(其中「>」理解為比較的方向)。

正是因為每個中斷源都需要被指定這兩種優先級,就需要有相應的寄存器位記錄每個中斷的優先級;在Cortex-M3中定義了8個比特位用於設置中斷源的優先級,這8個比特位可以有8種分配方式,如下:

1.所有8位用於指定響應優先級

2.最高1位用於指定搶佔式優先級,最低7位用於指定響應優先級

3.最高2位用於指定搶佔式優先級,最低6位用於指定響應優先級

4.最高3位用於指定搶佔式優先級,最低5位用於指定響應優先級

5.最高4位用於指定搶佔式優先級,最低4位用於指定響應優先級

6.最高5位用於指定搶佔式優先級,最低3位用於指定響應優先級

7.最高6位用於指定搶佔式優先級,最低2位用於指定響應優先級

8.最高7位用於指定搶佔式優先級,最低1位用於指定響應優先級

以上便是優先級分組的概念,但是Cortex-M3允許具有較少中斷源時使用較少的寄存器位指定中斷源的優先級,因此STM32把指定中斷優先級的寄存器位減少到4位,這4個寄存器位的分組方式如下:

第0組:所有4位用於指定響應優先級

第1組:最高1位用於指定搶佔式優先級,最低3位用於指定響應優先級

第2組:最高2位用於指定搶佔式優先級,最低2位用於指定響應優先級

第3組:最高3位用於指定搶佔式優先級,最低1位用於指定響應優先級

第4組:所有4位用於指定搶佔式優先級

這裡便對于于文章最前提到的固件庫裡相關的函數了——NVIC_PriorityGroupConfig(u32NVIC_PriorityGroup),函數的參數共有5種:

這個函數的參數(NVIC_PriorityGroup值)有下列5種:

NVIC_PriorityGroup_0 =>選擇第0組

NVIC_PriorityGroup_1 =>選擇第1組

NVIC_PriorityGroup_2 =>選擇第2組

NVIC_PriorityGroup_3 =>選擇第3組

NVIC_PriorityGroup_4 =>選擇第4組

這其實也很好理解,比如選擇NVIC_PriorityGroup_1,那麼搶佔式優先級便佔一位,也就是說可以有2^1個級別,可以設置為0和1,而響應優先級則佔3位,也就是說可以有2^3個選擇,可以設置為0~7;總共來說就可以區別>16種優先級(為什麼大於而不是等於,想想就應該明白了)

舉個例子吧,假如現在有4個外部中斷,還有一個EXTI9_5中斷,那麼如果選擇優先級分組為第1組,那麼搶佔式優先級便只有兩種,5個中斷就至少有3個在搶佔式優先級上是相同的優先級上,其他兩個在另一優先級別。接著設置響應優先級可以有8種選擇(即每個中斷都要設計搶佔優先級及響應優先級);假如現在同時有兩個搶佔式優先級別相同的中斷發生,那麼處理的順序是誰的響應優先級高則誰優先進入中斷,另外這點是需要注意的,如果此時進入這個中斷之後又來了一個搶佔式優先級相同但是響應優先級更高的中斷,這時也是不會打斷已有的中斷的。

轉自:http://www.cnblogs.com/rdyzju/archive/2012/05/23/2514445.html

2 GPIO外部中斷

STM32中,每一個GPIO都可以觸發一個外部中斷,但是,GPIO的中斷是以組位一個單位的,同組間的外部中斷同一時間只能使用一個。比如說,PA0,PB0,PC0,PD0,PE0,PF0,PG0這些為1組,如果我們使用PA0作為外部中斷源,那麼別的就不能夠再使用了,在此情況下,我們智能使用類似於PB1,PC2這種末端序號不同的外部中斷源。每一組使用一個中斷標誌EXTIx。EXTI0 – EXTI4這5個外部中斷有著自己的單獨的中斷響應函數,EXTI5-9共用一個中斷響應函數,EXTI10-15共用一個中斷響應函數。

對於中斷的控制,STM32有一個專用的管理機構:NVIC。對於NVIC的詳細解釋,可以參考《ARM Cortex-M3權威指南》,Joseph Yiu著,宋巖譯,北京航空航天大學出版社出版,第8章NVIC與中斷控制。中斷的使能,掛起,優先級,活動等等部都是NVIC在管理的。因為我學習STM32重點在於如何開發程序,所以內部的一些東西,在此我就不詳細說明了,有感興趣的可以參看上面提到的那本數。

相關焦點

  • STM32 (Cortex-M3) 中NVIC(嵌套向量中斷控制)的理解
    一、STM32 (Cortex-M3) 中的優先級概念本文引用地址:http://www.eepw.com.cn/article/148443.htmSTM32(Cortex-M3)中有兩個優先級的概念:搶佔式優先級和響應優先級,也把響應優先級稱作「
  • STM32 (CortexM3) 中NVIC(嵌套向量中斷控制)的理解
    持續更新中。。。一、STM32 (Cortex-M3) 中的優先級概念    STM32(Cortex-M3)中有兩個優先級的概念:搶佔式優先級和響應優先級,也把響應優先級稱作「亞優先級」或「副優先級」,每個中斷源都需要被指定這兩種優先級。1.
  • stm32屬於arm嗎_arm和stm32的區別
    stm32屬於arm嗎?   1、體積小、低功耗、低成本、高性能;   2、支持Thumb(16位)/ARM(32位)雙指令集,能很好的兼容8位/16位器件;   3、大量使用寄存器,指令執行速度更快;   4、大多數數據操作都在寄存器中完成;   5、尋址方式靈活簡單,執行效率高;   6、指令長度固定。
  • STM32 的核心Cortex-M3 處理器
    嵌套中斷向量控制器(Nested Vector Interrupt Controller,簡稱NVIC)是Cortex-M3 處理器中一個比較關鍵的組件,它為基於Cortex-M3 的微控制器提供了標準的中斷架構和優秀的中斷響應能力,為超過240 個中斷源提供專門的中斷入口,而且可以賦予每個中斷源單獨的優先級。
  • Arm技術文檔分享|Cortex-M 系列處理器Cortex-M3 DesignStart FPGA...
    ARM Cortex-M1 FPGA 處理器專用於要求使用集成到 FPGA 中的小型處理器的深層嵌入式應用程式。ARM Cortex-M0 處理器是一個門數非常低、能效非常高的處理器,專用於微控制器和要求使用面積優化處理器的深層嵌入式應用程式。
  • stm32開發板例程講解之一:使用IAR 5.3建立工程
    學習stm32,入門是非常關鍵的,而自己建的第一個也就顯得很重要了。儘快入門,建立起學習的信心,對後續的學習有非常大的幫助。本文將講述任何在IAR上建立一個project,並開始自己學習stm32的第一個實驗。
  • STM32中斷過程詳解
    1.因為cortex_m3 內核對於每一個外部中斷通道都有相應的控制字和控制位,用於單獨的和總的控制該中斷通道。它們包括有: 中斷優先級控制字:PRI_n(前面有提到過) 中斷允許設置位:在 ISER 寄存器中 中斷允許清除位:在 ICER 寄存器中 中斷懸掛 Pending(排隊等待)位置位:在 ISPR 寄存器中(類似於置中斷通道標誌位) 中斷懸掛 Pending(排隊等待)位清除:在 ICPR 寄存器中(用於清除中斷通道標誌位)
  • ARM7、ARM9、ARM11、ARM-Cortex系列的關係
    ARM7,ARM9,cortex-m3,cortex-m4,cortex-a8的區別arm系列從arm11開始,以後的就命名為cortex,並且性能上大幅度提升。從cortex開始,分為三個系列,a系列,r系列,m系列。m系列與arm7相似,不能跑作業系統(只能跑ucos2),偏向於控制方面,說白了就是一個高級的單片機。
  • 了解Cortex-M3的中斷
    此函數跟中斷配置相關,配置中斷優先級,包括搶佔優先級與子優先級。關於NVIC(中斷向量控制器)的介紹STM32參考手冊中是找不到的。需要看《Cortex-M3權威指南》,這本書是著重描述此M3內核相關的東西。NVIC也在其中,因為它是內核中很重要的一部分。
  • Cortex-M3掃盲
    不管怎麼說,這兩本資料都是權威到「古文觀止」級的,但同時也是天書,絕對能讓大多數新手看得「老虎,老鼠,傻傻分不清楚」。推薦大家把它們作為後備的參考資料,待到遇到疑難雜症時再去求助它們。2. 其他人寫的講解Cortex-M3的書籍。目前最著名的一本是《The Definitive Guide to the ARM Cortex-M3》。
  • IAR STM32 函數和變量的絕對地址定位
    } .icf文件,加入這樣一句:place at address mem:0x08017000 { readonly section .sendstr};方法二)把要更新的函數,單獨放在一個.c文件中,然後再.icf文件裡面,對該文件進行定位:test.cint f1(int a,int b){if(a>0){
  • CORTEX-M3與STM32_M3內核STM32的三相多功能電能表解決方案
    (一)採集數據處理與計算 在實際應用中,電力信號通過互感器採集到電能表中,通過一個6通道16位模擬前端處理器(AD73360)進行A/D轉換,轉換成數位訊號並傳輸到STM32中。 式中:Q-單元件無功功率,n-每周期採樣點數, uk-元件上電壓採樣值, ik-元件上電流採樣值(90度移相後) 三相四線三元件有功功率計算式: PΣ=Pu+Pv+Pw 式中: PΣ-三相有功功率
  • ARM Cortex-M3 內核介紹
    這下就有 3個 DPs可以選了,晶片製造商可以從中選擇一個,以提供具體的調試接口(通常都是選SWJ‐DP)。2. ETM的作用就是記錄處理器做的事情並送到外面的調試器。軟體調試器允許使用JTAG接口對ETM進行配置並以用戶易於理解的格式顯示捕獲到的跟蹤信息。ETM直接連接到ARM內核而不是主AMBA 系統總線。3.NVIC是Cortex-M3處理器中一個完整的部分,它可以進行高度配置,為處理器提供出色的中斷處理能力。
  • stm32通用定時器用做外部脈衝計數器的例程
    最近幾天要用到stm32對外部輸入脈衝進行計數,很自然想到定時器,可是手上資料沒有講解stm32定時器如何用作外部計數器的,在網上找例程,也沒找到幾個正確的,自己硬著頭皮仔細研究參考手冊,終於知道如何配置了,並寫了一個例程,希望將來對一些網友有用。
  • STM32系統滴答_及不可不知的延時技巧上
    此時若其它外部中斷優先級設置比它高時,可以剝奪它進而轉向外部中斷。當外部中斷優先級比較高時,它可以搶佔Systick中斷先執行,以上代碼實驗結果為,LED0先點亮後,再回到LED1再點亮。當把外部中斷設置為與systick相同的優先級時,則systick優先級就會相對較高,例如把上面的優先級改為NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;則會LED1先亮,執行完SysTick_Handle
  • Python基礎篇——關於Python中的and, or, not的用法和優先級
    一、not、and、or的含義以及優先級含義:not是 「非」 ;and是 「與」 ;or是 「或」 (可以用數學去理解)1、not True = False 或者 not False = True (非真就是假,非假即真)2、and是一假則假,兩真為真,兩假則假3、or是一真即真,兩假即假,兩真則真優先級是 not
  • 實戰中,需求優先級怎麼定
    因為我這邊對接的需求方是好幾個相對獨立的方向,這就導致在每一個需求方眼裡,自己的需求都是P0優先級,而最後匯總到我這邊時,就會出現所有需求優先級都是高優,需求排期中的優先級因素基本相當於無效。這種情況很危險。原因在於,需求主次拎不清,不單單在於無法滿足需求方希望數據同學提供一些數據洞察的需求;同時,數據同學數據驅動的工作部分會被擠佔地越來越少,數據同學存在的價值在「降低」。
  • 產品需求的優先級排序方法
    本次分享邀請大家共同學習優先級排序的各類方法,以便於結合實際工作來確定適合自己的方法。就好比是先看見樹林、然後進去仔細再尋找符合自己的樹木。以下是課程回顧的具體內容:在NPDP及項目管理的知識體系中有很多需求收集的工具和技術(如下圖總結)。
  • 私募股權基金有優先級與劣後級嗎?
    可以理解為,前者投資青年,後者投資少年。另外與上述私募基金對應的,是私募證券投資基金。所謂證券,就是股票、債券等金融憑證。這類私募基金專門投資於二級市場,就是我們平時所熟知的私募基金。二、優先級、劣後級私募股權基金,是有分「優先級」與「劣後級」的。