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

STM32的中断优先级管理NVIC

[复制链接]
STMCU小助手 发布时间:2022-12-26 15:00
Cortex M3内核支持256个中断,其中包含:
* c% n& s( g7 t16个内核中断
2 O" z% _- R5 d7 o240个外部中断- x. S2 D5 F- u: H3 h
并且具有256级可编程中断设置
0 D, Z: e7 x' C/ E+ C: N5 n, U  |5 X1 }
4 Z7 m) c5 H2 c% ^& J* @
STM32F1并没有使用Cortex M3的全部0 K$ F/ [$ C3 O: F8 T- W

! t: q( {7 n/ y5 s+ l  I# ]STM32有84个中断,其中包括:
5 n, {" l4 c$ F# E. S2 X16个内核中断
, b" S& M% J! {: m1 T+ w) a9 c- l68个外部中断(可屏蔽中断)
3 I$ ^4 h) T( ]: F* }# g
7 S& J! u! {  {
STM32F103系列只有60个可屏蔽中断
1 G% ]) r" k4 b5 I- P% W' A- t* l) P3 M! L" d1 I
$ b1 T* |) d8 }  V* D
中断优先级分组% @. X% y" P7 d' r: y
首先,对STM32中断进行分组(在系统初始化时就分好组),组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级值
7 H' K$ _4 N& U6 V+ s* q, d8 P: o+ P8 Z& y, w
分组配置是在寄存器SCB->AIRCR中进行配置+ D& t  r( N, a! ?, g  G7 J) j

; M: C9 X0 p8 X0 ]7 _
UW`(R56FAUNXCXBQ)H0]6OO.png : H5 T$ b( ?# U" A
* M$ \" |( ]+ [# h
在SCB的AIRCR寄存器的8到10位可以对中断进行分组4 [8 u1 D0 j: Z0 X

2 ]# g; Y2 }& ]) _/ R. p假设被分到组2,意味着每个中断可以设置2位抢占优先级,2位响应优先级! T2 D# B# i2 ]" Q

' P+ u1 z3 `/ S* ?- N对于每个中断,他有一个IP寄存器,4到7位,相当于一共4个位可以用来设置抢占和响应
" A8 |; m  f/ w5 k+ F

: h: _* x! v8 I9 l3 }' ~STM32F103具有16级可编程的中断优先级,为什么是16级呢?# K: F& F( s0 e' z( J
( f+ L# s- g% D0 U% G* a
因为4个位可以用来设置抢占和响应2 V! n7 _, |# I0 g

) G8 g! K9 s3 U2的4次方就是16
6 {" N% Q" i8 z- i% L& k

% `2 Z% m. K- i; r3 E抢占优先级与响应优先级的区别3 E5 a2 x# b3 N. A
抢占优先级是指,两个中断,抢占优先级谁高,谁就可以抢占另外一个正在执行的中断,可以打断9 @( @: @/ h* u5 y. A( ~: t+ J
5 A) ^+ t6 S' A9 l' T) y5 ]8 t: `
例如A中断的抢占优先级为0(优先级高),B中断的抢占优先级为3(低优先级),B正在发生,正在执行B中断的中断服务函数,如果A发生了,那么A是可以打断B的,执行完了再回去B2 ]' d( i* T% ^! R5 A
$ y$ a2 R" i6 ]; \& s/ `
抢占优先级相同的中断,高响应优先级的中断不可以打断低响应优先级的中断
$ L! d* c9 I! O
4 `* C9 j" i7 H, q1 Z抢占优先级相同的中断,当两个中断同时发生时,哪个的优先级高,哪个就先执行
  q: o( n) e2 y! C/ H6 i
2 a. M7 o  b* M' D  G8 i
中断优先级分组函数0 t) t! w- W6 X/ a; n5 w" e
misc.c" H0 v& m  O1 X8 T. ~( L$ x

* Z9 {7 l& f- `; b  v
9ba8095436964941816e62c87a43765b.png
6 X$ b8 c2 B, N! J( L- W5 a8 o$ c. D' I9 Z. y7 x) j: u
da91642b4d584c8fb2bed4f5fa266d45.png
  v; v1 h4 G9 N: m) C8 c2 d  g2 v) _, v; o
中断优先级设置寄存器2 }# e) V. ~+ [/ g
core_cm3.h
0 c# I% P6 u; C
1 X" n! Q4 T: I, P; h
266b22980d5f43bb839b3ef959e2081c.png
- C4 J9 r0 p! o$ \9 w# P/ K+ V
0 ]! a- c6 q( @2 y$ r' D$ y可以看到,有240个IP寄存器,即Interrupt Priority Register! J& X* g; ~3 D8 f! {4 f' {
7 |3 u& M3 T7 P  H2 ]
240个8位寄存器,每个中断使用一个寄存器来确定优先级
7 m4 H/ a( g- M6 @5 s
0 R% @1 M8 q# M7 a, I5 B0 E. B5 ^# wSTM32F10x系列一共60个可屏蔽中断,使用IP[59]~IP[0]" g9 f$ ], L) {9 c) v3 W  \1 x; s; A
2 i& }3 j7 C* C8 o
a69e03f21bd943f9ab5adc7648a1b6e6.png / R" s1 e4 y$ f- Y  y" @( a) Z! j

) q( ?* b" [# ~2 x- W# e/ ^4 K
3 L9 ~! i, J5 Y
NVIC初始化  G5 p: j7 ]$ Y5 V
misc.c
: ~2 _/ u; k. Y5 m9 ~5 m3 H7 ~
6 W9 G$ K9 k8 g9 |% g, q9 N5 ^
d306e56e5beb4c57a37f49c75dee49b4.png
  H7 M4 c0 y" x2 z3 t! c! ?  S9 B& c& L$ K9 W; S
misc.h, S, B( h" Q( r0 M

7 v) }, n3 T3 Y7 U( y7 _
ff9d311967ed4052adf7bb38e9630085.png
1 [" v& r8 @; x, x* b' [ . W1 {7 ?/ S: m% H4 B- @, _& s6 }
cc466f25906e4b5ab9f2d53727a3c6d3.png 6 E) @: V% O4 f( ?6 Z
; u- A1 w- T+ y  G
f1f40d3f1cd649a2b7942cb2cdaf48eb.png ! X7 y7 G7 x( q. _/ X

* A' V7 e( U5 \  a中断使能寄存器ISER寄存器+ ~' {, ?. A$ w1 V/ ?; \: `; X3 ?
ISER[8]用于使能中断,共有8个32位寄存器
7 v) b% C7 e4 z1 l/ }
) f7 J. N! ^; k! R$ F32位的寄存器,每个位控制一个中断的使能" s8 y5 F( p; b! e4 V

+ R3 R0 L7 ]% e: p4 ?7 jSTM32F10x只有60个可屏蔽中断,因此只能收了第1个和第2个寄存器,即ISER[0]和ISER[1]. m# ?# O8 _4 ?0 O6 o# J

+ W4 T3 q  I" a4 o1 jISER[0]的bit 0~31分别对应中断0~315 y9 x) j* u: v9 p& z9 j+ C
5 ]) G! p5 ^, w: {
ISER[1]的bit 0~27分别对应中断32~590 v. K6 d% h9 H' p7 ~* [1 H6 N

: d1 p8 @4 c+ A4 ~中断失能寄存器ICER寄存器
. O( y0 V& X0 WICER[8]" T9 @. X! l3 f5 x$ q; }

# q" m& a. C# s! J. A3 B其余上同7 n1 W! l# @  K. _4 m% c% u

* P2 X: {3 G( X( B/ ^- m3 [中断挂起控制寄存器ISPR
. h2 c; V7 Z5 H- o2 Q: T# d2 H' m; U8 RISPR[8]4 g. H7 j" F4 u1 Y8 ]2 H
2 D) B7 m# u0 N! N  C
ce5b4974799649798af5ffb1819a06bb.png
8 h6 ?( o0 v8 ]) v, ~  Q: z  V9 e- x$ u7 a! v, J+ s4 X$ c

1 t0 U8 w! W. e8 X, r中断解挂控制寄存器ICPR- A3 E6 V& `5 x! o. Z8 ~
ICPR[8]: c. @( I; ~  P# h( H: N) [% M: R  @

# K% i- E( j7 B  f0 s" d
dc7fe4b361b54cdda582348b576fb031.png
. K5 s% t% o' s: n0 a2 v% @* _
) u- Q; j+ \8 Q5 l4 p' c中断激活标志位寄存器组IABR5 K2 v1 G& z6 I1 i+ e
IABR[8]4 @# i9 C1 M' q2 D0 l! {9 O  C

( S4 [' u- r8 q. z$ y7 r只读,通过读取该寄存器可以知道当前执行的中断是哪一个,如果对应的位为1,则说明该中断正在执行
# @6 W; Q. p  M6 J6 e5 j9 F0 e/ a& Q0 Z- L; \
cd8f3bc7d74c4020971f04f3d057608d.png ; H( d, A, W& I) G+ B8 l4 {

9 R0 I: o8 k% u- I2 L 中断配置步骤总结
: @" U1 J; N1 ]: b" Q% s1. 首先设置中断优先级分组,确定系统的分组级别,知道有几位抢占优先级和几位响应优先级可以设置(这里只需要设置一次)3 W" L" ^$ j% G  G/ h
8 W: S3 {8 v& f  T$ a0 @  }" v
2. 针对每个中断,调NVIC_init函数,给定想要的抢占优先级和响应优先级,对中断进行设置6 U, ^7 \/ ?. r8 U3 L$ z, u4 S
* Z# J( _( o1 `9 P7 w3 b7 d
3. 如果需要挂起或解挂,查看中断当前的激活状态,调用相关函数即可
% ?7 _+ T& x0 {0 _4 X$ _1 O1 H0 @1 o

- z5 p# v5 D& B$ G3 T+ n; L举例:) z* A3 ?' Y( O* Z! u
main.c
3 z6 X, D' C" y2 f
/ {! h3 O* D1 D. ]' w
27944740aaea41d88c7d56421b73e0c5.png
/ f2 F8 [, J  I' H5 C4 G; V

9 P5 u8 B* ?& Y8 d exit.c
2 {6 d6 w9 k( l+ D" T
0 _6 B+ S8 B& W: U 4c8c7ddd7235494a86f9ccb5f9da5fe4.png 9 W4 c% k% f- Z

' g$ j: x4 p0 a4 [6 A5 S- T————————————————
* i) z0 m) }7 c9 C版权声明:CodeForCoffee3 b+ h6 [6 |1 C8 u0 U

8 Q; U; I( P$ i6 @9 R
4 R# y$ K0 Y/ A8 p$ W9 X4 I+ [
收藏 评论0 发布时间:2022-12-26 15:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版