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

【经验分享】STM32文档中关于NVIC寄存器说明的位置

[复制链接]
STMCU小助手 发布时间:2022-1-17 22:09
下面,我们看看关于NVIC寄存器的描述,都在哪些手册里面有提到
在使用STM32F10x standard peripheral library写有关于stm32中断的程序的时候,需要开启某个特定中断的控制位,除了对应外设的寄存器之外,还需要设置NVIC的相关寄存器的对应位。例如:
  1. /******  STM32 specific Interrupt Numbers *********************************************************/5 T( p" ^* d- x6 X0 q
  2.   WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */7 O: Y! v0 p7 H+ Z
  3.   PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */7 E" U! L8 Y8 H$ {7 h
  4.   TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */' H9 o, R( o* f' I4 C7 \! i
  5.   RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */+ s$ {* D7 `* F2 M) p! B4 Y
  6.   FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
    0 T+ f: w1 [5 V9 o
  7.   RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
    6 |% H% \  {$ G3 S5 H) T
  8.   EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */" _0 I' e6 x. B" H" P( B
  9.   EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */1 |6 w8 }, _) t8 D2 B" w; ^
  10.   EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
    & y9 t  g* X& d
  11.   EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */6 z4 ?3 F( s: g: G
  12.   EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */' }3 C- l) l1 f& d7 w/ M
  13.   DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
    ) l# x8 ?" `6 y9 m& ?+ ~
  14.   DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */* n1 I& `: @) F5 @0 A& k
  15.   DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
    - D: `, G8 y1 }, F
  16.   DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
    - x, s9 @& ~+ Z1 x' Q
  17.   DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */; P# `( e, [3 L
  18.   DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
    2 n! W( S$ U% }# z& g, j8 S
  19.   DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */
    ! O2 ]% P1 `* i7 z: Q
  20. ! }  ^9 j' G: y7 S" C, a; I: a
  21.     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    + C7 W  [/ q# h9 Z( X$ [
  22.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    & I* V( L" F9 [( A9 n
  23.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;* C) w5 r' T) b- @* G9 x8 ^
  24.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      Q7 e$ |; _% }7 J3 q8 P0 T& F
  25.     NVIC_Init(&NVIC_InitStructure);
复制代码

9 H  c& c1 q8 _4 o7 v
而NVIC_Init()这个函数:
  1. /**
    + k. P/ v" p; f8 h5 k
  2.   * @brief  Initializes the NVIC peripheral according to the specified
    - I+ g" F5 H1 g& y1 U# b1 d
  3.   *         parameters in the NVIC_InitStruct.
    : A) `$ Z  m/ T( I
  4.   * @param  NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains
    8 N) a& p  y5 z
  5.   *         the configuration information for the specified NVIC peripheral.
    7 j$ q% ~" j# J' I
  6.   * @retval None8 }+ o1 Y$ D: n, D& S" L
  7.   */
    ! C7 c0 m; a! d6 ^# c
  8. void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)% c8 b0 |' N' P! {6 A. N( N1 K
  9. {
    : M3 m4 A" H- Q2 i2 F
  10.   uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
    1 I( |$ _+ a$ U! f) m9 }
  11.   
    ' N5 e# Q% H& u. X5 C: u' T5 I
  12.   /* Check the parameters */* h2 l3 {5 H% W" P! M
  13.   assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));! J- v& s6 _9 l$ Z" d
  14.   assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));  8 i% e, X( q* d3 \
  15.   assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
    9 K) \* J3 c! u5 G+ T6 S" m) E2 m& c- e
  16.     ' u7 q! \$ o* m- W  P* ~
  17.   if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)+ Y4 n- t) J$ `& b2 @
  18.   {/ K1 U2 d1 r- \1 r
  19.     /* Compute the Corresponding IRQ Priority --------------------------------*/      l8 }# g% C& T. Y* Q/ C
  20.     tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
    / [4 L( q! i- ]  j' m+ I; w+ t' h; k- x
  21.     tmppre = (0x4 - tmppriority);
    , ]" [& V, n0 u( Y0 |$ {
  22.     tmpsub = tmpsub >> tmppriority;
    1 ~- W. m- R# x& Q( i

  23. ) v" s% ^: T1 T( W; A1 h# U+ k
  24.     tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
    3 s* f+ e. }8 V
  25.     tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
    ) n7 C( t) M6 w1 a+ F) |4 o: E
  26.     tmppriority = tmppriority << 0x04;
    7 `0 f( B$ c% O
  27.         ' V7 x4 y7 l" N  x7 y4 G
  28.     NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;# j* a0 q6 ]- X7 G# a
  29.     7 \& c" ]& b2 a
  30.     /* Enable the Selected IRQ Channels --------------------------------------*/* z6 j. a- ^3 E; V
  31.     NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
    + M+ d$ E% y8 ?2 c" p+ r$ ]
  32.       (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);5 G' B( d) O1 s& @! ]
  33.   }
    : K  v- `: @. w. u* Z/ g, k! u
  34.   else" W  k8 [* t; @% b6 r
  35.   {
    " Z% _$ ~" p( t1 [* U  K- ?5 Q
  36.     /* Disable the Selected IRQ Channels -------------------------------------*/0 l; p; v) e% T' G0 i, j) K4 m- l! ~
  37.     NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =$ y( g5 y8 ?8 ]- _4 `! }- D
  38.       (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
    : l- ^4 s) ]+ u- t( X
  39.   }
    8 Y4 {7 A8 u% z7 c8 m* I& N
  40. }
复制代码
1 A9 t5 ?0 P6 K
可以看到,它会去设置几个寄存器:NVIC的IP,ISER,ICER等等,NVIC是基址,为:
  1. #define SCS_BASE            (0xE000E000)                              /*!< System Control Space Base Address */
    2 ]) c/ Y8 D$ N/ d
  2. #define NVIC_BASE           (SCS_BASE +  0x0100)                      /*!< NVIC Base Address                 */  r  t3 A5 _$ _6 K) T0 r
  3. #define SCB_BASE            (SCS_BASE +  0x0D00)                      /*!< System Control Block Base Address */
    2 O2 w5 I6 E& b6 u$ S& A
  4. : {; T  {2 _# H# w' Z0 E8 N2 R- _
  5. 9 r/ s" r0 i0 x, z2 ~& c; s
  6. #define NVIC                ((NVIC_Type *)          NVIC_BASE)        /*!< NVIC configuration struct         */
复制代码
  T' [- n4 g* l1 R
NVIC_Type为:
  1. /** @addtogroup CMSIS_CM3_NVIC CMSIS CM3 NVIC# \# C  {4 @, i  V  k
  2.   memory mapped structure for Nested Vectored Interrupt Controller (NVIC)6 D! j- V3 E! f( ^5 _  a, k
  3.   @{5 \2 w, x6 k" m3 ~/ y" E  {0 h
  4. */
    1 n9 T2 O' d# C6 `2 Z/ Y, x5 o
  5. typedef struct! f8 n5 J& n1 h3 F; p
  6. {
    4 D8 Q4 i. i2 u  K
  7.   __IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */
    5 p) [, ~4 |0 y. ]0 ^7 @& H
  8.        uint32_t RESERVED0[24];                                   
    2 O8 }' L  d6 T. F
  9.   __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */. x/ \" F( l3 i; q& R4 S. }
  10.        uint32_t RSERVED1[24];                                    
    7 ]) a- A$ O- ?  L
  11.   __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */# Q( h7 y' R, B, ~6 }) w
  12.        uint32_t RESERVED2[24];                                   
    8 Q; L) W) L0 J' o, \! U, L7 ~* n2 q
  13.   __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */$ c/ p, L: _. f! \
  14.        uint32_t RESERVED3[24];                                   
    2 `" I3 z) D' V6 ^5 k9 V" o( W# T- \
  15.   __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */
    * W8 K# ~- r9 g! g* S! _
  16.        uint32_t RESERVED4[56];                                   
    7 K. t/ i- f( }5 w
  17.   __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */* H4 S( a. X' O
  18.        uint32_t RESERVED5[644];                                 
    4 o) w& i1 t/ B7 S
  19.   __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */. _' C+ p" A$ P5 t- q4 I; `* O/ n
  20. }  NVIC_Type;                                                 i8 T& B1 A0 {' y
  21. /*@}*/ /* end of group CMSIS_CM3_NVIC */
复制代码

, Y0 m: J; W6 ~5 ^+ v3 _  d
从上面可以了解到的是,NVIC的寄存器的基址是没有错的,《The Definitive Guide to the ARM Cortex-M3》 85页有个比较详细的内存图;或者查看《Cortex-M3 Technical Reference Manual Revision r1p1》3.4 System address map,6.3 NVIC programmers model:
  E, I8 X$ k0 E* _4 ^2 c
2012091220202734.png

% i3 a5 k0 t4 C5 p6 \
以及:

! p& i6 o) c! }$ o+ B
2012091220245925.png

) \& g/ r) L' M' m( G
B3.4 Nested Vectored Interrupt Controller (NVIC)的相关说明,例如:
% e- N* l) j6 U  {0 F
2012091220290853.png

) q3 P8 a1 w! J, u/ B
当然,你看权威指南也可以的,在其APPENDIX D:NVIC Registers Quick Reference里面也有所描述。
但还有一个问题,我怎么知道这个Interrupt Set-Enable Registers寄存器的哪个位对应哪个中断呢?例如NVIC_ISER0的第0位对应哪个呢,其实,上面的表B3-31的说明已经说了,每一位对应一个中断号,所以我们还得看看stm32F103对应的中断号,可以查阅《RM0008:Reference manual》的第10章,Interrupts and events中的中断向量表,找到对应MD容量的那个表Table 63. Vector table for other STM32F10xxx devices,前面16个M3内核的中断,不可以从这个寄存器里控制,所以不管,我们从WWDG开始,可以看到这个表中的第一列即对应于寄存器中的某位(超过31的自己换算一下即可):
6 B& K9 x0 b7 T4 i5 d
2012091220434360.png
1 p6 X0 x5 s9 @4 o
可以看到,STM32F10x standard peripheral library文件stm32f10x.h中的中断号的定义是能够与这里对应上的。
另外,stm32F103RB的Datasheet(CD00161566)里面的2.3.5 Nested vectored interrupt controller (NVIC)提到F103仅有43个可屏蔽中断,所以只需用到NVIC_ISER0和NVIC_ISER1来设置启用外设中断。

5 T1 U! m- a: l0 ~  p" S
收藏 评论0 发布时间:2022-1-17 22:09

举报

0个回答

所属标签

相似分享

官网相关资源

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