STM32外部中断学习

本人最近课程设计学习STM32F4系列,在此进行学习记录!完整代码在最后!

一、Keil5的安装配置

Keil5的安装配置在此不在赘述,并且需要添加F4系列的包(PACK)。

二、基本知识

1、GPIO

本次实验是通过外部中断对led灯进行操作,首先我们需要找到对应的led灯(点亮第一个led灯程序),如下图我们可以找到对应的IO口。
在这里插入图片描述
找到对应的IO口后,即应该对其进行初始化操作。
在这里插入图片描述
我们即需要在代码中对GPIO口进行初始化,发现该初始化函数需要两个参数,分别是GPIO口与其的结构体,所以我们还需要对该结构体进行初始化。
另外的需要配置时钟线给予对用的GPIO口时钟,见下图找到是AHB1。
在这里插入图片描述
见代码led_config(void)函数。

2、EXTI

3、NVIC

三、代码

最终实现了简单的程序,通过按键按下,亮的led灯熄灭。

#include <stdio.h>
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_syscfg.h"
#include "misc.h"


/*//延时函数
static void Delay_ARMJISHU(__IO uint32_t nCount)
{
  for (; nCount != 0; nCount--)
  {
  }
}
*/
//led灯GPIO初始化配置
void led_config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;//定义GPIO初始化结构体
	
	//对GPIO口的结构体参数进行配置
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;//引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//模式
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;

	//查找核心板找到对应时钟线,并给予时钟信号
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	
	//最终编写GPIO口的初始化函数
	GPIO_Init(GPIOF,&GPIO_InitStruct);

}

//蜂鸣器初始化,其实蜂鸣器的初始化配置也是同led灯一样,都是找到对应的GPIO口
void bee_config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz ;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	GPIO_Init(GPIOF,&GPIO_InitStruct);
}

//按键初始化配置
//在该函数中对三者进行了初始化配置——EXTI,GPIO,NVIC
void key_init()
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	
	//外部中断结构体初始化
	EXTI_InitTypeDef EXTI_InitStruct; 
	
	//中断向量管理模块NVIC初始化
	NVIC_InitTypeDef NVIC_InitStruct;
	
	
	//给予时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);  //同样是查找对应的时钟信号线
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); 
	
	
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	
	GPIO_Init(GPIOA,&GPIO_InitStruct); 
	
	//对于外部中断,在GPIO口还需要对其进行映射,即需要添加该函数
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);


	//外部中断初始化结构体赋值
	EXTI_InitStruct.EXTI_Line = EXTI_Line0;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	
	EXTI_Init(&EXTI_InitStruct);
	
	//NVIC初始化结构体赋值
	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0xf;//对主副优先级进行设定,其中与NVIC的分组结果有关,即main函数中的NVIC配置有关
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0xf;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
	NVIC_Init(&NVIC_InitStruct);	
}
int main()
{
	bee_config();
	led_config();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//NVIC分组
	key_init();
	
	while(1)
	{
		//Delay_ARMJISHU(0xFFFFFF);
		//GPIO_ResetBits(GPIOF,GPIO_Pin_10);
		
		//Delay_ARMJISHU(0xFFFFFF);
		//GPIO_SetBits(GPIOF,GPIO_Pin_10);
	
	}
}
//中断响应函数
void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0) != RESET )//中断发生标志
	{
		GPIO_SetBits(GPIOF,GPIO_Pin_10);//对GPIO口进行置位
		EXTI_ClearITPendingBit(EXTI_Line0);  //中断标志清零
	}
}


发布了27 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42192910/article/details/88037649