stm32的中斷分為 1.搶占優先級。 2.子優先級。
1.搶占優先級。搶占優先級高的中斷,可以打斷搶占優先級低的中斷。
2.子優先級。搶占優先級相同的中斷,子優先級高的可以優先執行。
其實,子優先級主要給出了一種響應的優先隊列。假設中斷的搶占優先級都相同。如果有多個相同搶占優先級的中斷來了 ,那么他們不會互相打斷,但是他們后續的排隊會按照子優先級排隊。也就是說,在第一個中斷沒有執行完的期間內,后續的最高級的子優先級是被安排到最高等待位處理的。
NVIC設置流程:
定義NVIC初始化結構體;
配置優先級分組;
往NVIC初始化結構體中填充,如中斷源,搶占優先級,子優先級,使能等;
調用NVIC初始化函數;
編寫中斷服務函數;
static void EXTI_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
// 先設置中斷優先級分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void EXTI0_IRQHandler(void)
{
// 判斷是否發生中斷
// 與函數FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);功能相同
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
LED_R_TOGGLE;
}
// 清除標志位,往EXTI_PR寄存器寫1,與函數void EXTI_ClearFlag(uint32_t EXTI_Line)功能相同
// 之所有一個功能有兩個一樣的函數,是為了兼容舊的固件庫
EXTI_ClearITPendingBit(EXTI_Line0);
}
stm32的中斷可以分為系統異常10個(內核)和外部中斷60個(外設)。NVIC是內核的外設,管理包括內核和片上外設所有的中斷功能,在core_cm3.h和misc.h中。
NVIC的寄存器描述:
ISER:中斷使能寄存器,對應60個外設的不可屏蔽中斷,其中NVIC_ISER0的0~31位對應著中斷向量表中的編號0~31,NVIC_ISER1對應著32~63,ISER2對應剩余位,其中還存在一些保留位,要想開啟特定的中斷,設置特定的位就可以。
ICER:中斷清除寄存器,對應60個外設的不可屏蔽中斷。與ISER類似,要想清除特定的中斷,設置特定的位就可以。
ISPR:中斷掛起寄存器,可掛起正在執行的中斷,設置特定位。當置位此寄存器時,這個中斷不會立即執行,而是等待可執行的時候再執行;比如高低級別的中斷同時產生,CPU會自然的將低級別的中斷掛起,當高優先級中斷執行完畢后,再去處理低優先級中斷,這個時候需要清除掛起位(使用ICPR),然后執行低級別中斷。
ICPR:中斷解除掛起寄存器,可以解除被掛起的中斷。
IABR:中斷激活標志寄存器(只讀),可讀取該寄存器判斷當前執行的中斷是哪個,中斷執行完硬件清零。
IPR:中斷優先級寄存器,用于中斷分組。
STIR:軟件觸發中斷寄存器,用于系統任務調度,編寫SDK(不讓別人看到代碼)。
core_cm3.h中的NVIC結構體:
typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */
} NVIC_Type;
stm32設計了8個ISER寄存器,實際上只用到其中的3個,之所以設計這么多組,是為了后續內核和外設資源的升級來考慮的,中間有24個保留地址,總共是32個32位地址,所以ICER的偏移地址為0X80(每4個地址增加0X10),以此類推。
值得注意的是,設置中斷優先級的寄存器是8位有效(ARM規定),實際上stm32只使用了高4位,忽略低4位。但是中斷優先級寄存器IPR是32位的,因此,每8位寄存器為一個優先級數組IP,每個IPR寄存器表示4個IP優先級分組,如下圖:
misc.h中實現了NVIC所有的功能函數:
// 優先級分組
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
// NVIC初始化
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
// 設置中斷向量表
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
// 設置系統進入低功耗模式
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
// 設置內核時鐘來源,72M或72M/8=9M(8分頻)
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);
NVIC初始化結構體
/**
* @brief NVIC Init Structure definition
*/
typedef struct
{
uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled.
This parameter can be a value of @ref IRQn_Type
(For the complete STM32 Devices IRQ Channels list, please
refer to stm32f10x.h file) */
uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel
specified in NVIC_IRQChannel. This parameter can be a value
between 0 and 15 as described in the table @ref NVIC_Priority_Table */
uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified
in NVIC_IRQChannel. This parameter can be a value
between 0 and 15 as described in the table @ref NVIC_Priority_Table */
FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
will be enabled or disabled.
This parameter can be set either to ENABLE or DISABLE */
} NVIC_InitTypeDef;
/**
* @}
*/
/** @defgroup NVIC_Priority_Table
* @{
*/
/**
@code
The table below gives the allowed values of the pre-emption priority and subpriority according
to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
============================================================================================================================
NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description
============================================================================================================================
NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority
| | | 4 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority
| | | 3 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority
| | | 2 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority
上一篇:stm32專題五:時鐘樹(四)自定義配置HSI時鐘
下一篇:stm32專題七:EXTI(一)外部中斷/事件控制器框圖
推薦閱讀
史海拾趣
APM公司由一群熱衷于微電子技術的專家在亞太地區創立。初創時期,公司面臨著資金緊張、市場競爭激烈以及技術瓶頸等多重挑戰。然而,APM憑借其團隊對技術的深刻理解和對市場的敏銳洞察,成功開發出一款具有競爭力的微控制器產品,迅速在市場中占據了一席之地。這款產品不僅性能穩定,而且價格適中,滿足了當時市場對低成本、高性能微控制器的迫切需求。
為了進一步提升市場份額和品牌影響力,APM開始積極拓展國內外市場。公司不僅加強了與現有客戶的合作關系,還積極參加各類行業展會和技術交流會,與潛在客戶建立聯系。同時,APM還加大了對品牌建設的投入,通過廣告宣傳、媒體報道等方式提升品牌知名度和美譽度。這些舉措使得APM在電子行業中的影響力逐漸增強。
APM公司由一群熱衷于微電子技術的專家在亞太地區創立。初創時期,公司面臨著資金緊張、市場競爭激烈以及技術瓶頸等多重挑戰。然而,APM憑借其團隊對技術的深刻理解和對市場的敏銳洞察,成功開發出一款具有競爭力的微控制器產品,迅速在市場中占據了一席之地。這款產品不僅性能穩定,而且價格適中,滿足了當時市場對低成本、高性能微控制器的迫切需求。
隨著科技的不斷發展,DIOFIT公司始終將技術創新作為發展的核心驅動力。他們不斷投入研發資金,引進先進技術和人才,致力于研發具有自主知識產權的電子產品。在物聯網、人工智能等前沿領域,DIOFIT公司取得了一系列突破性的成果,推出了一系列具有競爭力的產品,成為行業內的技術創新引領者。
DIOFIT公司自創立之初,便面臨著激烈的市場競爭和技術挑戰。創始人團隊憑借對電子技術的深入理解和熱情,決心打造一家專注于高端電子產品研發和生產的企業。在資金緊張、人才匱乏的情況下,他們堅持自主研發,不斷優化產品設計,最終成功推出了一款具有創新性的智能家居控制系統,贏得了市場的認可,為公司的發展奠定了堅實的基礎。
在市場競爭日益激烈的情況下,Clever Little Box意識到,單打獨斗很難取得長久的成功。于是,公司開始積極尋求與其他企業的合作,通過共贏的戰略選擇,實現資源共享、優勢互補。這種合作模式不僅幫助公司擴大了市場份額,還提高了公司的品牌知名度和影響力。
請教甲機通過串口控制乙機LED閃爍試驗中的定時器T1有什么作用 #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit LED1 = P0^0; sbit LED2 = P0^3; sbit K1 = P1^0; void Delay(uint x) { u ...… 查看全部問答∨ |
如題,用C#如何?。茫爬锏南嚓P序列號? 我在論壇里找了好久,但都是在Windows XP(2000)系統里的,請高人指點,或者在CE里如何用ManagementObject或MarshalAs 只要取的一個序列號即給分… 查看全部問答∨ |
本人用TIMERB3每隔幾毫秒產生一個中斷,并且P2口接按鍵(F133),使用P2口中斷進行一些按鍵操作,但是現在感覺按鍵操作很偶爾的才會有反應,而且是按了很多次可能才會有一次反應。 我估計是和定時中斷產生沖突了,問可有什么解決方按?!? 查看全部問答∨ |
歡迎來到電源設計小貼士!隨著現在對更高效、更低成本電源解決方案需求的強調,我們創建了該專欄,就各種電源管理課題提出一些對您有幫助的小技巧。該專欄面向各級設計工程師。無論您是從事電源業務多年還是剛剛步入電源領域,您都可以在這里找到 ...… 查看全部問答∨ |
【視頻分享】DM8168高清處理解決方案ETV-HDV8168-HDMI產品介紹 基于TI(德州儀器)公司的DM8168芯片的強大處理性能,可同時進行全高清H.264編碼、解碼、圖像智能識別應用,使圖像處理真正跨入1080p 60幀全高清時代。 $(\'swf_Eic\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'al ...… 查看全部問答∨ |
[C/C++] 【高效c語言】(四)--switch與if的效率 switch與if的區別 如果純粹比較數字或字符,建議使用switch,因為它只會在一開始的switch括號中取出變量值一次,然后將這個值與下面所設定的case比較,但如果使用if,每次遇到條件式時,都要取出變量值,效率的差異就在這兒。例如: if(a == 1) ...… 查看全部問答∨ |
一些基礎的東西學完了,如何進一步的成長,該學習哪些書呢? 如果沒有讀過計算機專業的基礎課程,那么計算機基礎課程是一定要學習的。 1.數據結構、離散數學、操作系統、編譯原理這四門課學習完。數據結構和操作系統兩門課程一定要細心學 ...… 查看全部問答∨ |
基于at89c51制作數字時鐘,(必須用兩個4位數碼管)求程序。電路圖。急求、 本帖最后由 害羞的小黃瓜 于 2014-5-10 10:22 編輯 。。。。求發郵箱634494591@qq.com … 查看全部問答∨ |
公司讓尋找一種傳感器,要求測量水下的一種作用力,但是受到水壓的干擾作用,要將水壓干擾消除,得到可用的力作用信號。本想用惠思登電橋測量,用兩個應變片,一個測量水壓,一個測量水壓與作用力的壓力,兩個由于電橋電路直接將水壓消除掉,得到近 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- Linux系統編程篇丨迅為IMX6ULL-對應視頻講解
- 嵌入式學習丨4412開發板-uboot源碼-匯編-源碼分析(一)嵌入式學習丨4412開發板-uboot源碼-匯
- 迅為IMX6ULL開發板-主頻和時鐘配置例程(二)
- 迅為IMX6ULL開發板-主頻和時鐘配置例程
- 迅為IMX6ULL開發板安裝VMware Tool工具
- i.MX6ULL終結者Debian文件系統的構建i.MX6ULL 移植Debian文件系統
- 迅為i.MX6ULL開發板按鍵例程編譯及運行
- 迅為-i.MX6開發板手冊更新-非設備樹uboot-修改默認環境變量
- 迅為-IMX6ULL-QT應用_在開發板上移植ssh
- 迅為-i.MX6ULL開發板-QT實戰項目DHT11&網絡編程實戰練習(一)
- TI模電選課測試體驗活動第二期!模電怎么學?TI幫你訂制課程清單~
- 尋人:熟悉“儀器儀表校準流程”的工程師來報到啦!
- 直播已結束【Molex 新能源汽車低壓連接器解決方案】
- 【EEWORLD第二十三屆】2011年02月社區明星人物揭曉!
- EEWORLD社區5月明星人物出臺嘍!
- 瑞薩電子顛覆傳統理念的嵌入式開發平臺 Renesas Synergy™ 評估套件震撼來襲!答題即可免費申請!
- 評論贏好禮|TI SK-AM64評估套件測評
- 遇見春天,“愚”你同樂 快來與keysight一起學習 光通信測試測量解決方案 下載贏好禮!
- 全球首款Cortex-M23內核物聯網芯片SAML10和SAM L11系列 闖關獲取SAML10/SAML11法寶,拆除電子界安全危機,贏好禮!
- 答題贏好禮| ADI 智能樓宇煙霧探測方案