外设中断NVIC、EXTI

一、对外设的控制方式:轮询、中断、MDA

二、中断:可以改变任务的执行顺序

三、NVIC:中断控制器:设置分组与设置优先级

分组中断优先级分组
分组不同,抢占优先级与响应优先级的占位不同,一般设置为组2
先看抢占,再看响应,数字越小,优先级越高。

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//设置分组函数调用

NVIC_InitTypeDef	NVICInitDef;						//定义结构体变量
NVICInitDef.NVIC_IRQChannel=USART1_IRQn;				//设置中断通道,在10x.h文件中寻找
NVICInitDef.NVIC_IRQChannelCmd=ENABLE;					//使能中断
NVICInitDef.NVIC_IRQChannelPreemptionPriority=2;		//抢占优先级(0-3)
NVICInitDef.NVIC_IRQChannelSubPriority=1;				//响应优先级(0-3)
NVIC_Init(&NVICInitDef);			//初始化函数调用

四、EXTI:外部中断

外设产生中断信号->交给EXTI->交给内核NVIC
STM32每个io口都可以设置为中断

EXTI结构体

EXTI 初始化结构体
 typedef struct {
 uint32_t EXTI_Line; 						// 中断事件线
 EXTIMode_TypeDef EXTI_Mode; 				// EXTI 模式
 EXTITrigger_TypeDef EXTI_Trigger; 			// 触发类型
 FunctionalState EXTI_LineCmd; 				// 使能EXTI线
 } EXTI_InitTypeDef;

外设中断线(在10x.h文件中)

EXTI共有0-15,16根输入线对应GPIOX_0-15
需要开启AFIO时钟。
中断线对应图
4根输出线
EXTI线16————PVD输出
EXTI线17————RTC闹钟事件
EXTI线18————USB唤醒事件
EXTI线19————以太网唤醒事件(只适合于互相联网产品)

触发方式

有三种:具体看检测到的第一个出现的边沿信号

上升沿、下降沿、上双向沿

触发方式的选择

中断服务函数 IRQHandle(IO口输入线0-15)(在.s文件中)

中断服务函数

五、配置流程

1.初始化中断使用的io口为输入

开启GPIO时钟:	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);//打开gpiox时钟	
使能外部中断时钟:	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);		//开AIFO时钟
gpio初始化:GPIO_Init();

2.配置中断分组,和优先级

NVIC_PriorityGroupConfig();			//分组
NVIC_Init();						//初始化。设置中断通道,使能,和优先级,中断向量在10x.h文件中

3.配置中断

使能外部中断时钟:	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);		//开AIFO时钟
设置GPIO与中断线的映射关系:GPIO_EXTILineConfig();						//映射中断线
初始化中断:EXTI_Init();				//设置中断模式、中断通道(10x.h文件中)、触发方式

4.编写中断服务函数

EXTIx_IRQHandler();			//在.s启动文件中
注意清楚中断标志位函数的调用
EXTI_ClearITPendingBit();			//清除中断标志位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为您提供一些关于stm32f103标准外设外部中断实验的指导。 首先,您需要了解外部中断通常用于处理来自外部设备的信号,例如按钮按下等事件。在STM32F103系列微控制器中,外部中断通常与GPIO相结合使用。 以下是一个基本的外部中断实验步骤: 1. 配置GPIO引脚为输入模式,用于连接外部中断信号线 2. 配置外部中断触发条件,例如上升沿触发、下降沿触发等 3. 初始化外部中断,并将其与相应的GPIO引脚绑定 4. 在外部中断的处理程序中编写相应的代码,例如改变LED的状态等。 以下是一些基本的代码示例: 配置GPIO引脚为输入模式: ``` GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); ``` 配置外部中断触发条件: ``` EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` 初始化外部中断: ``` void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 处理中断事件 EXTI_ClearITPendingBit(EXTI_Line0); } } ``` 在处理程序中编写相应的代码,例如改变LED的状态等: ``` void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 处理中断事件 GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1))); EXTI_ClearITPendingBit(EXTI_Line0); } } ``` 这是一个基本的外部中断实验步骤,您可以根据自己的需求进行相应的修改和优化。希望这些指导对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好睡觉好好吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值