STM32---外部中断

 

目录

1.外部中断描述

2.外部中断框图

总结:经过分析框图,可以产生软件中断和事件中断,软件中断的目的是进中断服务函数。事件中断是产生一个脉冲信号给片内外设,属于硬件级别的。

3.各寄存器作用

4.端口对应

5.编程思路

EXIT

NVIC

EXTI1_IRQHandler  EXTI9_5_IRQHandler   EXTI15_10_IRQHandler

5.代码


1.外部中断描述

作用于GPIO口,引用芯片外部中断作为中断源。

一般产品有19个外部中断,互联型产品有20个外部中断。真正意义上的外部中断只有16个(0-15)。

其余四个:

EXTI线16连接到PVD输出

EXTI线17连接到RTC闹钟事件

EXTI线18连接到USB唤醒事件

EXTI线19连接到以太网唤醒事件(只适用于互联型产品)

注意:EXIT0-EXIT4每个中断源对应一个中断入口地址。EXIT5-EXIT9公用一个中断入口地址。。EXIT1-EXIT15公用一个中断入0口地址

2.外部中断框图

功能说明:外部中断可以产生硬件中断、硬件事件、软件中断、软件事件

1.要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。
2、要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。
3.通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。
 

硬件中断:(跟软件中断作用相同)

  • 配置20个中断线的屏蔽位(EXTI_IMR)
  • 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
  • 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。

硬件事件:(脉冲信号)

  • 配置20个事件线的屏蔽位(EXTI_EMR)
  • 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)

软件中断/事件的选择:(手动产生中断和事件)

  • 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
  • 设置软件中断寄存器的请求位(EXTI_SWIER)

 

3.各寄存器作用

 

 

4.端口对应

外部中断0~15映射到任何一组同名的GPIO端口(外部中断0,映射到端口编号为0的GPIO端口),并且一个外部中断入口只能映射到一个GPIO端口

5.编程思路

  1. 定义结构体NVIC和EXIT
  2.  开启复用时钟 ----RCC_APB2PeriphClockCmd

EXIT

  1. 配置 GPIO口对应的外部中断线。GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0)
  2. 选择GPIO对应的外部中断线。0-15 
  3. 选则中断或事件 
  4. 选择上升沿还是下降沿触发
  5. 使能中断线
  6. 初始化外部中断结构体

NVIC

  1. 配置NVIC中断源
  2. 设置抢占优先级和响应优先级
  3. 中断通道使能
  4. 初始化中断结构体

EXTI1_IRQHandler  EXTI9_5_IRQHandler   EXTI15_10_IRQHandler

  1. 编写中断服务函数

5.代码

void KEY_Exit_Init(void)
{
	NVIC_InitTypeDef  NVIC_InitStructure;
	EXTI_InitTypeDef  EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line3;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  //中断请求
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发---key默认高电平
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line4;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  //中断请求
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //key2
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//key1
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}
void EXTI_5_Init(void)
{
	u32 Priority = 0;
	
	RCC->APB2ENR |= 1 << 3;               //使能B端口
	RCC->APB2ENR |= 1 << 0;               //使能AFIO
	//GPIO端口配置
	GPIOB->CRL &= 0xff0fffff;             //GPIO对应位清零
	GPIOB->CRL |= 0x00800000;             //输入上/下拉
	GPIOB->ODR &= ~(1 << 5);              //输出低电平选择下拉模式
	//外部中断线映射配置,将外部中断线5映射到B端口
	AFIO->EXTICR[1] &= ~(0xf << 4);       //对应位清零
	AFIO->EXTICR[1] |= (0x1 << 4);        //外部中断线5选择PB端口
	//外部中断线初始化
	
	EXTI->EMR &= ~(1 << 5);               //屏蔽来自线5上的事件请求
	EXTI->RTSR |= 1 << 5;                 //允许输入线5上的上升沿触发
	EXTI->IMR |= 1 << 5;                  //开放来自线5上的中断请求
	//NVIC中断配置管理
	Priority = NVIC_EncodePriority((7 - 2),0,0);//设置抢占优先级和响应优先级
	NVIC_SetPriority(EXTI9_5_IRQn,Priority);    //将设定好的优先级设置给指定的中断源
	NVIC_EnableIRQ(EXTI9_5_IRQn);               //使能中断通道
}  

void EXTI3_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line3) == SET) //挂起寄存器
	{
		EXTI_ClearITPendingBit(EXTI_Line3);//
		//
		
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值