3.1 STM32F103中斷概述
Cortex-M3內(nèi)核支持256個(gè)中斷,其中包含了16個(gè)內(nèi)核中斷和240個(gè)外部中斷,并且具有256級(jí)的可編程中斷設(shè)置。但STM32并沒(méi)有使用Cortex-M3內(nèi)核的全部東西,而是只用了它的一部分。STM32有84個(gè)中斷,包括16個(gè)內(nèi)核中斷和68個(gè)可屏蔽中斷,具有16級(jí)可編程的中斷優(yōu)先級(jí)。而我們常用的就是這68個(gè)可屏蔽中斷,但是STM32的68個(gè)可屏蔽中斷,在STM32F103ZET6中只有60個(gè)。
3.2 STM32F103中斷優(yōu)先級(jí)
3.2.1 優(yōu)先級(jí)結(jié)構(gòu)
STM32F103的中斷分為搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)兩種,這兩種優(yōu)先級(jí)的順序是搶占優(yōu)先級(jí)高于響應(yīng)優(yōu)先級(jí),假設(shè)存在兩個(gè)事件,那就會(huì)存在以下幾種可能:
(1)情況1:事件1和事件2的搶占優(yōu)先級(jí)都是1,事件1的響應(yīng)優(yōu)先級(jí)為1,事件2的響應(yīng)優(yōu)先級(jí)為2,那么事件1和事件2同時(shí)發(fā)生的時(shí)候,CPU優(yōu)先處理事件1,然后處理事件2;
(2)情況2:事件1和事件2的響應(yīng)優(yōu)先級(jí)都是1,事件1的搶占優(yōu)先級(jí)為2,事件2的搶占優(yōu)先級(jí)為1,那么,事件1和事件2同時(shí)發(fā)生的時(shí)候,CPU優(yōu)先處理事件2,然后處理事件1;
(3)情況3:事件1的響應(yīng)優(yōu)先級(jí)為1,事件2的響應(yīng)優(yōu)先級(jí)為2,事件1的搶占優(yōu)先級(jí)為2,事件2的搶占優(yōu)先級(jí)為1,當(dāng)事件1和事件2同時(shí)發(fā)生的時(shí)候,CPU優(yōu)先處理事件2,然后處理事件1;
通過(guò)上面兩種情況,我們可以發(fā)現(xiàn),當(dāng)搶占優(yōu)先級(jí)一致,誰(shuí)的響應(yīng)優(yōu)先級(jí)的數(shù)小,誰(shuí)的優(yōu)先級(jí)就高,中斷同時(shí)發(fā)生的時(shí)候CPU就先處理誰(shuí);如果搶占優(yōu)先級(jí)不一樣,那么無(wú)所謂響應(yīng)優(yōu)先級(jí),誰(shuí)的搶占優(yōu)先級(jí)數(shù)小,優(yōu)先級(jí)就高,中斷同時(shí)發(fā)生的時(shí)候CPU就先處理誰(shuí)。
STM32F103的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)各有4級(jí),即0~3,根據(jù)乘法原理,也從側(cè)面反映了16級(jí)可編程的中斷優(yōu)先級(jí),并且搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)的數(shù)量是可以設(shè)置的,通過(guò)中斷分組來(lái)配置,中斷分組和優(yōu)先級(jí)數(shù)量的對(duì)應(yīng)如下表所示。
組 | 搶占優(yōu)先級(jí)數(shù)量 | 響應(yīng)優(yōu)先級(jí)處理 |
---|---|---|
0 | 0 | 4 |
1 | 1 | 3 |
2 | 2 | 2 |
3 | 3 | 1 |
4 | 4 | 0 |
3.2.2 相關(guān)寄存器
(1) 中斷應(yīng)用和復(fù)位控制寄存器 :AIRCR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
KEY[15:0] | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
END | - | GROUP[2:0] | - | REQ | ACT | RST |
Bit 31~Bit 16:激活代碼,寫(xiě)入0x05FA激活寄存器
Bit 15:指示數(shù)據(jù)的字節(jié)序(這只能在重置后更改)
0:表示小尾數(shù) 1:表示大字節(jié)序
Bit 10~Bit 8:中斷優(yōu)先級(jí)分組
Bit 2:請(qǐng)求芯片控制邏輯產(chǎn)生復(fù)位
Bit 1:清除所有活動(dòng)狀態(tài)信息中的異常
Bit 0:重置Cortex-M3處理器(調(diào)試邏輯除外)
(2) 中斷使能寄存器組 :ISER
在STM32中,ISER寄存器一共有3個(gè),ISER[0]的0到31位對(duì)應(yīng)中斷031,ISER[1]的0到31位對(duì)應(yīng)中斷3263,ISER[2]的0到3對(duì)應(yīng)中斷64~67,如果需要使能某個(gè)中斷,必須設(shè)置對(duì)應(yīng)的ISER位為1,要清除的話(huà)可以設(shè)置ICER寄存器組對(duì)應(yīng)位為1,或者對(duì)ISER寫(xiě)0,但是對(duì)于ICER寄存器組寫(xiě)0是不起作用的。
(3) 中斷優(yōu)先級(jí)控制寄存器組 :IP
對(duì)于STM32,優(yōu)先級(jí)控制寄存器IP一共有68個(gè),對(duì)應(yīng)著68個(gè)中斷,每個(gè)寄存器的結(jié)構(gòu)都是相同的,如下圖所示。
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|---|---|
PrePriority[1:0] | SubPriority[1:0] | - |
Bit 7~Bit 6:搶占優(yōu)先級(jí)
Bit 5~Bit 4:響應(yīng)優(yōu)先級(jí)
3.2.3 中斷優(yōu)先級(jí)配置函數(shù)
/***************************************************
Name :NVIC_Init
Function :設(shè)置NVIC
Parameter :
PrePriority :搶占優(yōu)先級(jí)
SubPriority :響應(yīng)優(yōu)先級(jí)
Channel :中斷編號(hào)
Group :中斷分組 0~4
Return :None
***************************************************/
void NVIC_Init( u8 PrePriority, u8 SubPriority, u8 Channel, u8 Group )
{
u32 temp, temp1 ;
//設(shè)置分組
temp1 = ( ~Group )&0x07 ; //取后三位
temp1 <<= 8 ;
temp = SCB->AIRCR ; //讀取先前的設(shè)置
temp &= 0x0000F8FF ; //清空先前分組
temp |= 0x05FA0000 ; //寫(xiě)入鑰匙
temp |= temp1 ;
SCB->AIRCR = temp ; //設(shè)置分組
//設(shè)置優(yōu)先級(jí)
temp = ( u32 )PrePriority<<( 4-Group ) ;
temp |= SubPriority&( 0x0f>>Group ) ;
temp &= 0x0F ; //取低四位
NVIC->ISER[ Channel/32 ] |= ( 1< IP[ Channel ] |= temp<<4 ; //設(shè)置響應(yīng)優(yōu)先級(jí)和搶斷優(yōu)先級(jí)
}
3.3 外部中斷EXIT結(jié)構(gòu)
3.3.1 EXIT概述
外部中斷/事件控制器由連接線(xiàn)設(shè)備中的多達(dá)20個(gè)邊緣檢測(cè)器或其他設(shè)備中的19個(gè)邊緣檢測(cè)器組成,用于生成事件/中斷請(qǐng)求。每條輸入線(xiàn)可以獨(dú)立配置以選擇類(lèi)型(事件或中斷)和相應(yīng)的觸發(fā)事件(上升或下降或兩者)。每條線(xiàn)也可以獨(dú)立屏蔽。
對(duì)于STM32來(lái)說(shuō),每一個(gè)端口都可以配置為外部中斷,根據(jù)中斷信號(hào)的類(lèi)型都可以單獨(dú)配置上升沿觸發(fā)或者下降沿觸發(fā),中斷服務(wù)函數(shù)相互獨(dú)立。
3.3.2 EXIT相關(guān)寄存器
(1) 中斷屏蔽寄存器 :IMR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | M19 | M18 | M17 | M16 | |||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
M15 | M14 | M13 | M12 | M11 | M10 | M9 | M8 | M7 | M6 | M5 | M4 | M3 | M2 | M1 | M0 |
Bit 19~Bit 0:線(xiàn)x上的中斷請(qǐng)求配置位
0:禁止輸入線(xiàn)x上的中斷請(qǐng)求
1:允許輸入線(xiàn)x上的中斷請(qǐng)求
(2) 上升沿觸發(fā)選擇寄存器 :RTSR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | R19 | R18 | R17 | R16 | |||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
R15 | R14 | R13 | R12 | R11 | R10 | R9 | R8 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 |
Bit 19~Bit 0:線(xiàn)x上的上升沿觸發(fā)事件配置位
0:禁止輸入線(xiàn)x上的上升沿觸發(fā)
1:允許輸入線(xiàn)x上的上升沿觸發(fā)
(3) 下降沿觸發(fā)選擇寄存器 :FTSR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | F19 | F18 | F17 | F16 | |||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
F15 | F14 | F13 | F12 | F11 | F10 | F9 | F8 | F7 | F6 | F5 | F4 | F3 | F2 | F1 | F0 |
Bit 19~Bit 0:線(xiàn)x上的下降沿觸發(fā)事件配置位
0:禁止輸入線(xiàn)x上的下降沿觸發(fā)
1:允許輸入線(xiàn)x上的下降沿觸發(fā)
(4) 外部中斷配置寄存器1 :EXTIXR1
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EXTI3[3:0] | EXTI2[3:0] | EXTI1[3:0] | EXTI0[3:0] |
EXTIx[3:0]:EXTIx配置(x = 0~3)
0000:PA[x]引腳 0100:PE[x]引腳 0001:PB[x]引腳 0101:PF[x]引腳
0010:PC[x]引腳 0110:PG[x]引腳 0011:PD[x]引腳
(5) 外部中斷配置寄存器2 :EXTIXR2
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EXTI7[3:0] | EXTI6[3:0] | EXTI5[3:0] | EXTI4[3:0] |
EXTIx[3:0]:EXTIx配置(x = 4~7)
0000:PA[x]引腳
0100:PE[x]引腳
0001:PB[x]引腳
0101:PF[x]引腳
0010:PC[x]引腳
0110:PG[x]引腳
0011:PD[x]引腳
(6) 外部中斷配置寄存器3 :EXTIXR3
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EXTI11[3:0] | EXTI10[3:0] | EXTI9[3:0] | EXTI8[3:0] |
EXTIx[3:0]:EXTIx配置(x = 8~11)
0000:PA[x]引腳
0100:PE[x]引腳
0001:PB[x]引腳
0101:PF[x]引腳
0010:PC[x]引腳
0110:PG[x]引腳
0011:PD[x]引腳
(7) 外部中斷配置寄存器4 :EXTIXR4
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EXTI15[3:0] | EXTI14[3:0] | EXTI13[3:0] | EXTI12[3:0] |
EXTIx[3:0]:EXTIx配置(x = 12~15)
0000:PA[x]引腳
0100:PE[x]引腳
0001:PB[x]引腳
0101:PF[x]引腳
0010:PC[x]引腳
0110:PG[x]引腳
0011:PD[x]引腳
(8) APB2外設(shè)時(shí)鐘使能寄存器 :APB2ENR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | USART1EN | - | SPI1EN | TIM1EN | ADC2EN | ADC1EN | - | IOPEEN | IOPDEN | IOPCEN | IOPBEN | IOPAEN | - | AFIOEN |
Bit 14:USART1時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 12:SPI1時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 11:TIM1時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 10:ADC2時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 9:ADC1時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 6:GPIOE時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 5:GPIOD時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 4:GPIOC時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 3:GPIOB時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 2:GPIOA時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
Bit 0:輔助功能IO時(shí)鐘使能(寫(xiě)1開(kāi)啟,寫(xiě)0關(guān)閉)
3.3.3 外部中斷配置函數(shù)
/***************************************************
Name :EXIT_Config
Function :外部中斷配置
Parameter :
GPIOx:0~6,代表GPIOA~G
BITx:需要使能的位
TRIM:觸發(fā)模式
1:下升沿
2:上降沿
3:任意電平觸發(fā)
Return :None
***************************************************/
void EXIT_Config( u8 GPIOx, u8 BITx, u8 TRIM )
{
u8 EXTADDR ;
u8 EXTOFFSET ;
EXTADDR = BITx/4 ; //得到中斷寄存器組的編號(hào)
EXTOFFSET = ( BITx%4 )*4 ;
RCC->APB2ENR |= 0x01 ; //使能io復(fù)用時(shí)鐘
AFIO->EXTICR[ EXTADDR ] &= ~( 0x000F<<EXTOFFSET ); //清除原來(lái)設(shè)置
AFIO->EXTICR[ EXTADDR ] |= GPIOx<<EXTOFFSET ; //EXTI.BITx映射到GPIOx.BITx
EXTI->IMR |= 1<<BITx ; //開(kāi)啟line BITx上的中斷
if( TRIM&0x01 ) EXTI->FTSR |= 1<<BITx ; //下降沿觸發(fā)
if( TRIM&0x02 ) EXTI->RTSR |= 1<<BITx ; //上升降沿觸發(fā)
}
3.4 其他文件的添加
3.4.1 寄存器定義文件
(1)添加用到的NVIC寄存器組和EXTI寄存器組的定義。
(2)定義寄存器組地址
3.4.2 sys.h文件
上圖就是添加子函數(shù)聲明,為了用于其他文件調(diào)用。
3.4.3 sys.c文件
(1)在STM32時(shí)鐘配置函數(shù)之前增加復(fù)位時(shí)鐘和中斷的功能,最終函數(shù)如下圖所示。
(2)添加剛才的兩個(gè)子函數(shù)
至此,sys文件里面最基礎(chǔ)的函數(shù)就全部添加完畢了。
評(píng)論