内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC)
NVIC优先级结构体定义:
typedef struct
{
uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled */uint8_t NVIC_IRQChannelPreemptionPriority; /*!< 主中断优先级范围:0-16 */
uint8_t NVIC_IRQChannelSubPriority; /*!<从优先级 范围:0-16 */
FunctionalState NVIC_IRQChannelCmd; /* IRQ通道使能 */
} NVIC_InitTypeDef;
中断原理:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。
STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不
止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样
设计,GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样每个中
断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、
GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来
决定对应的中断线配置到哪个 GPIO 上了中断线
typedef struct
{
uint32_t EXTI_Line; /*!< */
EXTIMode_TypeDef EXTI_Mode; /*!< 模式*/EXTITrigger_TypeDef EXTI_Trigger; /*!< 触发方式 */
FunctionalState EXTI_LineCmd; /*!< 使能或禁止 */
}EXTI_InitTypeDef;外部中断de应用:
void init_interrupt(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟 EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//中断线及触发方式配置
//GPIOE.3 中断线以及中断初始化配置 下降沿触发 //按键
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//中断通道及优先级配置!!
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键KEY1所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
void EXTI3_IRQHandler(void) //中断处理
{
delay_ms(10);
if(KEY==0) //按键 按下
{
beep_on;//蜂鸣器响
}
EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位(必须清掉)
}