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

STM32中断相关概念阐述

[复制链接]
STMCU小助手 发布时间:2022-9-3 22:00
1、STM32 CM3 中断阐述6 E! E/ l* r3 O" b% p6 D
ARM Cortex M3内核支持256个中断(16个内核中断+240个外部中断),与其相关的中断控制寄存器和中断优先级控制寄存器(NVIC、SYSTICK)也都属于Cortex M3内核的一部分。
! V, @( _. t% J* ?: h% a% W7 B/ D& Q* V
16分内部中断如下图:( K5 G' N. U/ ?- U! n6 X. ]  m2 D
( ?' j% C* I; m- I
acd5e6037e3b4263a327e67ece7b3c45.png 3 n% X# i. @. n- k8 \$ ?9 }( l; F* x5 _
4 G' b/ \4 C$ S0 h
STM32使用了ARM Cortex M3内核并对其进行了裁减,使之在原本支持240个外部中断裁减变成了68个外部中断,外加内部的16个中断,一共16+68=84个中断。
! k# ?" C7 |# I' ?. ?% A% a1 |8 |* J+ I7 G) W
现在知道了STM32一共84个中断,那么在实际使用的时候怎么对它进行管理的呢?& g- s. h* v0 A0 U

# N# D2 g! D7 m! P4 ?这就引入了中断优先级的概念。' N1 I+ H9 n! S" ?
1 O6 x2 ~0 x) y
2、优先级的定义( C$ i6 }* a; Q3 P* h. D2 e4 H
名词:NVIC(Nested vectored interrupt controller),嵌套向量中断控制器。7 b6 r, ]2 \( u, D9 b/ y; Q4 w
CM3内核使用NVIC来管理中断;- j8 g* M! l( K# t$ |8 v- w
CM3中优先级的数值越小,优先级越高,支持256级中断(所以CM3配置中断优先级的寄存器是8bit的);
' y2 E! P2 X/ ECM3 支持中断嵌套,使得高优先级异常会抢(preempt)低优先级异常。5 {+ N8 X) \# k3 E( }
CM3有3个系统异常:复位,NMI 以及硬 fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。除了这三个,其它异常的优先级则都是可编程的(但不能编程为负数)。
1 q: X7 I5 E: i6 t( D4 TCM3最大支持到了256个等级的中断优先级但是实际上用不到这么多,所以大多数采用了M3内核的芯片会对其进行精简设计,ST就是裁掉了这个寄存器的低4bit,只用高4bit来表示优先级,以达到减少优先级数的目的,而4bit所能代表的最大数就是16,所以说STM32支持16级的可编程中断。
5 y% Q( b- |( H7 j  D" |1 \0 u* R  y! c2 ^/ X* A6 T- C0 e3 {( g; Q
CM3的240个外部中断都有自己的中断优先级配置寄存器PRI_n,这个寄存器是8位的,每4个相邻的中断优先级寄存器拼成一个32位的寄存器。这是NVIC的重要组成部分。
2 G+ j2 _. B2 p2 w( b0 c  a' K7 ]. ]4 ?% ^! o# T- i1 z  b# e0 m
0b9c05233d7a484696b1515a4949f325.png * w& J" a$ R8 ^" b

5 u6 {: j  T' Z2 w而STM32只支持68个外部中断,在NVIC控制结构中虽然体现了240个,但是实际用不到这么多,如下图是STM32的NVIC控制结构(STM32裁掉了这个寄存器的低4bit,只用高4bit来表示优先级等级)。
; i3 M# t# V2 X5 ~6 \. A+ x
3 a; {9 Y4 V; c 06ecc0de50e04c728ae212db964bdf66.png   i; J( A& J6 z" x, g# \
. b; I" U& R/ d3 K5 ~/ M& C9 M" k
所以你可以看到在STM32标准库函数NVIC_Init函数内配置外设的优先级的时候,这里对优先级进行了左移4位的操作:5 Z  x- d# b, @0 _! r

3 s' V" Q; l. u! {( Y! A5 l  A% l 44a1b6d2b18a43ff90b0beb6662edd1a.png
0 }5 O+ b& k& ?; f/ b5 w( W' L
6 c9 d% r$ a8 F  F! E/ a3、中断优先级分组

! l6 G6 A# T/ Z( m1 o6 \  INVIC中有一个寄存器是“应用程序中断及复位控制寄存器“(AIRCR),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段: MSB 所在的位段(左边的)对应抢占优先级,而 LSB 所在的位段(右边的)
% c- h. C- c# o$ r+ h5 z' x对应亚优先级,如下图:3 Z" o5 O1 p2 y/ s% u# w+ \
) F( `: O. W- N6 v! N2 g7 H& K& }
d118ffc9285441959075ec6df6452a2a.png
$ L* Q1 x0 Z! p5 C5 w e0739da5865946588a20c88443efc5ec.png ) F# U3 k& C1 t2 y1 r0 N

7 ?' ^$ F% X+ z* Q: {! p; OSCB->AIRCR寄存器的[10:8]位是用来设置中断优先级分组的,通过这3位的配置,可以对IP(中断优先级)寄存器的[7:4]进行优先级的管理,例如:
9 u* }- S! m/ o/ [, g, R& _# e7 F将AIRCR的10:8位写成101,那么IP寄存器的[7:4]这四个bit,[7:6]用来表示抢占优先级,[5:4]用来表示响应优先级。
4 l* M+ t( I/ p8 R. M7 f" ?将AIRCR的10:8位写成011,那么IP寄存器的[7:4]这四个bit都用来表示抢占优先级,无响应优先级,4bit做能代表的范围是0~15,所以优先级的设置就是0-15级,这个分组模式通常用于RTOS,例如FreeRTOS。. \; v3 @  d! d; j% D" V8 D

5 V4 ?$ E5 E& ~. K 9bf01b6eab8345f690c22cd6f7c0f028.png
& J" }  s2 @( o; t/ u: F2 k  F: V, f) e( [9 p( C  x
4、特殊寄存器(PRIMASK、FAULTMASK、BASEPRI)开关中断设置/ A. Y' F- c) W0 P0 |# \
这三个寄存器用来开关中断用,只能在特权模式下进行访问,不过CMSIS提供了函数能够在C环境中进行调用。这三个寄存器描述如表(摘自CM3权威指南):+ [0 \% Q7 t+ R8 s  i& W
- E' O  v1 i1 f- `" y
ebab4fef992a4e7fa23ce5481286575d.png
  X. S( `2 ]: O" V- H8 h  X+ k3 B8 o& q* q9 L; D+ q
PRIMASK(优先级屏蔽寄存器)
% a) j6 G# `; _- f" u" I' |这个寄存器只有1bit,如果设置为1,除了NMI和Hard Fault中断被允许外,其他中断全部被屏蔽,默认为0;
- h4 R& D) S+ C' p) I, pCMSIS提供的C环境中操作该寄存器:
  1. __set_PRIMASK(1);  /* 屏蔽中断 */( D1 M$ l" c. Y0 l. P
  2. __set_PRIMASK(0);  /* 取消屏蔽 */`
复制代码
# j1 P+ K* b' n1 ~5 h/ H1 ]
FAULTMASK(断层屏蔽寄存器)
/ y* ~9 Z3 c( r- ^( n" Y, a这个寄存器也是只有1bit,如果设置为1,除了NMI中断被允许,其他全部中断包括Hard Fault中断也被屏蔽,默认为0;4 o6 a& Z, h, U3 r# G2 w: N& [4 g4 p
CMSIS提供的C环境中操作该寄存器:0 p( r7 ~9 F+ P, H1 Z# Q( Z! h3 g+ n2 B
6 d2 W$ W; r+ r8 u% v
  1. __set_FAULTMASK(1);  /* 屏蔽中断 */`# ^" i5 y2 D' |2 |- I6 K' V" i
  2. __set_FAULTMASK(0);  /* 取消屏蔽 */
复制代码
0 _7 p- e! ?6 _) \6 A: l2 o
BASEPRI(基本优先级屏蔽寄存器):这个寄存器能够提供更精细化的中断屏蔽,往这个寄存器里写一个值,可以屏蔽比该优先级值低的中断,在CM3中,这个寄存器只用到了[7:4]这四个位,这与IP寄存器是一致的;(下图摘自PM0056-STM32编程手册)
8 w$ y/ z: p! X9 W
1 f" m% I* C5 A 566988590422438aa09f13f8a90bd20e.png # }6 O/ Q- Y$ `1 u  d1 \

3 ]% y; E) B$ C3 [: u9 @1 cCMSIS提供的C环境接口如下:! b3 S) ^( \3 h5 c) ]2 |/ ^$ K
/ c# V  Q) n9 z4 Z& D
  1.         __set_BASEPRI(0x50);   /* 屏蔽优先级小于5的中断 */3 g1 r" `' Y7 k
  2.         __get_BASEPRI();       /* 获取当前屏蔽的优先级等级 */
复制代码
& Z% @3 ~# o$ |+ [+ G4 W2 d( |# q) i
FreeRTOS就是使用了该寄存器来管理中断,屏蔽相应的中断进行临界区资源保护,而不是关全部中断。
# k1 K% \9 I- e* r$ d/ Z, j
! d% N& p* l. |+ J; I# x) b补充①:除了使用以上寄存器开关中断,CMSIS还提供了另外的开关中断的接口:9 d5 c  @& z' A4 |4 z

- T  C, b- X3 u9 f$ I; W
  1. __enable_irq();    /* 关全部中断,操作的是PRIMASK */; U; ^& g0 A; m8 P3 b
  2. __disable_irq();   /* 开全部中断,操作的是PRIMASK*/' b; V8 _# k* A0 U8 L: J) f( \
  3. __enable_frq();    /* 关全部中断,操作的是FAULTMASK */
    ) [  d3 X/ Q( {4 k* p
  4. __disable_frq();   /* 开全部中断,操作的是FAULTMASK*/
复制代码
' ~* B7 }; e% p% T" {4 T7 p! C$ {" I
补充②:ARM的汇编指令CPS,全称Change Processor State,改变处理器状态。
! D6 D2 W6 R) }# @, F/ U! b! ^9 }  [
IE:Interrupt or abort enable. 中断使能
5 G5 Z# B: V! ~
1 i3 I8 T4 v+ o4 q1 P1 Z# s0 {ID: Interrupt or abort disable. 关闭中断" w3 w) G; i. S5 r
- `! v6 S6 k$ T0 W% r7 k( _5 z
利用该指令来快速开关中断:  b& Z! Q- L& J2 w
3 F7 f. b4 Y5 }- n
cpsid i,关闭中断,实际操作的是PRIMASK
2 o* G% G4 T1 Q" r1 k% p
, T* o1 v$ f4 y' }! Mcpsie i,开启中断,实际操作的是PRIMASK
0 j4 v9 \5 Z- |& P4 g
9 W4 t7 X- _; B* Tcpsid f,关闭中断,实际操作的是FAULTMASK; |  _# W8 L* U3 t+ W5 Z

7 y. K- _5 F( b, Z4 \cpsie f,开启中断,实际操作的是FAULTMASK
; a' _9 _( P; l' t8 q9 _: _# Q8 V' s, o————————————————
& |, w# y9 @0 @5 R; a4 O版权转载自:雍正不秃头
7 U$ F. e& }  {# j+ I/ F! P/ _# {9 g; k+ U( k
' [  H. w& U( X. w

/ m8 P, y" {" u$ z3 M: `2 m" C0 {
赞 收藏 评论0 发布时间:2022-9-3 22:00

举报

0个回答

所属标签

相似技术帖

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