多个外设都会触发中断,在NVIC通过优先级来判断先执行哪个,n是一个外设还可以多个通道
NVIC相当于一个排队系统,把某个模块某个通道当作一个病人,排队,不过这个排队并不公平,不是先来后到,是按照优先级,看资历的

优先级分组:分组的话,一个芯片只能用一次,注意分组和优先级设置不同,分组是设置整个芯片的,优先级是设置某个外设某个通道的,优先级越小资历越高
当抢占优先级和相应优先级都相同的时候,按照这个号来排队哈

来看看中断中的外部中断EXTI:
要点是:
1.检测的是高低电平的变化
2.相同的PIN不能同时触发中断,比如GPIOA的PIN0和GPIOB的PIN0不能同时触发
就是选择中断引脚的时候,PA0和PB0不能都设置成EXTI引脚,PA0和PB1可以

这里触发相应的方式:
中断相应就是,触发了去执行中断函数
事件相应就是,触发了中断,去通向其他外设,控制其他外设如ADC

外部中断的基本结构
由于EXTI只有16路通道,但是GPIOA+GPIOB+……引脚数量肯定大于16
这里的AFIO就是选择引脚的

AFIO:
AFIO这里有两个功能
1 复用引脚重映射
2 中断引脚选择

EXTI:
为什么在EXTI中,相同引脚不能被同时选择,如PA0PB0
因为EXTI最终输出到NVIC的是16路通道,
其中EXTI0的包含的引脚有PA0 PB0 PC0……
EXTI1包含的是PA1 PB1 PC1……
所以相同的引脚不能被选择


KEIL代码部分
开启时钟,要用哪个外设就要开启哪个时钟
这里我们开启了GPIO,AFIO的时钟
其实还有EXTI和NVIC的,不过不用开启
EXTI不知道,反正默认打开
NVIC住皇宫里的,也不用打开,因为是内核的外设,内核的外设不用开启时钟,RCC管的是内核外的外设

GPIO INIT
EXTI的GPIOMODE选IPU就行了


AFIO的函数
重映射的比较重要
配置AFIO的中断选择器来配置我们想要的引脚
这个虽然看起来像EXTI,但是实际上操作的是AFIO的,当成AFIO就行了,其实也可以当成EXTI的

配置:第一个参数是GPIOB,第二个PINSOURCE相当于GPIO_PIN_14

EXTI的函数:
初始化

这里上面两个函数在主函数里调用
下面两个函数在中断函数里调用就行了

EXTI具体代码:

第一个是EXTI Line,以下是范围

第二个的意思就是开启EXTILINE14
![]()
第三个是选中断模式还是事件模式,是个枚举值
![]()

第四个值是上升沿还是下降沿还是双触发
![]()

NVIC:
这个函数是设置全局的中断优先级分组,每个芯片只能用一次的,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC的INIT

第一个通道:因为我们选择的是14通道EXTI进来的,触发的NVIC中断,每个通道对应一个中断相应函数
第二个是使能
三个抢占优先级,四个相应优先级
ADC1_2_IRQn
USB_HP_CAN1_TX_IRQn
USB_LP_CAN1_RX0_IRQn
CAN1_RX1_IRQn
CAN1_SCE_IRQn
EXTI9_5_IRQn
TIM1_BRK_IRQn
TIM1_UP_IRQn
TIM1_TRG_COM_IRQn
TIM1_CC_IRQn
TIM2_IRQn
TIM3_IRQn
TIM4_IRQn
I2C1_EV_IRQn
I2C1_ER_IRQn
I2C2_EV_IRQn
I2C2_ER_IRQn
SPI1_IRQn
SPI2_IRQn
USART1_IRQn
USART2_IRQn
USART3_IRQn
EXTI15_10_IRQn
RTCAlarm_IRQn
USBWakeUp_IRQn
初始化搞完了现在搞中断函数,由于中断函数的名字都是固定的
找一下
__initial_sp
Reset_Handler
NMI_Handler
HardFault_Handler
MemManage_Handler
BusFault_Handler
UsageFault_Handler
0
0
0
0
SVC_Handler
DebugMon_Handler
0
PendSV_Handler
SysTick_Handler
al Interrupts
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
这里是中断函数,因为我们的10~15通道合并在一块了,然后要具体到14通道的话需要判断这个标志位
最后要记得清空中断标志位
643

被折叠的 条评论
为什么被折叠?



