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

【经验分享】STM32的中断优先级设置

[复制链接]
STMCU小助手 发布时间:2022-2-5 00:00
CM3内核有16个中断, 优先级通过 SCB->SHP[0] to SCB->SHP[11] 设置
  1. /******  Cortex-M3 Processor Exceptions Numbers ***************************************************/
    0 m$ z7 s( q6 @$ W6 l% n6 D' x1 I
  2.   NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
    7 d+ q: }1 c" K3 _
  3.   MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt  SCB->SHP[0] */6 }( U8 F7 f( T) |6 t, K
  4.   BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
    . U/ W# ]. x5 n+ ^( `% J
  5.   UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
    - v- [" b: G( a( m2 r
  6.   SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */4 Z3 S& K" I! i; [5 _" F
  7.   DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
    + Q& S6 A4 w3 d! C+ ~* j$ `# R* R
  8.   PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */& h4 p7 V; Q' [# e( [
  9.   SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt   SCB->SHP[11]    */
复制代码
4 ^$ g; c+ A' z0 E& k9 o! X2 D
STM32最多有240个中断(通常外部中断写作IRQs): 优先级通过 NVIC->IP[0] to NVIC->IP[239] 设置
  1. void NVIC_SetPriority( IRQn_Type IRQn, uint32_t priority )
    ) ], q3 O# w4 r5 S
  2. {- ?% n0 x$ @( N' Q4 S; Y
  3.   /* set Priority for Cortex-M  System Interrupts */) X9 I! Q+ [$ O/ n: h9 {
  4.   if ( IRQn < 0 )
    , W/ r4 I! ], X5 b6 V% P
  5.   {
    , D8 B  Z7 m. B' j
  6.     SCB->SHP[ ( (uint32_t) ( IRQn ) & 0xF ) - 4 ] =
    2 W8 X" x+ a/ \1 ^$ m& q& ~
  7.         ( ( priority << ( 8 - __NVIC_PRIO_BITS ) ) & 0xff );3 s5 S4 V' E3 G: y& P1 n9 a4 L
  8.   }
    4 d! B, `! D7 b9 \$ e3 ?( R9 |* V
  9.   
    8 D9 g0 u+ }% l7 U, z
  10.   /* set Priority for device specific Interrupts  */
    * P7 k. R, f2 ^( K: P, Y7 d
  11.   else
    : H3 z( ~2 S% m+ E+ \  V7 `
  12.   {: B6 V" W9 z$ C* X* J# S# F+ J
  13.     NVIC->IP[ (uint32_t) ( IRQn ) ] = 0 T! R  ~7 v* K
  14.         ( ( priority << ( 8 - __NVIC_PRIO_BITS ) )  & 0xff );' W" Q  L) P: c- l  @- Q' p
  15.   } % B/ l( g+ E9 h+ o( U, t
  16. }
复制代码

- z( ^& Q* l( X% q- Y. X1 _
STM32用户能分配的优先级有16级, 也就是用优先级寄存器NVIC->IP[x]的高四位来表示
  1. /*!< STM32 uses 4 Bits for the Priority Levels    */
    / O% H8 f$ D: \5 q; g5 T. S; z
  2. #define __NVIC_PRIO_BITS          4      
复制代码

' I, P& }1 B+ b. {  s# E
在STM32中将一个中断的优先级分为 : 抢占优先级和响应优先级。上述的4个bit可以灵活分配给抢先优先级和响应优先级
抢占优先级(pre-emption priority)
高抢占优先级的中断会打断当前的主程序/中断程序运行, 俗称中断嵌套# p- ]; E0 _7 Y: ^) p
响应优先级(subpriority)
在抢占优先级相同的情况下, 高响应优先级的中断优先被响应 ( 但是不能嵌套 )
如果有低响应优先级中断正在执行, 高响应优先级的中断要等待已被响应的低响应优先级中断执行结束后才能得到响应
优先级处理
优先级数值较小的优先级较高, 优先级0x00 有最高的优先级, 优先级0xF0 有最低的优先级
在进行优先级判断的时候先是比较抢占优先级, 然后比较响应优先级。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,2 N' Y6 C( H5 k7 g2 a8 ^
当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。" n! v' L( F1 _
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;% q* x2 Q& I& Q. ]
如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
  1. /*!< 0 bits for pre-emption priority 4 bits for subpriority */
    + s  S1 z7 Q; i9 D% C) Z
  2. #define NVIC_PriorityGroup_0         ((uint32_t)0x700) . G2 w( [" C) ]6 \3 r

  3. ) p' a: E. G) y/ A, T! N% p
  4. /*!< 1 bits for pre-emption priority 3 bits for subpriority */
    % `. t, G' A  p; M3 [$ \' W& t2 H& C
  5. #define NVIC_PriorityGroup_1         ((uint32_t)0x600) : N: i( l: `0 K* D5 Q# M

  6. ( g3 f$ M. |, V5 v( n" u4 M: }
  7. /*!< 2 bits for pre-emption priority 2 bits for subpriority */
    1 K' K/ w0 T" f+ r! h
  8. #define NVIC_PriorityGroup_2         ((uint32_t)0x500)
    . Q( g  B0 J% }6 r5 d  C- u& y

  9. 5 j; W5 l! K+ z, F* Y+ |
  10. /*!< 3 bits for pre-emption priority 1 bits for subpriority */6 n3 e. @1 {% q$ i. X* a
  11. #define NVIC_PriorityGroup_3         ((uint32_t)0x400)
    ( v$ q( R4 L! t$ X7 z' A# U

  12. " Y% d* J3 y, P3 b, y# u
  13. /*!< 4 bits for pre-emption priority 0 bits for subpriority */
    * z. p# p7 J0 a# V* F
  14. #define NVIC_PriorityGroup_4         ((uint32_t)0x300)
复制代码
03221611-aa46ec169b344389be8fdb1ac2212c4c.jpg
! a: W0 O3 w  i: X. W 03221717-416287b18bba4ec081fe317f4140be04.jpg
* W% t% M! N& ]& T" w
/ H$ {2 L9 _5 K1 z
# z" N; x, |6 K+ G
- x* u) o5 d& c4 C
* ^- p( d" L: N% f4 R( h( ~5 a
8 l) s* H4 O- x( T
收藏 评论0 发布时间:2022-2-5 00:00

举报

0个回答

所属标签

相似分享

官网相关资源

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