你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的中断优先级管理NVIC

[复制链接]
STMCU小助手 发布时间:2022-12-26 15:00
Cortex M3内核支持256个中断,其中包含:$ ]/ T. e! F6 Y  x* w& [
16个内核中断( _1 `+ }6 D1 S8 D4 }
240个外部中断
' R+ D" O1 ^8 y  z: _( }5 r; i
并且具有256级可编程中断设置
* D+ s% n3 l3 p0 Y

. _5 }  }& N8 `  zSTM32F1并没有使用Cortex M3的全部6 x/ p4 X7 G! ~5 Q7 T% A; S
8 F" Q# Q$ b1 \+ W4 F
STM32有84个中断,其中包括:
0 b7 W2 t9 ^6 n! C/ o; k4 F16个内核中断
# i3 b8 h- l' O$ l/ g/ W) H8 O; j1 Z68个外部中断(可屏蔽中断). N' h: V' N  K. ~

# p! d2 G1 Z! m2 Q0 Y! y4 i1 d$ A- l
STM32F103系列只有60个可屏蔽中断
- {, J" f# G8 F2 W0 Y# ?( q0 `5 W: N' {8 J8 C5 E1 Z2 ?
2 K7 {8 K0 d8 A6 \$ ^
中断优先级分组
6 A/ s8 Y( }( R- A6 E0 m" d- h1 c首先,对STM32中断进行分组(在系统初始化时就分好组),组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级值
9 w+ V9 ^6 b1 L/ R- e# E5 @
$ A$ K4 J" E. ~7 v) b4 G, p7 T分组配置是在寄存器SCB->AIRCR中进行配置8 G' C# e0 a7 C. ]( _4 R1 U

) T& b; \, x. G+ p/ E
UW`(R56FAUNXCXBQ)H0]6OO.png
" t+ J9 V* k1 v  t8 g" x, S: e& i

0 M; b( _: p: D2 Z/ g* C在SCB的AIRCR寄存器的8到10位可以对中断进行分组
: }/ j1 Z9 X2 ~# J2 _: R  Y7 v8 j$ s+ f! T  k5 D3 w
假设被分到组2,意味着每个中断可以设置2位抢占优先级,2位响应优先级: t1 t" U7 z$ s# c

& W% L, E0 q2 F7 t% c对于每个中断,他有一个IP寄存器,4到7位,相当于一共4个位可以用来设置抢占和响应
. _+ {# {  J) z1 S- D: E7 I# M
% c( ]) V) I( `4 q- U9 u+ h
STM32F103具有16级可编程的中断优先级,为什么是16级呢?! v$ P9 |' M5 {; T* Z7 }( V' A
  W' _  l! H& I. ~* A
因为4个位可以用来设置抢占和响应7 T7 z* b  L# R. \

" W$ R$ B+ z+ S  J& W# T% L2的4次方就是16! y& q2 B6 _0 ]1 U3 m

  q) @8 O) z( J9 f3 L$ M7 F& m9 M抢占优先级与响应优先级的区别: K( _3 l1 s* g7 c
抢占优先级是指,两个中断,抢占优先级谁高,谁就可以抢占另外一个正在执行的中断,可以打断# w: L, N. ^$ i9 w/ ?
1 j( B: X5 `- I( ~  N6 w; S
例如A中断的抢占优先级为0(优先级高),B中断的抢占优先级为3(低优先级),B正在发生,正在执行B中断的中断服务函数,如果A发生了,那么A是可以打断B的,执行完了再回去B* R0 f8 _7 a, d. T$ K: q4 L6 G
! ^+ Q7 A8 H% V" \2 h, Q
抢占优先级相同的中断,高响应优先级的中断不可以打断低响应优先级的中断& T( S' p7 J" v# |4 n3 V
7 j) S5 e' W3 F, x% {$ T
抢占优先级相同的中断,当两个中断同时发生时,哪个的优先级高,哪个就先执行
0 d; C* e4 I9 ^' s- o, f0 C2 K1 t
' J2 s, u- @8 G
中断优先级分组函数
/ c$ E' Y6 ~( ~1 zmisc.c
, m: Q/ l) I$ }* T" |
1 P9 S4 L: N+ F0 H* a
9ba8095436964941816e62c87a43765b.png
& s7 q+ K+ {: ^) |$ \' [# _
1 v: r! A* ?, F
da91642b4d584c8fb2bed4f5fa266d45.png
. e' @; R& Y! m) c; m" O- B9 H7 r6 J; A
中断优先级设置寄存器( d8 U$ Q% W7 v' H! v
core_cm3.h3 v; f" s# i. j. j+ |% b

  u$ z; ^( o! W. K
266b22980d5f43bb839b3ef959e2081c.png
' w/ V7 H4 o( _
8 K. ^6 Z+ A* H7 t4 r可以看到,有240个IP寄存器,即Interrupt Priority Register% v. K/ ]. V+ i! k- p  j
/ q& a) u3 v/ Q- p8 V7 y) _) G. N
240个8位寄存器,每个中断使用一个寄存器来确定优先级
% [/ P3 u1 `+ y" r  B( p
5 L. T' w: A; U- L4 }1 x+ rSTM32F10x系列一共60个可屏蔽中断,使用IP[59]~IP[0]
+ c9 t7 Q( ?$ a, s9 G# f
' [3 H) T$ t! \/ ~& h: ^  x
a69e03f21bd943f9ab5adc7648a1b6e6.png
* e3 O5 O/ U9 t% h
2 Y' C5 r. O( y( c+ P* t# i
" H; }2 j: X3 y8 l$ [. @0 j
NVIC初始化
( a2 _. ]7 S- umisc.c 3 l. [) d( }4 S1 ^# }: K! k' s0 A
0 @4 O& O( q# B4 k6 ^- u* z4 P
d306e56e5beb4c57a37f49c75dee49b4.png : T& j  Y' r) {. A  I  Y, J, r- x& `

9 o, u" r) K7 c8 _: xmisc.h4 i! l6 q0 g" o. L$ x

7 q- v$ E! R( T2 n8 v
ff9d311967ed4052adf7bb38e9630085.png
. `$ |6 |6 K& h # o0 e( G3 C- h1 C7 n( z' y
cc466f25906e4b5ab9f2d53727a3c6d3.png # B- R5 s; `/ `! i/ I) r( p
/ I( d5 N+ o. m: [! i, ]; k
f1f40d3f1cd649a2b7942cb2cdaf48eb.png
  |* b4 m0 @" a' e+ |/ D
) K$ z! R- u' X. E2 V
中断使能寄存器ISER寄存器
& O3 D, l0 T# I: D0 a5 O2 h. cISER[8]用于使能中断,共有8个32位寄存器2 ]  F6 n, |( ~" Q" L8 J

- ], Z: g) F0 l# C" e4 E32位的寄存器,每个位控制一个中断的使能
( `# G2 g8 b  `7 |$ P3 G: t2 J% ?+ r  L7 }
STM32F10x只有60个可屏蔽中断,因此只能收了第1个和第2个寄存器,即ISER[0]和ISER[1]. r' w, k$ a8 H$ {/ ?& w# I
) Q  t8 X' @$ }. F$ a/ @5 a
ISER[0]的bit 0~31分别对应中断0~31/ _' b7 Q# m# U6 D# A3 r' a

8 A) F2 V, ^" _1 s7 S/ d. w( lISER[1]的bit 0~27分别对应中断32~59% ~0 V" w0 e3 ]2 f
0 q, i6 C4 w0 Z$ [: K
中断失能寄存器ICER寄存器
2 q/ M' x9 W; V% mICER[8]
- {9 _1 B) [. r
3 H  O* V; g' W5 h2 X0 k! r( m
其余上同
, g3 C% t- P, E' s; u& N- d1 J
* {) F: m  S! e" D. T/ r& Y( \" \) i, t中断挂起控制寄存器ISPR
8 h5 q& Q, F, X  W) hISPR[8]
9 p' T0 b4 O# I8 w  i& w
- T. P; w5 Y, j3 I1 G! Y( I
ce5b4974799649798af5ffb1819a06bb.png
, X, Z5 E( S& M$ J- y. O' X# X3 j4 Z/ ]* s$ ^
4 Z2 U  L8 N  m0 }0 E% E
中断解挂控制寄存器ICPR6 t! x' |& L7 Y* J: |
ICPR[8]
/ E: Z+ z- E0 ]5 Z8 f/ J( D$ B9 h2 y% m
$ p# c/ ?( R, n- n1 \+ j. J0 v
dc7fe4b361b54cdda582348b576fb031.png 5 C6 G: j0 F% F% v" `

: O9 k9 U* j1 Q1 G5 }! P中断激活标志位寄存器组IABR- W: d8 b! z6 d( K7 B9 p
IABR[8]  c$ |0 A) v4 g# w

( m) ^5 A1 L/ V2 G* Z只读,通过读取该寄存器可以知道当前执行的中断是哪一个,如果对应的位为1,则说明该中断正在执行' L! \) u* ~) V- A! G0 v& Y

. E; F& Z( E: D; c* l
cd8f3bc7d74c4020971f04f3d057608d.png
7 W2 J8 h2 z( c
0 d" y  U) m4 W
中断配置步骤总结, X+ f6 D' m+ o; _* i* b
1. 首先设置中断优先级分组,确定系统的分组级别,知道有几位抢占优先级和几位响应优先级可以设置(这里只需要设置一次); \4 X; [& `, N$ l4 |" q

- t( j; C9 y8 @. \! J( _; D7 j2. 针对每个中断,调NVIC_init函数,给定想要的抢占优先级和响应优先级,对中断进行设置- U# t# _" p- Z/ y! a, _8 q( g; j2 ^
& ~4 }: w  x  e+ g
3. 如果需要挂起或解挂,查看中断当前的激活状态,调用相关函数即可# }* l3 a0 B- e0 O0 T, |8 b+ I

+ m9 p5 t" L( d! U5 h! I
4 f: d) [9 _7 s0 C, Y# r" a4 R0 ?
举例:
7 W3 x6 m% V( \6 wmain.c
9 k( N, m1 g+ P0 F* B; u
2 M& X( b& u  o/ L( S  U7 g5 L1 P/ {3 Y
27944740aaea41d88c7d56421b73e0c5.png
" N3 j2 b. C( J% D$ a1 a

: ^, W, u5 }, k. A$ ] exit.c
" c4 P9 }0 G+ F, [; o0 `# [
, M- ~0 i$ u* U$ G2 S2 Z( v5 U' h, N 4c8c7ddd7235494a86f9ccb5f9da5fe4.png
" J3 r3 a) A7 ?2 B: T) D/ i* O. H: ]9 v& P3 u; t
————————————————
) ]! ~8 `: H% N! Z7 ~, g版权声明:CodeForCoffee
6 s9 W- y, Z2 u
" G0 \/ H1 b2 U* f2 |! \# e3 f" W0 }4 T
赞 收藏 评论0 发布时间:2022-12-26 15:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版