斷斷續(xù)續(xù)學(xué)習(xí)STM32一學(xué)期了,時(shí)間過的好快,現(xiàn)在對STM32F103系列單片機(jī)的中斷嵌套及外部中斷做一個(gè)總結(jié),全當(dāng)學(xué)習(xí)筆記。廢話不多說,ARM公司的Cortex-m3 內(nèi)核,支持256個(gè)中斷,其中包含16個(gè)內(nèi)核中斷和240個(gè)外部中斷,并且具有256級的可編程中斷設(shè)置。在ST公司的STM32單片機(jī)中最多有84個(gè)中斷,包括16個(gè)內(nèi)核中斷(這16個(gè)內(nèi)部中斷是任何半導(dǎo)體商也改不了的),和68個(gè)可屏蔽中斷,具有16級可編程的中斷優(yōu)先級。但是在STM32F103系列中只有60個(gè)可屏蔽中斷,(107系列有68個(gè))。
針對這60個(gè)可屏蔽中斷,重點(diǎn)掌握它的一個(gè)中斷優(yōu)先級寄存器組IPR,全稱Interrupt Priority Registers。這個(gè)寄存器組包含15個(gè)32位的寄存器,一個(gè)可屏蔽中斷占用8bit,那么一個(gè)寄存器可以控制4個(gè)可屏蔽中斷,一共15*4=60。然而在這占用的8bit中又只使用了高4bit,這高4bit的分配才是STM32F103系列單片機(jī)中斷嵌套的設(shè)置所在。STM32F103系列的中斷嵌套分為5個(gè)組,分別是0、1、2、3、4 這5個(gè)組,下面是5個(gè)組與中斷嵌套的對應(yīng)關(guān)系。
組 | 分配結(jié)果 |
0 | 0位搶占優(yōu)先級,4位響應(yīng)優(yōu)先級 |
1 | 1位搶占優(yōu)先級,3位響應(yīng)優(yōu)先級 |
2 | 2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級 |
3 | 3位搶占優(yōu)先級,1位響應(yīng)優(yōu)先級 |
4 | 4位搶占優(yōu)先級,0位響應(yīng)優(yōu)先級
|
對于搶占優(yōu)先級和響應(yīng)優(yōu)先級,只需記住兩點(diǎn),第一、搶占任何優(yōu)先級比都比所有響應(yīng)優(yōu)先級優(yōu)先級高。只有搶占優(yōu)先級更高的具有中斷嵌套功能。(即打斷其他正在執(zhí)行的中斷)。第二、數(shù)字越小優(yōu)先級越高 ,搶占優(yōu)先級和響應(yīng)優(yōu)先級都一樣時(shí),首先響應(yīng)中斷通道對應(yīng)中斷向量地址低的那個(gè)中斷。
下面對0組和1組的情況做一個(gè)分析。
0組對應(yīng)是0位搶占優(yōu)先級,4位響應(yīng)優(yōu)先級,那么無搶占優(yōu)先級,響應(yīng)優(yōu)先級可設(shè)置為0到15級(2的4次方種)中的任意一種。
1組對應(yīng)是1位搶占優(yōu)先級,3位響應(yīng)優(yōu)先級,那么搶占優(yōu)先級只可設(shè)置為0級或者1級中的任意一種(2的1次方種),響應(yīng)優(yōu)先級可設(shè)置為0到7級(2的3次方種)中的任意一種。
上電復(fù)位時(shí),中斷配置為4組,并且60個(gè)外部中斷都是搶占優(yōu)先級為0級,無響應(yīng)優(yōu)先級。
總結(jié)一下:
高優(yōu)先級的搶占優(yōu)先級是可以打斷正在進(jìn)行的低搶占優(yōu)先級中斷的。
搶占優(yōu)先級相同的中斷,高響應(yīng)優(yōu)先級不可以打斷低響應(yīng)優(yōu)先級的中斷。
搶占優(yōu)先級相同的中斷,當(dāng)兩個(gè)中斷同時(shí)發(fā)生的情況下,哪個(gè)響應(yīng)優(yōu)先級高,哪個(gè)先執(zhí)行。
如果兩個(gè)中斷的搶占優(yōu)先級和響應(yīng)優(yōu)先級都是一樣的話,則看哪個(gè)中斷先發(fā)生就先執(zhí)行。
所以可以看出判斷兩個(gè)中斷的優(yōu)先級時(shí)先看搶占優(yōu)先級的高低,如果相同再看響應(yīng)優(yōu)先級的高低。如果全都相同最后看中斷通道向量地址。
一般來說在使用過程中,一個(gè)系統(tǒng)使用一個(gè)組別就完全可以滿足需要。所以在使用一個(gè)組別后一般不要在系統(tǒng)中再改動(dòng)組別,骨灰級玩家可以去試試(小心芯片燒了)。
外部中斷:
STM32F103的外部中斷EXTI支持19個(gè)外部中斷/事件請求。每個(gè)中斷/事件都有獨(dú)立的觸發(fā)和屏蔽設(shè)置。
0到15線:對應(yīng)外部I/O口輸入中斷
線16:接到PVD輸出
線17:接到RCT鬧鐘事件
線18:接到USB喚醒事件
線16到線18我自己都沒用過,主要對線0到15的I/O輸入中斷做一個(gè)總結(jié),有個(gè)注意的地方是這0到15線的外部中斷,其中0到4線,這5個(gè)外部中斷都有自己單獨(dú)的中斷響應(yīng)函數(shù)。5到9線公用一個(gè)中斷服務(wù)函數(shù),10到15線公用一個(gè)中斷服務(wù)函數(shù)。
外部中斷配置寄存器組EXTICR包含4個(gè)32位的寄存器,分別是EXTICR0、EXTICR1、EXTICR2、EXTICR3、但每一個(gè)寄存器只用了低16位,每4位控制一個(gè)I/O口,一個(gè)寄存器控制4個(gè)I/O口,EXTICR寄存器組控制16個(gè)I/O口,剛好一個(gè)GPIO的I/O口數(shù)。下面以 EXTICR0為例,用一個(gè)表格表示:
I/O口3 | I/O口2 | I/O口1 | I/O口0 |
0000 GPIOA | 0000 GPIOA | 0000 GPIOA | 0000 GPIOA |
0001 GPIOB | 0001 GPIOB | 0001 GPIOB | 0001 GPIOB |
0010 GPIOC | 0010 GPIOC | 0010 GPIOC | 0010 GPIOC |
0011 GPIOD | 0011 GPIOD | 0011 GPIOD | 0011 GPIOD |
0100 GPIOE | 0100 GPIOE | 0100 GPIOE | 0100 GPIOE |
0101 GPIOF | 0101 GPIOF | 0101 GPIOF | 0101 GPIOF |
0110 GPIOG | 0110 GPIOG | 0110 GPIOG | 0110 GPIOG
|
比如配置GPIOA.0就是將EXTICR0的低4位配置成0000,若配置GPIOB.1就是配置EXTICR0的4到7位,為0001。
這里有一個(gè)問題,如果要配置GPIOA.0和GPIOB.0,會(huì)引起沖突,不知道是不是分時(shí)配置解決的。我用的固體庫的方式,不需要考慮這些,呵呵。注意使用固件庫時(shí)中斷復(fù)位函數(shù)是寫在stm32f10x_it.c這個(gè)文件里的。
下面結(jié)合外部中斷附上固件庫版本的程序:
主函數(shù)里:
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitSructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置為優(yōu)先級組2
NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn; //定義外部中斷線13中斷通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優(yōu)先級0
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 0; //響應(yīng)優(yōu)先級0
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE; //使能指定通道
NVIC_Init(&NVIC_InitSructure);
NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn; //定義外部中斷線15中斷通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE; //使能指定通道
NVIC_Init(&NVIC_InitSructure);
NVIC_InitSructure.NVIC_IRQChannel = EXTI0_IRQn; //定義外部中斷線0中斷通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE; //使能指定通道
NVIC_Init(&NVIC_InitSructure);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure; //初始化結(jié)構(gòu)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13); //指明當(dāng)前哪個(gè)引腳為外部中斷觸發(fā)引腳
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);
EXTI_ClearITPendingBit(EXTI_Line13); //清除中斷標(biāo)志位 EXTI_Line13對應(yīng)相應(yīng)的中斷線13
EXTI_ClearITPendingBit(EXTI_Line15);
EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt; //選擇中斷模式請求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
EXTI_InitStructure.EXTI_Line = EXTI_Line13|EXTI_Line15; // 選擇待使能的外部中斷線
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 定義選中線的新狀態(tài) 使能
EXTI_Init(&EXTI_InitStructure); //把EXIT_InitStructure中的每一個(gè)參數(shù)按缺省值填入
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //指明當(dāng)前哪個(gè)引腳為外部中斷觸發(fā)引腳
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt; //選擇中斷模式請求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿觸發(fā)
EXTI_InitStructure.EXTI_Line = EXTI_Line0; // 選擇待使能的外部中斷線
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 定義選中線的新狀態(tài) 使能
EXTI_Init(&EXTI_InitStructure); //把EXIT_InitStructure中的每一個(gè)參數(shù)按缺省值填入
}
stm32f10x_it.c這個(gè)文件里
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13)!=RESET)
{ GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻轉(zhuǎn)
EXTI_ClearITPendingBit(EXTI_Line13);
}
if(EXTI_GetITStatus(EXTI_Line15)!=RESET)
{ GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻轉(zhuǎn)
EXTI_ClearITPendingBit(EXTI_Line15);
}
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{ GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻轉(zhuǎn)
GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻轉(zhuǎn)
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
上一篇:stm32與HC-SR04超聲波傳感器測距
下一篇:keil(MDK-ARM)的調(diào)試使用
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 嵌入式Rust修煉營:動(dòng)手寫串口燒錄工具和MCU例程,Rust達(dá)人Hunter直播帶你入門Rust
- 【泰有聊】第二期:泰克CEO為你解讀低噪聲背后的科學(xué)
- TI工業(yè)月參考設(shè)計(jì)亮點(diǎn)搶先看
- 是德科技有獎(jiǎng)直播:灣區(qū)圓桌派-穿越頻譜壁壘:毫米波技術(shù)的創(chuàng)新之路
- 下載泰克高速接口標(biāo)準(zhǔn)電子書,參與翻蓋有禮,驚喜多多!
- 有獎(jiǎng)直播預(yù)報(bào)名|與英飛凌一同探尋網(wǎng)絡(luò)攝像機(jī)的黑科技
- 不可錯(cuò)過的一次邂逅,TTI攜TE傳感器樣片與你相見!免費(fèi)樣片申請活動(dòng)開始啦~
- 物聯(lián)網(wǎng)之衛(wèi)星導(dǎo)航系統(tǒng)
- Molex莫仕發(fā)布"工業(yè)4.0狀況"全球調(diào)查結(jié)果
- 格靈深瞳科創(chuàng)板IPO,專注計(jì)算機(jī)視覺技術(shù)
- 汽車零部件發(fā)動(dòng)機(jī)外殼柔性浮動(dòng)去毛刺主軸加工應(yīng)用
- AI技術(shù)十年進(jìn)階:一段算法能力演進(jìn)的歷史
- 51單片機(jī) (4)中斷系統(tǒng)
- 51單片機(jī) (5) C51實(shí)現(xiàn)單片機(jī)串口通信仿真
- 51單片機(jī) (6)串口中斷通信+定時(shí)器2串口中斷
- STM32單片機(jī)(1) 總記 學(xué)習(xí)資料+參考手冊+LED燈
- STM32單片機(jī)(2) 外部中斷