EXTI外部中断程序配置

46bbb4b3fa4249eb8fa5d77c9d956987.png  

一、EXTI外部中断配置:

(从GPIO>AFIO>EXTI>NVIC打通即可)

1.配置RCC,需要的时钟打开,需要开启的时钟有<GPIO,AFIO>。EXTI 和 NVIC 两个外设的时钟是一直打开着的,无需开启。

2.配置GPIO,选择端口为输入模式。

3.配置AFIO,选择用的那一路GPIO,连接到后面的EXTI。

4.配置EXTI,选择边沿触发方式,比如上升沿下降沿双边沿等,还有选择触发响应方式,中断响应或者事件响应。

5.配置NVIC,给我们这个中断选择一个合适的优先级。

这样,外部中断的信号,就能从GPIO到AFIO,再到EXTI,再到NVIC,最终通向CPU,这样才能让CPU由主程序跳转到中断程序执行。

二、外部中断配置程序如下

2752d44f396b47d5a5ea160d2db58b19.png

 

void CountSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;//GPIO初始化的结构体
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入《可根据STM32中文手册的8.1.11外设的GPIO配置来配置》
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//pin14脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速率
	GPIO_Init(GPIOB, &GPIO_InitStructure);//传递结构体地址,指定GPIOB
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//AFIO外部中断引脚选择
	
	EXTI_InitTypeDef EXTI_InitStructure;//EXTI初始化的结构体
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;// EXTI外部中断线选择
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能开启
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//配置为中断响应
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
	EXTI_Init(&EXTI_InitStructure);//传递结构体地址,EXTI只有一个,无需指定
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置优先级分组
	
	NVIC_InitTypeDef NVIC_InitStructure;//NVIC初始化的结构体
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//EXTI14属于这个通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能开启
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级《不能超出优先级分组范围》
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
	NVIC_Init(&NVIC_InitStructure);//传递结构体地址,NVIC只有一个,无需指定
}

三、关于定时器中断和外部中断

问:定时器中断属于外部中断吗?

答:不属于。定时器中断不是外部中断。定时器中断是设定时间到了就处理一次,可以处理按键扫描、动态显示、时钟累加等。而外部中断是CPU的INT脚电平变化引发的中断,适合需要定时引发的事件,外部随机发生,需要快速处理的事件。两个中断是完全不同的硬件引发的,所以不能拿要不要重载初值来比较。外部中断一般是指由计算机外设发出的中断请求,如键盘中断、打印机中断、定时器中断等。

四、中断函数

在STM32中,中断函数的名字都是固定的,每个中断通道(EXTI1,EXTI2这种就是中断通道。由EXTI指向NVIC)都对应一个中断函数,中断函数都是无参无返回值的。步骤为:先进行中断标志位判断,保证是想要的中断源触发的函数。中断程序结束后,要调用清除标志位的函数,不清除会导致一直响应这个中断导致程序卡死。所以每次中断程序结束后,都应该清除一下中断标志位。

278fd6f2de9c4ed1af9a0aa5ebfb15ac.png

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值