精华内容
下载资源
问答
  • nVIC
    2019-09-29 19:51:16

    1中断:每一个中断都会对应一个服务程序

      2NVIC 他的做用是负责中断优先级管理

      3IP bit[7:4]每一个中断都有一个IP寄存器,用于设置中断相关的属性

        AIRCR[10:8]只一个AIRCR寄存器负责所有的中断的优先级的分组

      4中断分组 1.void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

        NVIC_PriorityGroup_0~4

      5中断初始化 

        void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
        uint8_t NVIC_IRQChannel; 中断号
        stm32f4xx.h typedef enum IRQn 中断号的定义

      6  抢占优先级 uint8_t NVIC_IRQChannelPreemptionPriority; 0~15

      7 响应优先级 NVIC_IRQChannelSubPriority; 0~15

      8中断使能开关 FunctionalState NVIC_IRQChannelCmd; ENABLE DISABLE

      9 中断响应方式 电平触发

              边沿触发

              跳变触发 上升沿 下降沿 双边沿

     

      10选择中断线: EXTI 0~15 可选择对应的GPIO端口

        void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)

        每一个EXTIn 只能是每组GPIO第

    每一个EXTIn 只能是每组GPIO第n个端口
    EXTI_PortSourceGPIOx EXTI_PortSourceGPIOA~G 选择对应的组

    11 配置触发方式
    void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
    uint32_t EXTI_Line; 外部中断线
    EXTI_Line0~22

    EXTIMode_TypeDef EXTI_Mode;
    EXTI_Mode_Interrupt 中断
    EXTI_Mode_Event 事件

    EXTITrigger_TypeDef EXTI_Trigger 触发方式
    EXTI_Trigger_Rising 上升沿
    EXTI_Trigger_Falling 下降沿
    EXTI_Trigger_Rising_Falling 双边沿

    EXTI_LineCmd 使能开关
    ENABLE DISABLE

    代码示例:

    1 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

     

    2

    NVIC_InitTypeDef NVIC_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(&EXTI_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);

     

    2 看门狗

    1打开写保护 void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
    2设置分频系数 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
    3设置RLR寄存器值 void IWDG_SetReload(uint16_t Reload);
    4喂狗 void IWDG_ReloadCounter(void);
    5使能看门狗 void IWDG_Enable(void);
    6手动喂狗 IWDG_ReloadCounter();

    void iwdg_init()
    {
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    IWDG_SetPrescaler(IWDG_Prescaler_64);
    //64/32000 * 1000
    IWDG_SetReload(1000);
    IWDG_ReloadCounter(); //
    IWDG_Enable();
    }

     

    //中断服务程序,名字固定,并且类型void (void)
    void EXTI0_IRQHandler(void)
    {
    //1.判断该中断产生源
    delay_ms(10);//消除抖动
    if(0 == WK_UP) { //判断中断确实由WK_UP按键产生
    //2.中断处理部分
    //BEEP = !BEEP;
    IWDG_ReloadCounter();
    }
    //3.清除中断标志
    EXTI_ClearITPendingBit(EXTI_Line0);
    }


    void EXTI4_IRQHandler(void)
    {
    delay_ms(10);
    if(0 == KEY0) { 
    //2.中断处理部分
    PFout(9) = !PFout(9);
    }
    //3.清除中断标志
    EXTI_ClearITPendingBit(EXTI_Line4);
    }

    void EXTI3_IRQHandler(void)
    {
    delay_ms(10);
    if(0 == KEY1) { 
    //2.中断处理部分
    PFout(10) = 0;
    } else if(1 == KEY1) {
    PFout(10) = 1;
    }
    //3.清除中断标志
    EXTI_ClearITPendingBit(EXTI_Line3);
    }


    void my_exti_init()
    {
    NVIC_InitTypeDef NVIC_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;

    key_init();
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);

    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStruct);

    EXTI_InitStruct.EXTI_Line = EXTI_Line4;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStruct);

    EXTI_InitStruct.EXTI_Line = EXTI_Line3;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_Init(&EXTI_InitStruct);


    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);
    }

    转载于:https://www.cnblogs.com/baoshulin/p/6194522.html

    更多相关内容
  • 代码_单片机_NVIC_Init_

    2021-10-02 13:42:41
    NVIC_Configuration函数用于配置中断源,本例中用到了 RTC秒中断;GPIO_Configuration函数用于配置 PB5口线,作为每秒控制 LED亮灭的控制线; Usart1_Init函数用于配置串口 1,设置了通信速率等;Clock_ini函数用于...
  • STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解
  • CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。
  • 重新加深STM32F103系列NVIC中断向量控制器,结合“正点原子”相关教材和《STM32中文参考手册》,写了这篇关于NVIC的总结文档,防止自己忘记后有迹可查。
  • NVIC简介

    千次阅读 2022-01-26 13:21:51
    什么是NVIC1.1 NVIC结构体定义1.2 相应固件库函数1.2.1 NVIC_EnableIRQ 函数1.2.2 NVIC_DisableIRQ 函数1.2.3 NVIC_GetPendingIRQ 函数1.2.4 NVIC_SetPendingIRQ 函数1.2.5 NVIC_ClearPendingIRQ 函数1.2.6 NVIC_...

    1. 什么是NVIC

    NVIC :Nested Vectored Interrupt Controller,全称嵌套向量中断控制器,

    1.1 相关结构体定义

    1.1.1 NVIC 类型结构体定义

    注:常用 ISER、ICER 和 IP 这三个寄存器,ISER 用来使能中断,ICER 用来失能中断,IP 用来设置中断优先级。

    /** @addtogroup CMSIS_CM3_NVIC CMSIS CM3 NVIC
      memory mapped structure for Nested Vectored Interrupt Controller (NVIC)
    	嵌套向量中断控制器(NVIC)的内存映射结构体
      @{
     */
    typedef struct
    {
      __IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */ // 中断设置使能寄存器
           uint32_t RESERVED0[24];                                   
      __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */ // 中断清除使能寄存器
           uint32_t RSERVED1[24];                                    
      __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */ // 中断设置挂起寄存器
           uint32_t RESERVED2[24];                                   
      __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */ // 中断清除挂起寄存器
           uint32_t RESERVED3[24];                                   
      __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */ // 中断有效位寄存器
           uint32_t RESERVED4[56];                                   
      __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */ // 中断优先级寄存器(8位宽)
           uint32_t RESERVED5[644];                                  
      __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */ // 软件触发中断寄存器
    }  NVIC_Type;                                               
    /*@}*/ /* end of group CMSIS_CM3_NVIC */
    

    1.1.2 NVIC 初始化结构体

    用于初始化NVIC,指定中断源、优先级及使能或失能。

    /** 
      * @brief  NVIC Init Structure definition  
    		简介:  NVIC 初始化结构体定义
      */
    
    typedef struct
    {
      uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.
                                                       This parameter can be a value of @ref IRQn_Type 
                                                       (For the complete STM32 Devices IRQ Channels list, please
                                                        refer to stm32f10x.h file) */
    	/* 指定要启用或禁用的IRQ通道。此参数可以是@ref IRQn_Type的值(有关完整的STM32设备IRQ通道列表,请参阅stm32f10x.h文件) */
    
      uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel
                                                       specified in NVIC_IRQChannel. This parameter can be a value
                                                       between 0 and 15 as described in the table @ref NVIC_Priority_Table */
    	/* 指定NVIC_IRQChannel中指定的IRQ通道的抢占优先级。如@ref NVIC_Priority_表所述,该参数可以是介于0和15之间的值 */
    
      uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified
                                                       in NVIC_IRQChannel. This parameter can be a value
                                                       between 0 and 15 as described in the table @ref NVIC_Priority_Table */
    	/* 指定NVIC_IRQChannel中指定的IRQ通道的子优先级。如@ref NVIC_Priority_表所述,该参数可以是介于0和15之间的值。 */
    
      FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
                                                       will be enabled or disabled. 
                                                       This parameter can be set either to ENABLE or DISABLE */  
    /* 指定是启用还是禁用NVIC_IRQChannel中定义的IRQ通道。此参数可以设置为启用或禁用 */	
    } NVIC_InitTypeDef;
    
    

    注:
    在这里插入图片描述

    1.2 相应固件库函数

    1.2.1 NVIC_EnableIRQ 函数

    在NVIC中断控制器中启用中断(使能)

    /**
     * @brief  Enable Interrupt in NVIC Interrupt Controller
     * 简介:  在NVIC中断控制器中启用中断
     * @param  IRQn   The positive number of the external interrupt to enable
     * 参数 : IRQn   要启用的外部中断的正数( IRQn_Type结构体中定义有 )
     * Enable a device specific interupt in the NVIC interrupt controller.
    	 在NVIC中断控制器中启用特定于设备的中断。
     * The interrupt number cannot be a negative value.
    	 中断号不能是负值。
     */
    static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
    {
      NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
    }
    
    

    1.2.2 NVIC_DisableIRQ 函数

    禁用指定的外部中断

    /**
     * @brief  Disable the interrupt line for external interrupt specified
     * 简介:  禁用指定的外部中断
     * @param  IRQn   The positive number of the external interrupt to disable
     * 参数 : IRQn   要禁用的外部中断的正数( IRQn_Type结构体中定义有 )
     * Disable a device specific interupt in the NVIC interrupt controller.
     * The interrupt number cannot be a negative value.
     */
    static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
    {
      NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */
    }
    

    1.2.3 NVIC_GetPendingIRQ 函数

    读取特定于设备的中断源的中断挂起位

    /**
     * @brief  Read the interrupt pending bit for a device specific interrupt source
     * 简介:  读取特定于设备的中断源的中断挂起位
     * @param  IRQn    The number of the device specifc interrupt
       参数:  IRQn    设备中断的特定编号( IRQn_Type结构体中定义有 )
     * @return         1 = interrupt pending, 0 = interrupt not pending
     * 返回值:				 1 = 中断挂起 					0 = 中断未挂起
     * Read the pending register in NVIC and return 1 if its status is pending, 
     * otherwise it returns 0
     */
    static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
    {
      return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */
    }
    
    

    1.2.4 NVIC_SetPendingIRQ 函数

    设置外部中断的挂起位

    /**
     * @brief  Set the pending bit for an external interrupt
     * 简介:  设置外部中断的挂起位
     * @param  IRQn    The number of the interrupt for set pending
     * 参数 : IRQn 	 设置挂起的中断的序号
     * Set the pending bit for the specified interrupt.
    	 为指定的中断设置挂起位。
     * The interrupt number cannot be a negative value.
     */
    static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
    {
      NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */
    }
    

    1.2.5 NVIC_ClearPendingIRQ 函数

    清除外部中断的挂起位

    /**
     * @brief  Clear the pending bit for an external interrupt
     * 简介:  清除外部中断的挂起位
     * @param  IRQn    The number of the interrupt for clear pending
     * 
     * Clear the pending bit for the specified interrupt. 
     * The interrupt number cannot be a negative value.
     */
    static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
    {
      NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
    }
    

    1.2.6 NVIC_GetActive 函数

    读取外部中断的有效位

    /**
     * @brief  Read the active bit for an external interrupt
     * 简介:  读取外部中断的有效位
     * @param  IRQn    The number of the interrupt for read active bit
     * 参数 : IRQn 	 读取有效位的中断的序号
     * @return         1 = interrupt active, 0 = interrupt not active
     * 读取NVIC中的活动寄存器,如果其状态为活动,则返回1,反之返回0
     * Read the active register in NVIC and returns 1 if its status is active, 
     * otherwise it returns 0.
     */
    static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)
    {
      return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */
    }
    

    1.2.7 NVIC_SetPriority 函数

    设置中断的优先级

    /**
     * @brief  Set the priority for an interrupt
     * 简介:  设置中断的优先级
     * @param  IRQn      The number of the interrupt for set priority
     * @param  priority  The priority to set
     * 参数2 :priority  设定的优先值
     * Set the priority for the specified interrupt. The interrupt 
     * number can be positive to specify an external (device specific) 
     * interrupt, or negative to specify an internal (core) interrupt.
     * 设置指定中断的优先级。中断号可以是正数以指定外部(设备特定)中断,
       也可以是负数以指定内部(核心)中断。
     * Note: The priority cannot be set for every core interrupt.
       注意:不能为每个核心中断设置优先级。
     */
    static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
    {
      if(IRQn < 0) {
        SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
      else {
        NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
    }
    

    1.2.8 NVIC_GetPriority 函数

    读取中断的优先级

    /**
     * @brief  Read the priority for an interrupt
     * 简介:  读取中断的优先级
     * @param  IRQn      The number of the interrupt for get priority
     * @return           The priority for the interrupt
     *
     * Read the priority for the specified interrupt. The interrupt 
     * number can be positive to specify an external (device specific) 
     * interrupt, or negative to specify an internal (core) interrupt.
     * 读取指定中断的优先级。中断号可以是正数以指定外部(设备特定)中断,也可以是负数以指定内部(核心)中断。
     * The returned priority value is automatically aligned to the implemented
     * priority bits of the microcontroller.
     * 返回的优先级值自动与微控制器实现的优先级位对齐。
     * Note: The priority cannot be set for every core interrupt.
     */
    static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
    {
    
      if(IRQn < 0) {
        return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M3 system interrupts */
      else {
        return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)]           >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */
    }
    

    1.2.9 NVIC_SystemReset 函数

    启动系统重置请求

    /* ##################################    Reset function  ############################################ */
    
    /**
     * @brief  Initiate a system reset request.
     * 简介:  启动系统重置请求。
     * Initiate a system reset request to reset the MCU
    	 启动系统重置请求以重置MCU
     */
    static __INLINE void NVIC_SystemReset(void)
    {
      SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      | 
                     (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | 
                     SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
      __DSB();                                                     /* Ensure completion of memory access */              
      while(1);                                                    /* wait until reset */
    }
    
    /*@}*/ /* end of group CMSIS_CM3_Core_FunctionInterface */
    
    

    1.2.10 NVIC_PriorityGroupConfig 函数

    配置优先级分组:抢占优先级和子优先级。

    /** @defgroup Preemption_Priority_Group 
      * @{
      */
    
    #define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                                4 bits for subpriority */
    #define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                                3 bits for subpriority */
    #define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                                2 bits for subpriority */
    #define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                                1 bits for subpriority */
    #define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                                0 bits for subpriority */
    
    
    /**
      * @brief  Configures the priority grouping: pre-emption priority and subpriority.
    		简介:  配置优先级分组:抢占优先级和子优先级。
      * @param  NVIC_PriorityGroup: specifies the priority grouping bits length.
    		参数:  NVIC_PriorityGroup: 指定优先级分组位长度。
      *   This parameter can be one of the following values:
      *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority :0位 用于抢占优先级
      *                                4 bits for subpriority					 :4位 表示次优先级
      *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority :1位 用于抢占优先级
      *                                3 bits for subpriority					 :3位 表示次优先级
      *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority :2位 用于抢占优先级
      *                                2 bits for subpriority					 :2位 表示次优先级
      *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority :3位 用于抢占优先级
      *                                1 bits for subpriority					 :1位 表示次优先级
      *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority :4位 用于抢占优先级
      *                                0 bits for subpriority					 :0位 表示次优先级
      * @retval None
      */
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
      
      /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
      SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
    }
    
    展开全文
  • STM32实例程序 3.NVIC_test优先级抢占STM32实例程序 3.NVIC_test优先级抢占STM32实例程序 3.NVIC_test优先级抢占STM32实例程序 3.NVIC_test优先级抢占STM32实例程序 3.NVIC_test优先级抢占STM32实例程序 3.NVIC_test...
  • NVIC中断优先级管理

    多人点赞 热门讨论 2022-06-12 19:13:08
    介绍了NVIC中断优先级分组管理和中断优先级设置的概念以及用法。

    🐱作者:一只大喵咪1201
    🐱专栏:《STM32学习》
    🔥格言:你只管努力,剩下的交给时间!

    请添加图片描述

    🙀描述

    中断可以看作是一个事件。

    比如,你正在家里学习,突然来了电话,你只能停下当前的学习去接电话,在接电话的过程中又有人敲门,你只好放下电话去开门,然后再拿起电话继续打电话,当挂掉电话后又继续前面的学习。

    在上面的例子中,学习是一直在进行的事件,而打电话是一个中断事件,在打电话过程中有人敲门又是一个中断事件。
    STM32中的中断也是这个道理,在执行主程序的过程中会有其他事件打断这个过程,进入到事件中的程序去执行,执行完中断程序后再返回主程序继续执行,这样就是中断。

    🦔中断类型

    • CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
    • STM32F10系列并没有使用CM3内核的全部东西,而是只用了它的一部分。
    • STM32F10系列有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。
    • STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个)。

    这里的外部中断和可屏蔽中断都是一个意思,是指不包括内核中断的所有中断。

    图
    此图便是本喵使用的STM32F103ZET6的60个外部中断。

    🙀中断优先级分组

    有这么多类型的中断,是怎么管理的呢?STM32通分组的方式来管理这些中断。

    该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。

    图
    通过赋予SCB->AIRCR寄存器中第8位到第10位的值将这些中断类型分为5个组。
    不同的分组中,AIRCR寄存器中的第4位到第8位管理优先级的情况不同。
    比如常用的第2组,这4位中两位是管理抢占优先级的,两位是管理响应优先级的。按照从左到右的顺序。
    这时又有疑惑了,抢占优先级和响应优先级是什么呢?

    🦔抢占优先级和响应优先级

    抢占优先级:

    • 抢占优先级是指中断的打断优先级,抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。

    响应优先级

    • 响应优先级是指中断的响应顺序,响应优先级只有在抢占优先级相同的情况下才有意义。当抢占优先级相同时,俩个中断同时发生,响应优先级高的中断先响应。

    俩个优先级中,数字越小表示的优先级越高。
    举例说明:

    • 假定设置中断优先级组为2
    • 然后设置
    • 中断3(RTC中断)的抢占优先级为2,响应优先级为1。
    • 中断6(外部中断0)的抢占优先级为3,响应优先级为0。
    • 中断7(外部中断1)的抢占优先级为2,响应优先级为0。

    那么的这三个中断的优先级顺序就是

    • 中断7>中断3>中断6

    当抢占优先级和响应优先级都相同的时候,哪个中断先发生就先执行哪个中断程序。
    注意:
    中断分组仅在系统的初始化完成后设置一次。如果在后面的程序中有修改分组就会混乱。
    比如当使用的是2组的时候
    图
    优先级管理位如上图设置,此时的抢占优先级是2,响应优先级是2。
    在使用这个分组后再将分组设置成3组的时候,此时抢占优先级是5,响应优先级是0。
    如此一来,优先级的管理就混乱了。

    🦔中断优先级分组函数

    ST官方提供了设置分组的库函数,不用我们自己去挨个设置寄存器的值。

    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
      
      /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
      SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
    }
    

    这是中断优先级分组的函数,他在ST官方固件库的misc.c源文件中。
    通过函数的定义我们可以看到,它的实质就是在配置AIRCR寄存器。

    #define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                                4 bits for subpriority */
    #define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                                3 bits for subpriority */
    #define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                                2 bits for subpriority */
    #define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                                1 bits for subpriority */
    #define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                                0 bits for subpriority */
    

    以上5个宏定义就是中断优先级分组函数的入口参数,需要分成哪一组就将哪一组对应的参数传入函数中。

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    

    如此便将这60个外部中断分好了组。

    🙀中断优先级设置

    虽然分好了组,方便管理了,但是具体是哪个中断发生,它的优先级是多少还需要进行具体的设置。

    🦔中断优先级设置寄存器

    typedef struct
    {
      __IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */
           uint32_t RESERVED0[24];                                   
      __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */
           uint32_t RSERVED1[24];                                    
      __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */
           uint32_t RESERVED2[24];                                   
      __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */
           uint32_t RESERVED3[24];                                   
      __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */
           uint32_t RESERVED4[56];                                   
      __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */
           uint32_t RESERVED5[644];                                  
      __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */
    }  NVIC_Type; 
    

    在ST官方的固件库中的misc.h中定义了这样一个结构体,结构体的寄存器就是用来设置中断的优先级的。

    • ISER[8]:ISER 全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。STM32F103 的可屏蔽中断只有 60 个,所以对我们来说,有用的就是两个(ISER[0]和 ISER[1]),总共可以表示 64 个中断。而 STM32F103 只用了其中的前 60 位。ISER[0]的 bit 0到31 对应中断0到31。ISER[1]的 bit 0到27 对应中断 32~59;这样总共 60 个中断就分别对应上了。你要使能某个中断,必须设置相应的 ISER 位为 1。
    • ICER[8]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。
    • ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。
    • ICPR[8]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。写 0 无效。
    • IABR[8]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
    • IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当重要STM32 的中断分组与这个寄存器组密切相关。STM32F103只用到了其中的前 60 个。IP[59]到IP[0]分别对应中断 59~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和响应优先级。抢占优先级在前,响应优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

    在ST官方的固件库的core_cm3.h中有几个库函数

    static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn);
    static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn);
    

    分别的作用是挂起某中断,读某中断状态,解除挂起的某中断。

    🦔中断优先级初始化函数

    ST官方同样提供了中断优先级的设置函数,不用我们去挨个设置寄存器。

    typedef struct
    {
      uint8_t NVIC_IRQChannel; //设置中断通道
      uint8_t NVIC_IRQChannelPreemptionPriority;//设置抢占优先级
      uint8_t NVIC_IRQChannelSubPriority; //设置响应优先级
      FunctionalState NVIC_IRQChannelCmd; //使能/使能
    } NVIC_InitTypeDef;
    

    在misc.h中定义了这样一个结构体,成员变量分别代表着

    • 中断通道,也就是哪个类型的中断。
    • 抢占优先级。
    • 响应优先级。
    • 中断使能。

    而使用这个结构体和GPIO的使用方法类似

    NVIC_InitTypeDef   NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);	//根据上面指定的参数初始化NVIC寄存器
    

    以上便完成了中断优先级的初始化。

    🙀总结

    在使用中断的时候

    1. 系统运行后先设置中断优先级分组。
      调用函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整个系统执行过程中,只设置一次中断分组。

    2. 针对每个中断,设置对应的抢占优先级和响应优先级。
      调用函数:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。

    展开全文
  • STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
  • 在这里简单介绍一下NVIC(嵌套向量中断控制器)。NVIC就是控制中断响应的。主要由三个参数,一个是中断使能,一个是抢占优先级,还有一个就是响应优先级。(优先级数值越小,优先级别越高) 中断使能很好理解,就是是否...
  • NVIC_Init(&NVIC_InitStructure)学习

    千次阅读 2022-03-25 14:19:21
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //########################下面是内容######################## void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) { /* Check the parameters */ ...

    首先是中断优先级分组

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //########################下面是内容########################
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
      
      /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
      SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
    }

    assert_param查看参数是否有效;

    NVIC_PriorityGroup可选范围如下:

    #define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                                4 bits for subpriority */
    #define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                                3 bits for subpriority */
    #define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                                2 bits for subpriority */
    #define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                                1 bits for subpriority */
    #define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                                0 bits for subpriority */
    /*############################展开#################################*/
    NVIC_PriorityGroup_0   0111 0000 0000
    NVIC_PriorityGroup_1   0110 0000 0000
    NVIC_PriorityGroup_2   0101 0000 0000 
    NVIC_PriorityGroup_3   0100 0000 0000
    NVIC_PriorityGroup_4   0011 0000 0000
    

    AIRCR_VECTKEY_MASK定义如下:

    #define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)

    相与后送到SCB->AIRCR中,SCB定义如下:

    #define SCB                 ((SCB_Type *)           SCB_BASE)
    #############################################################
    #define SCB_BASE            (SCS_BASE +  0x0D00) 
    #############################################################
    #define SCS_BASE            (0xE000E000)

    所以SCB首地址是0xE000 ED00;SCB是个结构体指针,结构体定义如下:

    typedef struct
    {
      __I  uint32_t CPUID;                        /*!< Offset: 0x00  CPU ID Base Register                                  */
      __IO uint32_t ICSR;                         /*!< Offset: 0x04  Interrupt Control State Register                      */
      __IO uint32_t VTOR;                         /*!< Offset: 0x08  Vector Table Offset Register                          */
      __IO uint32_t AIRCR;                        /*!< Offset: 0x0C  Application Interrupt / Reset Control Register        */
      __IO uint32_t SCR;                          /*!< Offset: 0x10  System Control Register                               */
      __IO uint32_t CCR;                          /*!< Offset: 0x14  Configuration Control Register                        */
      __IO uint8_t  SHP[12];                      /*!< Offset: 0x18  System Handlers Priority Registers (4-7, 8-11, 12-15) */
      __IO uint32_t SHCSR;                        /*!< Offset: 0x24  System Handler Control and State Register             */
      __IO uint32_t CFSR;                         /*!< Offset: 0x28  Configurable Fault Status Register                    */
      __IO uint32_t HFSR;                         /*!< Offset: 0x2C  Hard Fault Status Register                            */
      __IO uint32_t DFSR;                         /*!< Offset: 0x30  Debug Fault Status Register                           */
      __IO uint32_t MMFAR;                        /*!< Offset: 0x34  Mem Manage Address Register                           */
      __IO uint32_t BFAR;                         /*!< Offset: 0x38  Bus Fault Address Register                            */
      __IO uint32_t AFSR;                         /*!< Offset: 0x3C  Auxiliary Fault Status Register                       */
      __I  uint32_t PFR[2];                       /*!< Offset: 0x40  Processor Feature Register                            */
      __I  uint32_t DFR;                          /*!< Offset: 0x48  Debug Feature Register                                */
      __I  uint32_t ADR;                          /*!< Offset: 0x4C  Auxiliary Feature Register                            */
      __I  uint32_t MMFR[4];                      /*!< Offset: 0x50  Memory Model Feature Register                         */
      __I  uint32_t ISAR[5];                      /*!< Offset: 0x60  ISA Feature Register                                  */
    } SCB_Type; 

    其中AIRCR为32位,10:8位设置优先级分组,如下图(Cortex-M3权威指南P285),31:16位必须为0xFA05,所以AIRCR_VECTKEY_MASK值为((uint32_t)0x05FA0000)。

    所以选第二组的话此时SCB->AIRCR值为:0x05FA 0500

     设置完中断优先级分组后,需要去设置抢占优先级、响应优先级、外部中断通道和使能,如下:

        NVIC_InitTypeDef NVIC_InitStructure;  	
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;		
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
      	NVIC_Init(&NVIC_InitStructure); 

    NVIC_InitStructure结构体类型如下,第一个成员用来设置中断向量表通道,这里设置的是外部中断0,第四个成员是用来使能的。

    typedef struct
    {
      uint8_t NVIC_IRQChannel;                  
      uint8_t NVIC_IRQChannelPreemptionPriority;  
      uint8_t NVIC_IRQChannelSubPriority;         
      FunctionalState NVIC_IRQChannelCmd;        
    } NVIC_InitTypeDef;

    第二三个成员用来设置抢占优先级和响应优先级,对应关系如下。

     NVIC_Init(&NVIC_InitStructure); 函数内容如下:

    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
    {
      uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
      if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
      { 
        tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
        tmppre = (0x4 - tmppriority);
        tmpsub = tmpsub >> tmppriority;
    

    函数目的是将设置好的通道、优先级、使能等信息放到相应的地方

    首先判断是否使能,使能了就用0x700给SCB->AIRCR的其他位清零,只保留AIRCR[10:8]位,然后用0111-0101=0010后右移8位,变成0010,然后赋值给 tmppriority(它的值在0~4之间变化,因为AIRCR[10:8]这三位取值范围是3~7),假设取第1组AIRCR[10:8]=110=6,tmppriority=1。如下表:

    优先级分组

    AIRCR[10:8]

    IP[7:4]

    抢占:响应

     tmpprioritytmppretmpsub
    0111=70:4040000 1111
    1110=61:3130000 0111
    2101=52:2220000 0011
    3100=43:1310000 0001
    4011=34:0400000 0000

    接下来将抢占优先级和响应优先级的信息赋值给tmppriority,即:

    先把抢占优先级NVIC_IRQChannelPreemptionPriority的取值(假设为1)左移tmppre(3位)位,然后赋值给tmppriority=1000,再把响应优先级NVIC_IRQChannelSubPriority的取值(假设为010)与tmpsub相与(目的是对其余的无效位清零保留有效位)后放进tmppriority=1010,这时候tmppriority就携带了抢占优先级和响应优先级的信息。

        tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
        tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
        tmppriority = tmppriority << 0x04;        
        NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
        NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
          (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
      }
      else
      {
        NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
          (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
      }
    }

    将tmppriority左移4位给相应的IP[]:1010 0000,因为IP[]是高4位有效的,同时将使能信息给ISER。

    就不详细解释了。下面是60个中断向量。

      WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
      PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
      TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
      RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
      FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
      RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
      EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
      EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
      EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
      EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
      EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
      DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
      DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
      DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
      DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
      DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
      DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
      DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */
      ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
      USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
      USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
      CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
      CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
      EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
      TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
      TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
      TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
      TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
      TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
      TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
      TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
      I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
      I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
      I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
      I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
      SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
      SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
      USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
      USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
      USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
      EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
      RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
      USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
      TIM8_BRK_IRQn               = 43,     /*!< TIM8 Break Interrupt                                 */
      TIM8_UP_IRQn                = 44,     /*!< TIM8 Update Interrupt                                */
      TIM8_TRG_COM_IRQn           = 45,     /*!< TIM8 Trigger and Commutation Interrupt               */
      TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */
      ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */
      FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */
      SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */
      TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */
      SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */
      UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */
      UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */
      TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */
      TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */
      DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */
      DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */
      DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */
      DMA2_Channel4_5_IRQn        = 59      /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */
    

    展开全文
  • 中断-NVIC与EXTI外设详解(超全面)

    千次阅读 多人点赞 2022-04-14 20:53:30
    一.NVIC-嵌套向量中断控制器 NVIC :嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。 这里解释一下片上外设与内核外设他们都在芯片里面,但内核外设是在内核CPU里面,片上外设...
  • 电子-STM32中的NVIC.pdf

    2019-09-05 12:25:57
    电子-STM32中的NVIC.pdf,单片机/嵌入式STM32-F0/F1/F2
  • STM32NVIC中断

    2018-03-21 15:21:50
    中断简单明了,有51基础一定能看懂,方便简洁,不会就多看几遍
  • STM32中的NVIC

    2022-04-08 22:05:19
    NVIC
  • 目录基本知识框架课堂笔记中断什么是中断中断的基本工作机制功能框图中断的优点中断类型和中断优先级中断类型内部中断外部中断中断优先级主优先级子优先级NVIC嵌套向量控制器NVIC寄存器结构体NVIC寄存器初始化函数...
  • 在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体。 /** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). */ typedef struct { __IOM uint32_t ISER[8U];
  • 本文简要的介绍了NVIC(嵌套向量中断控制器)的基础知识,为下一篇学习外部中断打下基础。
  • STM32G4之NVIC中断系统

    千次阅读 2022-01-17 21:01:16
    STM32中断机制NVIC中断系统原理及实现
  • STM32_基础入门(八)_NVIC中断优先级管理
  • STM32F4NVIC总结
  • 1 NVIC中断优先级分组 1.1NVIC的中断向量表 Cortex-M3和CM4内核都支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32F1并没有使用CM3内核的全部东西,...
  • NVIC:嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。 ARM cortex_m3 内核支持 256 个中断(16 个内核+240 外部)和可编程 256 级中断优先级的设置,与其相关的中断控制和中断...
  • 【STM32】2-STM32中断系统(NVIC

    千次阅读 2021-05-30 16:35:29
    系列文章总目录 【STM32】实验解析目录 目录 一、中断介绍 1.1 中断概念 1.2 NVIC介绍 1.3 中断优先级 二、中断配置步骤 三、结构体解读 3.1 程序样例 3.2 程序解读 1、创建NVIC结构体变量 2、NVIC结构体 1、NVIC...
  • NVIC中断优先级

    2021-08-13 23:59:44
    一、STM32 NVIC 中断优先级管理 1,中断: CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一...
  • 关于STM32中断向量管理NVIC的解析,希望能帮助大家理解。
  • STM32中EXTI,EXTI和NVIC的关系

    千次阅读 2021-01-29 18:11:52
    但是各个芯片厂商在设计芯片的时候会对Cortex-M3内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M3的NVIC的一个子集。 NVIC结构体定义: typedef struct { __IO uint32_t ISER[8]; /*!*/ ...
  • 写在前面: ...一、NVIC简单解释 二、抢占优先级与子优先级 三、抢占优先级和子优先级的区分(白话文) 四、NVIC配置分析 在STM32笔记之 EXIT(外部中断)篇章中,已经了解到 EXIT的配置,但是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,768
精华内容 13,907
关键字:

nVIC

友情链接: hotfix_oi3p.rar