《STM32库开发实战指南 》NVIC中断 & EXTI举例

整个STM32的中断由系统中断和外部中断构成,与之相关的寄存器,常用的为:

  1. 中断使能寄存器
  2. 中断清除寄存器
  3. 中断优先级寄存器

在定义优先级的时候,我们必须先确定中断所在组。组不同,那么他们可用的主优先级和子优先级所占用位数也不一样。


《STM32库开发实战指南 》NVIC中断 & EXTI举例_第1张图片
组别,主优先级,子优先级的关系

因此必须先设定中断所在组。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) //组0

然后我们才能配置主优先级和子优先级。先定义一个NVIC配置结构体,在这个结构体我们不仅可以配置主优先级和子优先级,还需要定义中断源NVIC_IRQChannel,即,这个中断来自于何处?最后还需要定义使能ENABLE。

最终将其配置生效。


我们以检测GPIO高低电平变化的EXTI为例,试一下中断功能

EXTI介绍

《STM32库开发实战指南 》NVIC中断 & EXTI举例_第2张图片
EXTI功能图
  1. EXTI输入线
    一共有20组输入线,前16个是分别A~G的GPIO口的序号,多个字母的GPIO共用一个输入线。如果字母有冲突,则需要在中断中自行if处理是谁的中断。其他终端还包括USB唤醒,以太网唤醒等

  2. 边沿检测电路
    在这个里面决定了是上升沿触发还是下降沿触发

  3. 软件中断事件
    通过或门,软件中断允许我们通过程序的方式控制启动中断

  4. 中断屏蔽寄存器
    很简单,最终是否产生中断就看他了

  5. 输出到NVIC
    这里需要注意一点。虽然外设输出了中断信息,但是NVIC不一定收,因此还需要配置NVIC的ENABLE

  6. 事件
    这里暂时用不到,事件会产生一些脉冲,而这些脉冲对ADC转换器的唤醒会游泳。

在EXTI中配置如下

  1. 开启EXTI时钟(EXTI的时钟是AFIO时钟)

  2. 选择EXTI的信号源 (GPIO字母,GPIO序号)

GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE);
  1. EXTI配置结构体
.EXTI_Line //输入线
.EXTI_Mode = EXTI_Mode_Interrupt //设置EXTI为中断模式
.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发
.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

  1. 然后再愉快滴配置EXTI0_IRQHandler() 就OK啦

你可能感兴趣的:(《STM32库开发实战指南 》NVIC中断 & EXTI举例)