STM32自学笔记EXTI(外部中断)寄存器

外部中断通用I/O映像

在这里插入图片描述

中断处理函数分配

在这里插入图片描述

EXTI寄存器一览

以下图片全部摘自STM32中文参考手册

中断屏蔽寄存器(EXTI_IMR)

在这里插入图片描述

往对应的位写1就是开启中断,写0就是关闭中断

例如开放来自线0上的中断请求

	EXTI->IMR|=1<<0;//开放来自线0上的中断请求

事件屏蔽寄存器(EXTI_EMR)

在这里插入图片描述

参考**中断屏蔽寄存器(EXTI_IMR)**的操作

上升沿触发选择寄存器(EXTI_RTSR)

在这里插入图片描述

设置对应的外部中断触发事件为上升沿
上升沿就是电平从0到1

例如允许输入线0上的上升沿触发

	EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发

下降沿触发选择寄存器(EXTI_FTSR)

在这里插入图片描述

设置对应的外部中断触发事件为下降沿
下降沿就是电平从1到0

例如允许输入线0上的下降沿触发

	EXTI->FTSR|=1<<0;//允许输入线0上的下降沿触发

软件中断事件寄存器(EXTI_SWIER)

在这里插入图片描述

对应位写1则触发中断

挂起寄存器(EXTI_PR)

在这里插入图片描述

这个寄存器和SR寄存器差不多,都是检查相应的中断是否发生,不同的是清除的方式

外部中断配置寄存器 1(AFIO_EXTICR1)

在这里插入图片描述

外部中断配置寄存器 2(AFIO_EXTICR2)

在这里插入图片描述

外部中断配置寄存器 3(AFIO_EXTICR3)

在这里插入图片描述

外部中断配置寄存器 4(AFIO_EXTICR4)

在这里插入图片描述

实例操作

这里我们开启外部中断线0上的PA0

步骤

1)开启PA的时钟,配置IO

	RCC->APB2ENR|=1<<2;//使能PA时钟
	GPIOA->CRL&=0XFFFFFFF0;//PA0配置清零
	GPIOA->CRL|=0X00000008;//PA0下拉输入
	GPIOA->ODR|=0<<0;//PA0下拉

2)开启复用时钟,设置 IO 口与中断线的映射关系

	RCC->APB2ENR|=1<<0;//开启复用辅助时钟
	AFIO->EXTICR[0]&=~(0XF<<0);//清除原来的设置
	AFIO->EXTICR[0]|=0<<0;//外部中断0映射到PA0上

特别注意这里的AFIO->EXTICR寄存器的编号

3)开启外部中断线上中断,设置触发条件

	EXTI->IMR|=1<<0;//开放来自线0上的中断请求
	EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发

4)配置中断分组(NVIC),并使能中断

	MY_NVIC_Init(2,3,EXTI0_IRQn,2);	//抢占2,子优先级3,组2 

5)编写中断服务函数

//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
	delay_ms(10);	//消抖
	if(GPIOA->IDR&1<<0)	//PA0按下
	{				 
		LED1=!LED1;
	}		 
	EXTI->PR=1<<0;  //清除线0上的中断标志位  
} 

源文件

EXTI.C

#include "EXTI.h"
#include "delay.h"
#include "led.h"

void exti_init(void)
{
	RCC->APB2ENR|=1<<2;//使能PA时钟
	GPIOA->CRL&=0XFFFFFFF0;//PA0配置清零
	GPIOA->CRL|=0X00000008;//PA0下拉输入
	GPIOA->ODR|=0<<0;//PA0下拉
	
	RCC->APB2ENR|=1<<0;//开启复用辅助时钟
	AFIO->EXTICR[0]&=~(0XF<<0);//清除原来的设置
	AFIO->EXTICR[0]|=0<<0;//外部中断0映射到PA0上
	
	EXTI->IMR|=1<<0;//开放来自线0上的中断请求
	EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发
	MY_NVIC_Init(2,3,EXTI0_IRQn,2);	//抢占2,子优先级3,组2  
}
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
	delay_ms(10);	//消抖
	if(GPIOA->IDR&1<<0)	//PA0按下
	{				 
		LED1=!LED1;
	}		 
	EXTI->PR=1<<0;  //清除线0上的中断标志位  
} 

EXTI.H

#ifndef __EXTI_H
#define __EXTI_H
#include "sys.h"



void exti_init(void);


#endif

MAIN.C

#include "sys.h"
#include "usart.h"		
#include "delay.h"
#include "led.h"
#include "EXTI.h"




int main(void)
{
	Stm32_Clock_Init(9);	//系统时钟设置
	delay_init(72);	  		//延时初始化
	uart_init(72,115200); 	//串口初始化为115200
	led_init();				//LED初始化
	exti_init();			//EXTI初始化
  	while(1)
	{
		LED0=!LED0;			//LED0用来指示程序正在运行
		delay_ms(200);
	}
} 


结果

LED0(红灯)闪烁,代表程序正在运行
在这里插入图片描述

按下PA0之后,PA0电平由0变到1,LED1亮(绿灯)

在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在野火stm32f407开发板上,可以使用寄存器来配置和控制EXTI中断灯。 以下是一种使用寄存器编写的方法: 1. 首先,需要开启SYSCFG时钟和GPIO时钟,以便使用相关的寄存器。可以使用RCC_APB2PeriphClockCmd和RCC_AHB1PeriphClockCmd函数进行时钟使能。 2. 然后,需要设置中断线与外设之间的映射,将中断线连接到相应的GPIO引脚。可以使用SYSCFG_EXTILineConfig函数进行配置。 3. 接下来,需要配置EXTI的触发模式、中断模式以及中断线的使能。可以使用EXTI_InitTypeDef结构体和EXTI_Init函数进行配置。 4. 创建中断服务函数,用于处理中断事件。中断服务函数的命名和中断向量的配置需要参考所使用的开发板和MCU型号的相关文档。 5. 最后,需要在main函数中使能中断控制器NVIC,并设置优先级,以便使能和处理EXTI中断。 以上是使用寄存器编写的一种方法来控制EXTI中断灯。通过配置相关寄存器,可以实现对中断触发条件和中断线的控制。具体的寄存器地址和配置值可以参考开发板的相关文档或者MCU的参考手册。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32EXTI外部中断(直接操作寄存器)](https://download.csdn.net/download/weixin_41205554/10136418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [轻松搞懂STM32F407之中断及NVIC与EXTI](https://blog.csdn.net/weixin_44091010/article/details/118555476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值