整个STM32的中断由系统中断和外部中断构成,与之相关的寄存器,常用的为:
- 中断使能寄存器
- 中断清除寄存器
- 中断优先级寄存器
在定义优先级的时候,我们必须先确定中断所在组。组不同,那么他们可用的主优先级和子优先级所占用位数也不一样。
组别,主优先级,子优先级的关系
因此必须先设定中断所在组。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) //组0
然后我们才能配置主优先级和子优先级。先定义一个NVIC配置结构体,在这个结构体我们不仅可以配置主优先级和子优先级,还需要定义中断源NVIC_IRQChannel
,即,这个中断来自于何处?最后还需要定义使能ENABLE。
最终将其配置生效。
我们以检测GPIO高低电平变化的EXTI为例,试一下中断功能
EXTI介绍
EXTI功能图
EXTI输入线
一共有20组输入线,前16个是分别A~G的GPIO口的序号,多个字母的GPIO共用一个输入线。如果字母有冲突,则需要在中断中自行if处理是谁的中断。其他终端还包括USB唤醒,以太网唤醒等边沿检测电路
在这个里面决定了是上升沿触发还是下降沿触发软件中断事件
通过或门,软件中断允许我们通过程序的方式控制启动中断中断屏蔽寄存器
很简单,最终是否产生中断就看他了输出到NVIC
这里需要注意一点。虽然外设输出了中断信息,但是NVIC不一定收,因此还需要配置NVIC的ENABLE事件
这里暂时用不到,事件会产生一些脉冲,而这些脉冲对ADC转换器的唤醒会游泳。
在EXTI中配置如下
开启EXTI时钟(EXTI的时钟是AFIO时钟)
选择EXTI的信号源 (GPIO字母,GPIO序号)
GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE);
- EXTI配置结构体
.EXTI_Line //输入线
.EXTI_Mode = EXTI_Mode_Interrupt //设置EXTI为中断模式
.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发
.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
- 然后再愉快滴配置EXTI0_IRQHandler() 就OK啦