stm32f407VET6 系统学习 day02 GPIO 引脚的按键 中断,中断设置 (配置)

1.中断基本知识

1.知识点: STM32的所有中断(内部或外部)都是由NVIC(嵌套向量中断控制器)控制
注意:在KEIL5工程中的fwlib分组中,misc.c文件提供了NVIC相关的固件库函数。

2.中断源 :引起CPU中断的根源,称为中断源。

3.中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处玛事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。


2.中断分类

1. STM32中断系统包括内部中断和外部中断


1.内部中断是指STM32内置外设或接口产生的中断,如定时器TIMx、串口UART中断等。


2.外部中断是指独立于STM32的外部器件,通过I/O引脚产生的请求STM32处理的中断,
FLASH如按键、Lora模块请求的中断等。


 3.中断分组 ,每个组的优先级,与响应优先级


4.内部中断的使用 的配置 

1.第一步:配置NVIC属性,包括:

1.配置IRQ号;
2.中断优先级(组优先级和组内子优先级)

3.使能对应的IRQ中断。


5.外部中断的使用 配置

1.配置外部的中断线

2. 配置流程



3.代码:

.h 文件

#ifndef __MYEXIT_H__
#define __MYEXIT_H__

void MYEXIT_init(void);//初始化


#endif



.cpp 

#include "MYEXIT.h"
#include "stm32f4xx.h"  //头文件
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "KEY.h"
#include "LED.h"
#include "mysystick.h"


void MYEXIT_init(void)//初始化
{
    EXTI_InitTypeDef EXTI_InitStructure;
		NVIC_InitTypeDef NVIC_InitStruct;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//中断使能
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组
	
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource5);//绑定端口
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);//绑定端口
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource6);//绑定端口
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);//绑定端口
		
	  EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line4 |EXTI_Line6 |EXTI_Line13;//那根中断线
	  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置中断和事件
		EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
		EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断使能
		EXTI_Init(&EXTI_InitStructure);
	
		NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =1;//设置抢占优先级
		NVIC_InitStruct.NVIC_IRQChannelSubPriority =1; //设置响应优先级
		NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
		NVIC_Init(&NVIC_InitStruct);
	
	
		NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2;//设置抢占优先级
		NVIC_InitStruct.NVIC_IRQChannelSubPriority =2; //设置响应优先级
		NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
		NVIC_Init(&NVIC_InitStruct);
		
		
		NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2;//设置抢占优先级
		NVIC_InitStruct.NVIC_IRQChannelSubPriority =1; //设置响应优先级
		NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
		NVIC_Init(&NVIC_InitStruct);

}

void EXTI9_5_IRQHandler(void)
{
	 static int BEEP_a=1;
	 static int LED=1;
	  if(EXTI_GetITStatus(EXTI_Line5) != RESET)//按下KEY2
   { 
      delay_ms(20);
			if(key_youxi()==2)
			{
					if(LED%2==1)
					{
						select_led(2);
						LED++;
					}
					else if(LED%2==0)
					{
						close_num_led(2);
						LED++;
					}
			}
			EXTI_ClearITPendingBit(EXTI_Line5);
   }
   else if(EXTI_GetITStatus(EXTI_Line6) != RESET)  //按下KEY3
   {
        delay_ms(20); //消除抖动
				if(key_youxi()==3)
				{
						if(BEEP_a%2==1)
						{
							openBeep();
							BEEP_a++;
						}
						else if(BEEP_a%2==0)
						{
							closeBeep();
							BEEP_a++;
						}
				}
				
				EXTI_ClearITPendingBit(EXTI_Line6);
   }
	 
     
}

void EXTI4_IRQHandler(void)
{
	static int LED=1;
	delay_ms(20);
	if(key_youxi()==1)
	{
		    if(LED%2==1)
				{
					select_led(1);
					LED++;
				}
				else if(LED%2==0)
				{
					close_num_led(1);
					LED++;
				}
	}
	EXTI_ClearITPendingBit(EXTI_Line4);

}

void EXTI15_10_IRQHandler(void)
{
	 static int LED=1;
	
		delay_ms(20); //消除抖动
		if(key_youxi()==4)
		{
				if(LED%2==1)
				{
					select_led(3);
					LED++;
				}
				else if(LED%2==0)
				{
					close_num_led(3);
					LED++;
				}
		}
		EXTI_ClearITPendingBit(EXTI_Line13);
	 
}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是STM32F407VET6引脚分配图: ![STM32F407VET6引脚分配图](https://img-blog.csdn.net/20180522153643167?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0ZWxlcmlrXzIwMTgwNzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85/format/webp) ### 回答2: STM32F407VET6是一款基于ARM Cortex-M4内核的微控制器,具有很强的性能和可靠性。它的引脚分配图如下: ![STM32F407VET6引脚分配图](https://img-blog.csdn.net/20171021111907003?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQnVzaW5lc3NNeUFuZ3Vs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75) STM32F407VET6共有100个引脚,其中PA、PB、PC、PD、PE、PF、PG、PH和PI是GPIO端口。具体来说,PA0~PA15、PB0~PB15、PC0~PC15、PD0~PD15、PE0~PE15、PF0~PF15、PG0~PG15、PH0~PH15和PI0~PI15都是可用的GPIO端口。 此外,STM32F407VET6还有很多功能强大的引脚,如UART、USART、SPI、I2C、USB、CAN和ADC等。这些引脚可以用于连接外部设备,或者进行数据输入/输出、通讯和信号转换等操作。 需要注意的是,除了PA13和PA14是用于SWD调试和下载的引脚外,其他引脚都可以自由使用。但需要根据具体的应用场景和需求来选择适当的引脚,以便最大程度地发挥STM32F407VET6的优势和功能。 总之,STM32F407VET6引脚分配图除了包含常用的GPIO端口外,还包含各种通讯接口和外设接口,为用户提供了丰富的硬件资源和灵活的应用选择。 ### 回答3: STM32F407VET6是一款高性能、低功耗的32位微控制器,它提供了多种接口和功能,用于满足不同的应用需求。该芯片的引脚分配图如下: ![STM32F407VET6引脚分配图](https://i.imgur.com/WNGHnBY.jpg) 该图中,VDDA和VREF+引脚用于ADC参考电压输入,VDD和VSS分别为芯片的供电电压和地线引脚。PA0~PA15和PB0~PB15为GPIO口,可以作为通用输入输出口使用,可用于控制外设。PC0~PC15、PD0~PD15和PE0~PE15也是GPIO口,但是它们具有更多的功能,如UART、SPI、I2C、定时器和外部中断等。PF0~PF15和PG0~PG15是ADC输入口,可用于连接外部模拟信号进行采样。 该芯片还提供了多个定时器/计数器和通道,例如TIM1、TIM2,以及TIM3和TIM4等,它们具有PWM输出、输入捕获和输出比较等功能。此外,该芯片还支持多种通信协议,如UART、SPI和I2C等,用于实现与其他设备的数据传输。 还有一些引脚用于特定的功能,例如BOOT0引脚,它用于选择芯片的启动模式。还有用于调试和编程的SWCLK和SWDIO引脚,它们用于连接调试器和IDE软件进行程序调试和下载。 综上所述,STM32F407VET6引脚分配图中包含了多个GPIO口、定时器/计数器、ADC输入口和通信接口等诸多功能,可以满足更多应用场景的需求。熟悉STM32F407VET6引脚分配图对于STM32F407VET6的设计和开发非常重要。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值