STM32外部中断EXIT和NVIC

STM32微控制器(MCU)系列中的外部中断/事件控制器(EXTI)和嵌套向量中断控制器(NVIC)是两个关键的硬件组件,它们协同工作以处理外部事件和中断。下面将分别介绍这两个组件及其在STM32中的作用。

外部中断/事件控制器(EXTI)

EXTI是STM32微控制器中用于检测来自外部引脚上的信号变化(如上升沿、下降沿或两者都检测)的硬件单元。当检测到指定的信号变化时,EXTI可以生成一个中断请求(IRQ)或者一个事件,这个请求或事件可以被CPU或其他外设使用。EXTI的主要特点包括:

  • 灵活的触发方式:可以配置为上升沿、下降沿或两者都触发。
  • 多个中断/事件线:STM32的EXTI支持多条中断/事件线,每条线可以独立配置以响应不同的外部信号。
  • 与NVIC的接口:EXTI生成的中断请求被发送到NVIC,由NVIC决定中断的优先级和是否被响应。

嵌套向量中断控制器(NVIC)

NVIC是STM32微控制器中用于处理中断和异常请求的硬件单元。它管理着中断的优先级、使能/禁用中断以及处理中断的嵌套。NVIC的主要功能包括:

  • 中断优先级管理:NVIC可以配置每个中断的优先级,以确保关键的中断请求能够得到优先处理。
  • 中断使能/禁用:允许软件在运行时启用或禁用特定的中断。
  • 中断挂起/清除:跟踪哪些中断请求正在等待处理,并在中断被处理后清除相应的挂起状态。
  • 中断嵌套:允许高优先级的中断打断低优先级中断的执行,并在高优先级中断处理完成后恢复低优先级中断的执行。

EXTI与NVIC的协同工作

在STM32中,当EXTI检测到外部引脚上的信号变化时,它会生成一个中断请求,并将这个请求发送到NVIC。NVIC根据配置的优先级和其他因素决定是否响应这个中断请求。如果决定响应,NVIC会暂停当前执行的代码(如果有必要的话,进行中断嵌套),并跳转到中断服务例程(ISR)的入口点。中断服务例程是用户编写的代码,用于处理中断事件。

编程注意事项

  • 配置EXTI:在编程时,首先需要配置EXTI以检测期望的信号变化,并将其与NVIC的某个中断线关联起来。
  • 配置NVIC:然后,需要配置NVIC以设置中断的优先级和使能中断。
  • 编写ISR:最后,需要编写中断服务例程来处理中断事件。

通过这种方式,STM32的EXTI和NVIC协同工作,使得开发者能够高效地处理外部事件和中断,实现复杂的实时应用。

EXTI(外部中断/事件控制器)的配置

配置EXTI以检测指定GPIO引脚上的信号变化,并设置触发方式(上升沿、下降沿或双边沿)。这通常通过初始化EXTI结构体并调用EXTI_Init函数来实现。

EXTI_InitTypeDef EXTI_InitStruct;  
EXTI_InitStruct.EXTI_Line = EXTI_LineX; // X为EXTI线的编号,与GPIO引脚对应,如EXTI_Line14  
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式  
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发,或选择其他触发方式  
EXTI_InitStruct.EXTI_LineCmd = ENABLE;  
EXTI_Init(&EXTI_InitStruct);

触发方式:

EXIT线的编号:

选择中断模式还是时间模式:

NVIC配置(嵌套向量中断控制器)

配置NVIC以设置中断的优先级并使能中断。这通常通过初始化NVIC结构体并调用NVIC_Init函数来实现。首先,需要使用NVIC_PriorityGroupConfig函数配置中断优先级分组。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 假设使用2位抢占优先级和2位子优先级  
  
NVIC_InitTypeDef NVIC_InitStruct;  
NVIC_InitStruct.NVIC_IRQChannel = EXTIX_IRQn; // X为EXTI中断编号,与EXTI线对应,如EXTI15_10_IRQn(对于引脚10-15)  
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级  
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 子优先级  
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_InitStruct);

优先级:

中断通道(IRQn):

编写中断服务例程

编写与NVIC配置的中断编号相对应的中断服务例程(ISR)。在STM32中,中断服务例程的名称是固定的,并且需要在启动文件(如startup_stm32f10x_hd.s)中找到或确认。

void EXTIX_IRQHandler(void) // X为EXTI中断编号,如EXTI15_10_IRQHandler  
{  
    if (EXTI_GetITStatus(EXTI_LineX) != RESET) // 检查是否是目标EXTI线触发的中断  
    {  
        // 清除中断标志  
        EXTI_ClearITPendingBit(EXTI_LineX);  
  
        // 中断处理代码  
    }  
}

外部中断感应灯:

主函数

中断函数:

当检测到发生中断时,像LED灯发出低电平,使LED灯变亮


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值