前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(十四)STM32——外部中断(EXTI)

(十四)STM32——外部中断(EXTI)

作者头像
小点点
发布2022-12-12 14:40:59
7060
发布2022-12-12 14:40:59
举报
文章被收录于专栏:小点点

目录

学习目标

内容

介绍

配置

代码

运行结果

总结 


学习目标

        本节内容我们将介绍一下外部中断,STM32F4 的每个 IO 都可以作为外部 中断的中断输入口,这点也是 STM32F4 的强大之处。本节我们将使用 STM32F4 的 IO 口作为外部中断输入,实现独立按键的外部中断功能。和独立按键类似,只不过是用中断完成的。

内容

介绍

        STM32F407 的中断控制器支持 22 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F407 的 22 个外部中断为:

  1. EXTI 线 0~15:对应外部 IO 口的输入中断。
  2. EXTI 线 16:连接到 PVD 输出。
  3. EXTI 线 17:连接到 RTC 闹钟事件。
  4. EXTI 线 18:连接到 USB OTG FS 唤醒事件。
  5. EXTI 线 19:连接到以太网唤醒事件。
  6. EXTI 线 20:连接到 USB OTG HS(在 FS 中配置)唤醒事件。
  7. EXTI 线 21:连接到 RTC 入侵和时间戳事件。
  8. EXTI 线 22:连接到 RTC 唤醒事件。

        我们知道,STM32F4有112个IO口,但是只有对应的16根中断线,那么这个问题是怎么解决的呢?我们来看一下开发指南。其实解决办法就是每根中断线对应一些IO口,,GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这样就解决了我们的问题。

配置

        接下来就来到了配置的环节,我们将来一步一步配置好我们的外部中断函数,就让我们开始吧!(具体就不一一介绍怎么编写的了,其实就是复制粘贴,找到相应的参数就好了) 

  1. 使能 IO 口时钟,初始化 IO 口为输入
  2. 开启 SYSCFG 时钟,设置 IO 口与中断线的映射关系。
  3. 初始化线上中断,设置触发条件等。
  4. 配置中断分组(NVIC),并使能中断。
  5. 编写中断服务函数。
代码语言:javascript
复制
	EXTI_InitTypeDef   EXTI_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
		
	KEY_Init(); //按键对应的IO口初始化
		
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
	EXTI_InitStructure.EXTI_Line = EXTI_Line4;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE ;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
		
	EXTI_Init(&EXTI_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	
	NVIC_Init(&NVIC_InitStructure);//配置

        然后是中断函数的配置。

代码语言:javascript
复制
// 外部中断4服务程序
void EXTI4_IRQHandler(void)
{
	delay_ms(10);	//消抖
	if(KEY0==0)	 // 下降沿触发
	{				 
		LED0=!LED0;	
		LED1=!LED1;	
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位  
}

代码

        这是主函数的代码,将中断完成之后,就能实现之前独立按键的功能了。 

代码语言:javascript
复制
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "exti.h"


int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);    //初始化延时函数
	uart_init(115200); 	//串口初始化 
	LED_Init();				  //初始化LED端口  
	BEEP_Init();        //初始化蜂鸣器端口
	EXTIX_Init();       //初始化外部中断输入 
	LED0=0;					    //先点亮红灯
	while(1)
	{
  	printf("OK\r\n");	//打印OK提示程序运行
		delay_ms(1000);	  //每隔1s打印一次
	}

}

运行结果

https://live.csdn.net/v/embed/222473

独立按键

总结 

        本节外部中断,其实我觉得挺没意思的,更多是之前知识的是实践,学到的新东西较少,不过还是希望能够帮助到大家,谢谢各位的观看!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学习目标
  • 内容
    • 介绍
      • 配置
      • 代码
        • 运行结果
        • 总结 
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档