【STM32标准库江协】AFIO+EXTI对射式红外传感器计次(外部触发中断)

多个外设都会触发中断,在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通道的话需要判断这个标志位

最后要记得清空中断标志位

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值