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

STM32中断相关概念阐述

[复制链接]
STMCU小助手 发布时间:2022-9-3 22:00
1、STM32 CM3 中断阐述, Z! v6 i! X5 t  x- T" F  h
ARM Cortex M3内核支持256个中断(16个内核中断+240个外部中断),与其相关的中断控制寄存器和中断优先级控制寄存器(NVIC、SYSTICK)也都属于Cortex M3内核的一部分。1 V- A5 n7 v1 ?2 U

  }4 M4 o3 ]3 w8 t/ t16分内部中断如下图:% ?5 @+ f$ @8 M2 c, v
3 h. i* W* W4 a; y6 R7 c( m9 J/ ^
acd5e6037e3b4263a327e67ece7b3c45.png
3 q4 G& @& W  e' m  y
/ M" ?+ m0 a( d7 ]. i3 h" o* @STM32使用了ARM Cortex M3内核并对其进行了裁减,使之在原本支持240个外部中断裁减变成了68个外部中断,外加内部的16个中断,一共16+68=84个中断。# i1 v0 w- N  w7 g; @) O: Z: H

' X& s1 Z3 U7 N( p现在知道了STM32一共84个中断,那么在实际使用的时候怎么对它进行管理的呢?. J3 ~% t8 Z  C' r( P
( t" y" W! C% D' I
这就引入了中断优先级的概念。
& d) c; h  l$ b
8 S4 s8 }$ ?  u4 v* U( N: n2、优先级的定义
/ k' y+ I  F6 L7 x+ T6 J名词:NVIC(Nested vectored interrupt controller),嵌套向量中断控制器。. W/ S& o( ?8 d8 G  w
CM3内核使用NVIC来管理中断;
& B3 V+ h! X( q2 `CM3中优先级的数值越小,优先级越高,支持256级中断(所以CM3配置中断优先级的寄存器是8bit的);# U1 `, |6 N9 i2 g& N, r1 Z
CM3 支持中断嵌套,使得高优先级异常会抢(preempt)低优先级异常。5 l. [" `" c7 n+ p1 e: Z/ _
CM3有3个系统异常:复位,NMI 以及硬 fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。除了这三个,其它异常的优先级则都是可编程的(但不能编程为负数)。
. k4 [. K! p) }( ?9 i/ }( CCM3最大支持到了256个等级的中断优先级但是实际上用不到这么多,所以大多数采用了M3内核的芯片会对其进行精简设计,ST就是裁掉了这个寄存器的低4bit,只用高4bit来表示优先级,以达到减少优先级数的目的,而4bit所能代表的最大数就是16,所以说STM32支持16级的可编程中断。
6 _: L, Z' {; u" g# u+ `# O( i, A: G$ n& V
CM3的240个外部中断都有自己的中断优先级配置寄存器PRI_n,这个寄存器是8位的,每4个相邻的中断优先级寄存器拼成一个32位的寄存器。这是NVIC的重要组成部分。& }* F- R7 H7 _
$ x- ]6 v/ n4 Y; F
0b9c05233d7a484696b1515a4949f325.png 6 t, U5 l! b( _6 g9 S: i$ @
' ^" B" `9 m! {6 Q
而STM32只支持68个外部中断,在NVIC控制结构中虽然体现了240个,但是实际用不到这么多,如下图是STM32的NVIC控制结构(STM32裁掉了这个寄存器的低4bit,只用高4bit来表示优先级等级)。
# o- |( W1 K2 G/ X: G# Q6 z3 W% g1 x+ o  @
06ecc0de50e04c728ae212db964bdf66.png 5 N% X3 _0 ~2 ~

6 z5 v  d% g# o0 G. M/ `; b8 M所以你可以看到在STM32标准库函数NVIC_Init函数内配置外设的优先级的时候,这里对优先级进行了左移4位的操作:  P2 P, a- t& x
$ ^1 d) C0 ?4 V1 o
44a1b6d2b18a43ff90b0beb6662edd1a.png
9 t( u$ ^  o% X6 s+ H, }4 H: u5 l+ \% X7 G
3、中断优先级分组

' r) ?! M6 B5 ?$ XNVIC中有一个寄存器是“应用程序中断及复位控制寄存器“(AIRCR),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段: MSB 所在的位段(左边的)对应抢占优先级,而 LSB 所在的位段(右边的)8 [0 E. L( R/ E8 o1 z( b
对应亚优先级,如下图:
! N9 O! O. O, ~1 I- O4 |
; J, j- b; n9 I, z* L/ \1 k d118ffc9285441959075ec6df6452a2a.png
/ h& d& s0 \1 L- z$ V e0739da5865946588a20c88443efc5ec.png 5 U1 q/ P. a: c0 E5 u! _2 l; ^' u/ t

) g2 F" d: X- ^4 KSCB->AIRCR寄存器的[10:8]位是用来设置中断优先级分组的,通过这3位的配置,可以对IP(中断优先级)寄存器的[7:4]进行优先级的管理,例如:. S4 M% }* n! ^/ |  c1 }$ a4 s
将AIRCR的10:8位写成101,那么IP寄存器的[7:4]这四个bit,[7:6]用来表示抢占优先级,[5:4]用来表示响应优先级。$ C3 |! P2 C7 E$ D
将AIRCR的10:8位写成011,那么IP寄存器的[7:4]这四个bit都用来表示抢占优先级,无响应优先级,4bit做能代表的范围是0~15,所以优先级的设置就是0-15级,这个分组模式通常用于RTOS,例如FreeRTOS。! F7 ~( o9 ?& X/ J

3 ]5 Y" X5 q5 I. K. V 9bf01b6eab8345f690c22cd6f7c0f028.png
# y# _# m# k* p: z6 V9 @8 U: f, ^
2 ~+ D: K  T' q5 h. e4、特殊寄存器(PRIMASK、FAULTMASK、BASEPRI)开关中断设置
6 O  }5 E, z0 G& D4 [6 {这三个寄存器用来开关中断用,只能在特权模式下进行访问,不过CMSIS提供了函数能够在C环境中进行调用。这三个寄存器描述如表(摘自CM3权威指南):
; Y  C, m2 [, t% \/ z
( O1 j. z; X5 d$ l ebab4fef992a4e7fa23ce5481286575d.png 4 D* P& r; P: n4 }0 ]# \
6 t4 a8 v/ N" P3 H# P
PRIMASK(优先级屏蔽寄存器)
; _( G" \$ I# T' a. @7 a% Y这个寄存器只有1bit,如果设置为1,除了NMI和Hard Fault中断被允许外,其他中断全部被屏蔽,默认为0;1 r& M7 r6 `; j6 E
CMSIS提供的C环境中操作该寄存器:
  1. __set_PRIMASK(1);  /* 屏蔽中断 */
    6 Q2 L6 r0 A. J2 k; J! n
  2. __set_PRIMASK(0);  /* 取消屏蔽 */`
复制代码

0 [6 Y: {. j" f/ K6 B1 pFAULTMASK(断层屏蔽寄存器)  }+ x; [. f/ N* h: C
这个寄存器也是只有1bit,如果设置为1,除了NMI中断被允许,其他全部中断包括Hard Fault中断也被屏蔽,默认为0;: x, v& e6 B8 q
CMSIS提供的C环境中操作该寄存器:
0 {# Z% S4 o* n" o, i! f
2 L% u4 c# W% l8 n" b
  1. __set_FAULTMASK(1);  /* 屏蔽中断 */`
    9 y0 w- ~& O3 i6 M  |
  2. __set_FAULTMASK(0);  /* 取消屏蔽 */
复制代码

- ~9 a3 {6 L2 C8 M. O9 RBASEPRI(基本优先级屏蔽寄存器):这个寄存器能够提供更精细化的中断屏蔽,往这个寄存器里写一个值,可以屏蔽比该优先级值低的中断,在CM3中,这个寄存器只用到了[7:4]这四个位,这与IP寄存器是一致的;(下图摘自PM0056-STM32编程手册)
# m+ G- a9 ]8 f4 ^7 C
* U* d6 {3 O. M3 v9 K" t 566988590422438aa09f13f8a90bd20e.png
/ Z# M& B( l, \# b" R9 {6 }3 E1 K- P# o( I
CMSIS提供的C环境接口如下:
1 p+ e" J0 Q7 G" j; u/ N
" e% E9 n/ @  ~$ {' U. T4 h
  1.         __set_BASEPRI(0x50);   /* 屏蔽优先级小于5的中断 */
      D% b0 ?" E* S, F- q) j
  2.         __get_BASEPRI();       /* 获取当前屏蔽的优先级等级 */
复制代码

% r8 Q! Z7 t& J7 RFreeRTOS就是使用了该寄存器来管理中断,屏蔽相应的中断进行临界区资源保护,而不是关全部中断。$ z7 b9 A1 t2 _( `! k, p8 s
2 y9 q& R" c* M: d5 O+ S2 P
补充①:除了使用以上寄存器开关中断,CMSIS还提供了另外的开关中断的接口:
8 [% ?1 w4 c2 v# W( V* o4 M. c" [0 k- p4 W/ }. V
  1. __enable_irq();    /* 关全部中断,操作的是PRIMASK */
    , ]3 s, A3 c* g
  2. __disable_irq();   /* 开全部中断,操作的是PRIMASK*/
    , o" U$ ?7 ?( c" S$ L4 D% o
  3. __enable_frq();    /* 关全部中断,操作的是FAULTMASK */
    # y" N; e) s, N
  4. __disable_frq();   /* 开全部中断,操作的是FAULTMASK*/
复制代码

9 N# {+ Z0 A6 `补充②:ARM的汇编指令CPS,全称Change Processor State,改变处理器状态。. X0 V, G) K' n8 z  C+ y  V

$ l" @. i4 m1 g, P. K9 }. E, s' I) dIE:Interrupt or abort enable. 中断使能
# q' o* C% R6 J8 G8 B$ ?; m0 g8 D# N) w; H* M7 R) f& L/ y6 h
ID: Interrupt or abort disable. 关闭中断
0 k9 e) ^- o& V
! e6 E' w" g" F: U利用该指令来快速开关中断:
/ `  j. O+ a2 y. s
& G3 p1 h9 K% r! i2 hcpsid i,关闭中断,实际操作的是PRIMASK5 ~  Q( x6 x% B. n

6 F' q) N+ O, l5 L4 z- D# H3 Mcpsie i,开启中断,实际操作的是PRIMASK, w8 P# k& _7 M

' u" b6 v7 |, F8 {cpsid f,关闭中断,实际操作的是FAULTMASK
: z* ^; @9 ~) Y: @5 ?# F, ~) o- R' _% B( D* g! [3 c8 @
cpsie f,开启中断,实际操作的是FAULTMASK- n) Q& e% J* L8 z' q3 r9 J% `
————————————————) e& _- h" X" H
版权转载自:雍正不秃头1 y2 F2 P6 c' ~* }0 d# @

7 C' @2 M7 _/ n3 Z
; t5 a  j' |- g4 Q& {$ j/ y! K1 V7 }/ A1 g" e$ Q/ p
收藏 评论0 发布时间:2022-9-3 22:00

举报

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