STM32中断

定义:中途打断现在干的事情,去处理紧急的事情。
例如,打游戏中途,来了一个电话,停止打游戏接听电话就是一个中断行为。

STM32中断由NVIC(嵌套向量中断控制)寄存器控制,用于设计中断的优先级(抢占优先级和响应优先级)。

144个引脚都可以用来实现IO中断。
中文参考手册P233

外部中断EXTI(extern interrupt)
多达23个外部中断事件。
允许16个引脚连接到外部中断A——I9个加另外7个。
EXTI0:PA0 PB0 PC0 PD0 PE0 PF0 PG0 PH0 PI0
EXTI1:PA1 PB1 PC1 PD1 PE1 PF1 PG1 PH1 PI1
EXTI15:PA15 PB15 PC15 PD15 PE15 PF15 PG15 PH15
引脚只能连接到对应的外部中断控制线 ,并只能选择一个引脚连接。
如外部中断控制线0,只能由PA0 PB0 PC0 PD0 PE0 PF0 PG0 PH0 PI0 中的一个连接,不允许多个。

另外7个
EXTI线16连接到PVD输出
EXTI线17连接到RTC闹钟事件
EXTI线18连接到USB OTG FS唤醒事件
EXTI线19连接到以太网唤醒事件
EXTI线20连接到USB OTG HS(在FS中配置)唤醒事件
EXTI线21连接到RTC入侵和时间戳事件
EXTI线22连接到RTC唤醒事件

例子:参照帮助文档,用外部中断按键(PA0)控制led(PF9)。

#include "stm32f4xx.h"  //M4头文件
#include "sys.h"  //参考[STM32 IO口位带操作](https://mp.csdn.net/postedit/85815074)

int main(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;

	/*LED灯 PF9 配置为输出模式*/
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);			//使能PF口工作

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;						//第 0 号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;					//输入模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;					//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;				//引脚的速度最大为100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;				//没有使用内部上拉电阻
	GPIO_Init(GPIOF, &GPIO_InitStructure);							//使配置生效
	
	/*按键PA0配置输入模式*/
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);			//使能PA口工作

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;						//第 0 号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;					//输入模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;				//引脚的速度最大为100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;				//没有使用内部上拉电阻
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//使配置生效

	//配置中断优先级分组为组2:能够支持4个抢占优先级和4个响应优先级
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	/*为PA0配置中断*/
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);	//将PA0连接到外部中断控制线0
	EXTI_InitStructure.EXTI_Line = EXTI_Line0;						//选择外部中断控制线0
	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 = EXTI0_IRQn;				//选择外部中断控制线0
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;	//抢占优先级为0xF
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;			//响应优先级为0xF
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;					//使能工作
	NVIC_Init(&NVIC_InitStructure);
	
	/*配置完成,让进程保持运行*/
	while(1);
}

/*外部中断0中断处理函数,函数命名和编写方式可参照帮助文档EXTI示例的 it.c */
void EXTI0_IRQHandler(void)
 {
  // if(EXTI_GetITStatus(EXTI_Line0) != RESET) 		//判断中断是否触发
  /if(EXTI_GetITStatus(EXTI_Line0) == SET) 			//可读性更强
   {
    PFout(9) ^= 1; 									//翻转LED
    
     EXTI_ClearITPendingBit(EXTI_Line0);			//清空中断标志位,可以执行下一次中断,不清空会不停的进入中断函数。
     
   }
 } 

STM32中断优先级有二级控制,为抢占优先级和响应优先级(子优先级),需要对中断选择分组,编程时一般选择分组二中断优先级分组,函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
该函数只需要初始化一次,在main函数中使用一次就可以了

中断优先级分组分为
NVIC_PriorityGroup_0:没有抢占优先级
4位响应优先级,可以设置2^4=16个响应优先级
NVIC_PriorityGroup_1:1位抢占优先级,可以设置2^1=2个抢占优先级
3位响应优先级,可以设置2^3=8个响应优先级
NVIC_PriorityGroup_2:2位抢占优先级,可以设置2^2=4个抢占优先级
2位响应优先级,可以设置2^2=4个响应优先级
NVIC_PriorityGroup_3:3位抢占优先级,可以设置2^3=8个抢占优先级
1位响应优先级,可以设置2^1=2个响应优先级
NVIC_PriorityGroup_4:4位抢占优先级,可以设置2^4=16个响应优先级
没有响应优先级

抢占优先级和响应优先级的区别
优先级数字越小,等级越高。如:老大是0,老二是1。。。
抢占优先级越高,代表越强壮,强壮的就可以抢夺弱小的(低抢占优先级)的资源,优先运行。
在抢占优先级相同时,就看响应优先级,相当于VIP等级。高抢占优先级占用资源时,后面不管发生多少个中断,都视为同时发生。
两个中断同时发生时,VIP等级较高的,优先获取资源的分配。
两个中断不同时发生时,先发生的先处理,即使后面发生的中断响应优先级更高,也不能抢夺资源,需等待处理完毕才能得到资源的分配。(同样强壮,就有先来后到,同时来到,就看VIP等级。)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值