|
STM32学习笔记03—中断架构 ( N$ V) x0 \" c' U8 f( p+ ~* w6 w* Y1 K Y: V9 U& \ 3.1 STM32F103中断概述 Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用Cortex-M3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。而我们常用的就是这68个可屏蔽中断,但是STM32的68个可屏蔽中断,在STM32F103ZET6中只有60个。 G+ n3 y5 g% c1 K. D5 c % n0 b! @. I* [" r2 h' Z1 x 3.2 STM32F103中断优先级 3.2.1 优先级结构 STM32F103的中断分为抢占优先级和响应优先级两种,这两种优先级的顺序是抢占优先级高于响应优先级,假设存在两个事件,那就会存在以下几种可能:5 f- f" r B$ V6 I% _0 E$ x , P5 G. e5 m* }. a# _! Q, i& t (1)情况1:事件1和事件2的抢占优先级都是1,事件1的响应优先级为1,事件2的响应优先级为2,那么事件1和事件2同时发生的时候,CPU优先处理事件1,然后处理事件2;2 G# x$ v ?; U; q3 S 6 m6 g5 |9 {, _- G- p# U (2)情况2:事件1和事件2的响应优先级都是1,事件1的抢占优先级为2,事件2的抢占优先级为1,那么,事件1和事件2同时发生的时候,CPU优先处理事件2,然后处理事件1; (3)情况3:事件1的响应优先级为1,事件2的响应优先级为2,事件1的抢占优先级为2,事件2的抢占优先级为1,当事件1和事件2同时发生的时候,CPU优先处理事件2,然后处理事件1; 通过上面两种情况,我们可以发现,当抢占优先级一致,谁的响应优先级的数小,谁的优先级就高,中断同时发生的时候CPU就先处理谁;如果抢占优先级不一样,那么无所谓响应优先级,谁的抢占优先级数小,优先级就高,中断同时发生的时候CPU就先处理谁。8 s i6 W- z! y3 T9 E1 N5 G $ Q9 I. U& I3 w/ ]& R% B STM32F103的抢占优先级和响应优先级各有4级,即0~3,根据乘法原理,也从侧面反映了16级可编程的中断优先级,并且抢占优先级和响应优先级的数量是可以设置的,通过中断分组来配置,中断分组和优先级数量的对应如下表所示。 J E+ W A' x: A( a
3.2.2 相关寄存器 (1)中断应用和复位控制寄存器:AIRCR
Bit 31~Bit 16:激活代码,写入0x05FA激活寄存器 v2 O) I5 e0 J Bit 15:指示数据的字节序(这只能在重置后更改)" _" M% J5 \& [. C4 C5 V * b. m8 O; Q8 O2 f- `, k9 s2 a 0:表示小尾数 5 |1 G' P0 B! V9 a 1:表示大字节序" i5 P4 Z$ R4 W6 ]6 \# e, h/ X/ P V( n: Y/ a7 f, p: m Bit 10~Bit 8:中断优先级分组5 J$ x# _7 w6 _& K ) f3 ~. k' ~% R3 y- F Bit 2:请求芯片控制逻辑产生复位 Bit 1:清除所有活动状态信息中的异常 ) [$ a! t, x0 d! G& a Bit 0:重置Cortex-M3处理器(调试逻辑除外): U: w: }7 c# P( I8 w5 ~& T3 X% D9 g : a; K4 p) _9 _$ ]8 f) [ (2)中断使能寄存器组:ISER 在STM32中,ISER寄存器一共有3个,ISER[0]的0到31位对应中断0~31,ISER[1]的0到31位对应中断32~63,ISER[2]的0到3对应中断64~67,如果需要使能某个中断,必须设置对应的ISER位为1,要清除的话可以设置ICER寄存器组对应位为1,或者对ISER写0,但是对于ICER寄存器组写0是不起作用的。' t- r3 q! F- _7 r' P' t, L (3)中断优先级控制寄存器组:IP0 F6 ?5 T Z) y. _/ K5 X
对于STM32,优先级控制寄存器IP一共有68个,对应着68个中断,每个寄存器的结构都是相同的,如下图所示。 ' \3 j m6 ]5 _" o! y' T Bit 7~Bit 6:抢占优先级: i9 h$ Z% C8 ~3 p. y Bit 5~Bit 4:响应优先级; Z" M& n% ?2 d1 |* p) e 0 M9 K8 f0 x9 N. B, y N! j0 c6 p+ g 3.2.3 中断优先级配置函数
3.3 外部中断EXIT结构 3.3.1 EXIT概述& m" a w& E; }$ }$ |- [ 外部中断/事件控制器由连接线设备中的多达20个边缘检测器或其他设备中的19个边缘检测器组成,用于生成事件/中断请求。每条输入线可以独立配置以选择类型(事件或中断)和相应的触发事件(上升或下降或两者)。每条线也可以独立屏蔽。 对于STM32来说,每一个端口都可以配置为外部中断,根据中断信号的类型都可以单独配置上升沿触发或者下降沿触发,中断服务函数相互独立。 ) Z3 J9 _% u5 ?1 z 3.3.2 EXIT相关寄存器 (1)中断屏蔽寄存器:IMR - l" ~8 P8 C- p+ C. Q
it 19~Bit 0:线x上的中断请求配置位 k6 U8 u# o' ~( @ I: F/ h 4 _$ V+ ?: z. J8 e: r4 |+ D 0:禁止输入线x上的中断请求 1:允许输入线x上的中断请求 (2)上升沿触发选择寄存器:RTSR 9 O. l& l/ x$ @# \# }) P6 c
it 19~Bit 0:线x上的上升沿触发事件配置位 7 P2 q5 N8 A* o; o7 P3 x+ R 0:禁止输入线x上的上升沿触发 1:允许输入线x上的上升沿触发, M, s" J& l) q$ p1 {9 n (3)下降沿触发选择寄存器:FTSR! B8 f6 p7 h. J7 F: G& ]! @2 ]* b
Bit 19~Bit 0:线x上的下降沿触发事件配置位* W1 O3 ~$ d2 n7 j' i0 s) V ' s: Z& h* Z+ ~7 u 0:禁止输入线x上的下降沿触发 1:允许输入线x上的下降沿触发0 ]; L! L1 m5 i: I (4)外部中断配置寄存器1:EXTIXR14 Y; N8 |. ~( m7 x5 g. V5 d 1 D5 ^- Y* w+ M: u" _ }& h! K
EXTIx[3:0]:EXTIx配置(x = 0~3)3 q+ W. M! N( b3 n$ ^( D ( k/ ]2 ^' c- b, T3 z 0000:PA[x]引脚 0100:PE[x]引脚 0001:PB[x]引脚 0101:PF[x]引脚4 B R+ S6 p( l8 v+ X# h 0010:PC[x]引脚 0110:PG[x]引脚 0011:PD[x]引脚 & R) N9 G1 q4 M$ w% @! ]( D# ~# } (5)外部中断配置寄存器2:EXTIXR2$ b0 G" [4 K, Q) w" Y0 J 3 N+ ]. U4 c$ Q
EXTIx[3:0]:EXTIx配置(x = 4~7)( O' U6 J. l, ^# z6 R 0000:PA[x]引脚& P7 Q( X/ w, A+ o3 ^' [ 0100:PE[x]引脚4 Y7 z$ R: z9 v1 B( E1 k, y: W) o 0001:PB[x]引脚 0101:PF[x]引脚. S) A3 W* A4 L5 k 0010:PC[x]引脚 0110:PG[x]引脚0 Z8 O" h: G. c% u4 p0 [ Y 0011:PD[x]引脚 (6)外部中断配置寄存器3:EXTIXR3( D/ \4 }6 X8 n0 V# B* F
EXTIx[3:0]:EXTIx配置(x = 8~11); k+ j% u) ?; J, n, a% P 0000:PA[x]引脚7 w. Z' b' j) R 0100:PE[x]引脚 0001:PB[x]引脚 0101:PF[x]引脚& x) r* S0 [! u$ ^7 Q* x 0010:PC[x]引脚 0110:PG[x]引脚 0011:PD[x]引脚 (7)外部中断配置寄存器4:EXTIXR4 ) f9 M0 s/ ~9 n1 {' s) x EXTIx[3:0]:EXTIx配置(x = 12~15)0 o/ F* {: [0 H, g8 M6 b) Z* [6 u( ]: Z
0000:PA[x]引脚7 S ^) r8 z& ?" j( H/ | 0100:PE[x]引脚: n2 l! X' W6 Q 0001:PB[x]引脚 0101:PF[x]引脚/ V/ {; ^1 H$ _ 0010:PC[x]引脚2 }' M9 K$ a9 o0 R! _6 V 0110:PG[x]引脚( v, E8 C- ]7 H) s 0011:PD[x]引脚) A4 [- q4 z. I2 {. Z (8)APB2外设时钟使能寄存器:APB2ENR
Bit 14:USART1时钟使能(写1开启,写0关闭) Bit 12:SPI1时钟使能(写1开启,写0关闭). P- Y5 ^# a7 n! D# x+ a" ~. B Bit 11:TIM1时钟使能(写1开启,写0关闭)8 U) \1 C$ b- V& N8 y \/ Q6 o Bit 10:ADC2时钟使能(写1开启,写0关闭) Bit 9:ADC1时钟使能(写1开启,写0关闭)1 N0 u4 Z0 ]9 y. J, u4 ^5 P% u Bit 6:GPIOE时钟使能(写1开启,写0关闭)/ N$ J" |7 z$ A2 {" q% h* y: o Bit 5:GPIOD时钟使能(写1开启,写0关闭) Bit 4:GPIOC时钟使能(写1开启,写0关闭)- ~5 S' ]* Q" V1 E! D$ g! p Bit 3:GPIOB时钟使能(写1开启,写0关闭) Bit 2:GPIOA时钟使能(写1开启,写0关闭) Bit 0:辅助功能IO时钟使能(写1开启,写0关闭)/ U5 W6 i. U3 [: I7 ] 3.3.3 外部中断配置函数 3 f* g" G6 d( E/ g4 f* C/ e 3 A& p6 y# K' \. b# t& o& z8 U
3.4 其他文件的添加/ P8 M+ B2 O8 |) W' c3 h' C 3.4.1 寄存器定义文件 (1)添加用到的NVIC寄存器组和EXTI寄存器组的定义。) o: V* B5 r( k0 y. L( [: C1 O& X [/ ? W7 y$ k ]4 h7 ?2 ], }( c" z
(2)定义寄存器组地址5 Y$ _1 B! _/ u8 P
3.4.2 sys.h文件% B* H8 A# E8 ^8 }
上图就是添加子函数声明,为了用于其他文件调用。. c$ J& B9 W6 x6 a 3.4.3 sys.c文件 (1)在STM32时钟配置函数之前增加复位时钟和中断的功能,最终函数如下图所示。
(2)添加刚才的两个子函数
至此,sys文件里面最基础的函数就全部添加完毕了。 上一篇: STM32学习笔记02—时钟树架构) s3 b1 L* P% ~ 6 F! u ]2 {8 J |
![]() ![]() ![]() ![]() |
微信公众号
手机版