cortex—m4核心支援128級中斷巢狀,他有乙個8位暫存器,使用者可以通過這個暫存器設定中斷優先順序,但考慮到現在有些晶元不可能有這麼多中斷源,且支援這麼多級中斷巢狀堆疊也吃不消,大部分廠家都根據自己生產的晶元做出了調整,stm32f1和f4只是用了這個8位暫存器的高四位,低四位取零,這樣=16也就是表示支援16級中斷巢狀,對於這個nvic還有乙個新概念就是搶占優先順序pre-emption和子優先順序subpriority
·具有高搶占優先順序的中斷可以在具有低搶占優先順序的中斷處理過程中被響應,即中斷巢狀,或者說高響應級別的中斷可以巢狀低搶占優先順序的中斷
·在搶占優先順序相同的情況下,如果有低副優先順序的中斷正在執行,高副優先順序的中斷必須等待低優先順序的中斷執行完程式才能得到響應。如果同時中斷同時到來那麼高優先順序的中斷優先被響應。
·系統優先順序reset、nmi、hard fault優先順序為負高於普通優先順序且不可調整。
nvic 庫函式檔案
涉及到nvic庫檔案的主要有misc.c和core_cm4.h
·nvic_prioritygroupconfig (uint32_t nvic_prioritygroup)這個函式用於設定優先順序分組,記住系統復位預設是0分組
·void nvic_init(nvic_inittypedef* nvic_initstruct)
為了正確配置優先順序,需先呼叫一下優先順序分組nvic_prioritygroupconfig函式舉個例子
/* 設定nvic優先順序分組為group1:0-1搶占式優先順序,0-7的響應式優先順序 */
nvic_prioritygroupconfig(nvic_prioritygroup_1); nvic_initstructure.nvic_irqchannel = exti2_irqn; nvic_initstructure.nvic_irqchannelpreemptionpriority = 0x00; nvic_initstructure.nvic_irqchannelsubpriority = 0x01; nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
·void nvic_setvectortable(uint32_t nvic_vecttab, uint32_t offset)
·void nvic_systemlpconfig(uint8_t lowpowermode, functionalstate newstate)這個函式用於設定低功耗模式
·void nvic_setprioritygrouping(uint32_t prioritygroup)這個是arm公司寫的用了8位其目的跟前面nvic_prioritygrouping函式一致
·uint32_t nvic_getprioritygrouping(void)
此函式用於讀取優先順序分組。
·void nvic_enableirq(irqn_type irqn)
·void nvic_disableirq(irqn_type irqn)
這兩個函式是配套使用的,注意不能設定系統中斷有自己。
·nvic_setpendingirq(irqn_type irqn)
·nvic_clearpendingirq(irqn_type irqn)
·nvic_getpendingirq(irqn_type irqn)
這三個函式應該算是一組的, 設定掛起和清除掛起。
·nvic_getactive(irqn_type irqn)
這個函式用於獲得啟用狀態,也就是否進入了相應中斷程式。
·nvic_setpriority(irqn_type irqn, uint32_t priority)
uint32_t nvic_getpriority(irqn_type irqn)
這兩個函式應該算是一組的,乙個乙個用於設定中斷優先順序,乙個用於得到中斷的優先順序,關這兩函式有一點要特別的注意,它們既可以設定系統中斷也可以設定外設中斷,前面咱說的nvic_init函式是不能初始化系統中斷的,重新設定系統中斷的優先順序必須得使用這個函式。之所以會這樣是因為數是因為設定系統中斷和設定外設中斷的暫存器是不一樣。
__static_inline void nvic_setpriority(irqn_type irqn, uint32_t priority)
else }
系統中斷使用的是scb相關暫存器,外設終端使用的是nvic相關暫存器,這兩個函式的輸入輸出範圍是0-15。
·uint32_t nvic_encodepriority (uint32_t prioritygroup, uint32_t preemptpriority, uint32_t subpriority)
void nvic_decodepriority (uint32_t priority, uint32_t prioritygroup, uint32_t* ppreemptpriority, uint32_t* psubpriority)
這兩個函式是一組的,乙個用於優先順序編碼,乙個用於優先順序的解碼。使用者只需要將優先順序分組和想要配置的搶占優先順序賦值給這個編碼函式即可,返回值就是想要的優先順序編號。
stm32f4 定時捕獲
概述 1000hz 20 80 占空比現象 1000hz 51 58 占空比現象 關於本文的更多詳情請往下看。筆者針對於初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的 對初學者一看就明白,以簡單明瞭的工程供大家學習。stm32f4 tim輸入波形捕獲 脈衝頻率 占空比 例項 訪問密碼 st...
基於stm32f407建立stm32F427工程
分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...
STM32F4學習資源及方法
一 參考書 stm32f4xx中文參考手冊 stm32f3與f4系列cortexm4核心程式設計手冊 cortex m3與m4權威指南 1.stm32f4xx中文參考手冊 是st官方資料,包含了stm32f4各種暫存器及功能詳細介紹。2.stm32f3與f4系列cortexm4核心程式設計手冊 是對...