转载:stm32外部中断5-9,10-15

转载:https://blog.csdn.net/weixin_39450910/article/details/104561985

在配置外部中断的中断服务函数时,惯性思维地给EXTI_LINE12分配了EXTI12_IRQn通道,后编译器报错,提示EXTI12_IRQn未定义。查找资料后发现外部中断的5-9,10-15各自共用了一个通道EXTI15_10_IRQn以及EXTI9_5_IRQn.如表所示

NVIC中的中断通道外部中断的中断线GPIO
EXTI0_IRQnEXTI_LINE0PX0(X为A,B,C,D···下同)
EXTI1_IRQnEXTI_LINE1PX1
EXTI2_IRQnEXTI_LINE2PX2
EXTI3_IRQnEXTI_LINE3PX3
EXTI4_IRQnEXTI_LINE4PX4
EXTI9_5_IRQnEXTI_LINE5,EXTI_LINE6····EXTI_LINEn····EXTI_LINE9PXn(n需与前面的n保持一致,下同)
EXTI15_10_IRQnEXTI_LINE10,EXTI_LINE11····EXTI_LINEn····EXTI_LINE15PXn
EXTI16EXTI16PVD输出
RTCAlarm_IRQnEXTI17RTC闹钟
USBWakeUp_IRQnEXTI18USB唤醒
EXTI19EXTI19以太网唤醒

那么,既然5-9,10-15的中断通道各自只有一个,如何针对每个LINE编写中断服务函数呢?
此时我们可以使用 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) 来判断到底是那条线唤起了中断服务函数。如下例:

void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line12)!=RESET ){
	delay_ms(10);//消抖
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0)
	{
		key_s=1;
		SendData();
		key_s=0;
	}		 
	EXTI_ClearITPendingBit(EXTI_Line12);  //清除LINE12上的中断标志位  
}
	if(EXTI_GetITStatus(EXTI_Line13)!=RESET ){
		delay_ms(10);//消抖
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1)
	{				 
		key1=1;
		SendData();
		key1=0;
<span class="token punctuation">}</span>		 
<span class="token function">EXTI_ClearITPendingBit</span><span class="token punctuation">(</span>EXTI_Line13<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//清除LINE13上的中断标志位  </span>

}
if(EXTI_GetITStatus(EXTI_Line14)!=RESET ){
delay_ms(10);//消抖
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1)
{
key2=1;
SendData();
key2=0;
}
EXTI_ClearITPendingBit(EXTI_Line14); //清除LINE14上的中断标志位
}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值