STM32关于外部中断的学习笔记

#include"stm32f10x.h"
#include “exti.h”

#define My_GPIO_Pin  GPIO_Pin_5
#define My_GPIO_Port GPIOA
#define My_Exti_Pin  GPIO_Pin_13
#define My_Exti_pin_Port   GPIOC
#define My_Pin_Source  GPIO_PinSource13
#define My_Port_source GPIO_PortSourceGPIOC
#define My_Exti_Line  EXTI_Line13
#define My_IRQ    EXTI15_10_IRQn 

//宏定义这么多的端口看起来没有必要,但在之后的学习中方便拿来就改

void My_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitTypeDef ExtiPin_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;	//定义需要配置的初始化结构体,其中有NVIC,EXIT,GPIO
	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC,ENABLE);//打开AFIO与GPIO的时钟
	
//GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = My_GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(My_GPIO_Port, &GPIO_InitStructure);      
//对中断所需的GPIO进行初始化,这里用到的是PC13作为按键检测,按下低电平
//PA5作为点亮LED的GPIO,高电平有效	

//GPIO_StructInit(&ExtiPin_InitStructure);
ExtiPin_InitStructure.GPIO_Pin = My_Exti_Pin ;
ExtiPin_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(My_Exti_pin_Port, &ExtiPin_InitStructure);
	
	
	

GPIO_EXTILineConfig(My_Port_source ,My_Pin_Source);
EXTI_InitStructure.EXTI_Line = My_Exti_Line ; 
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;          //这句代码的意思是选择触发的是事件还是中断,这里应是中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 	//下降沿触发有效
EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //打开EXIT的开关
EXTI_Init(&EXTI_InitStructure);	


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);             //NVIC的中断优先级分组配对
NVIC_InitStructure.NVIC_IRQChannel = My_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;          //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //具体的NVIC与EXTI为啥要这么配置可以参考其他详细资料
NVIC_Init(&NVIC_InitStructure);	
	
	
}
void EXTI15_10_IRQHandler(void)//中断服务函数
{
	if(EXTI_GetFlagStatus(EXTI_Line13)!=RESET)            //这个函数是判断程序是否发生了中断,有点鸡肋,不过是起保险作用。
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_5);
	}
	else{
		
	}
	EXTI_ClearITPendingBit(EXTI_Line13);               //这个函数的作用是清除中断挂起标志位,在执行中断服务函数后如果不进行清除,
	                                                   //会发生一出中断程序,就会又开启中断的尴尬情况。
}

/*学习笔记
中断的概念在51中就有过,不过在32中它功能更加强大,种类也更多,相应的需要配置的寄存器也会更多,这里配置的只是外部中断一种,
总结一下配置它的流程,1.首先需要将所需的GPIO进行设置,用来检测外部信号,具体的寄存器和功能在手册里有,
2.其次需要配置EXTI,我个人把EXTI理解成,中断信号从GPIO通往cpu的内部外设时经过的线路,在这条线路上有很多寄存器
需要配置,需要注意的是中断挂起位,检测到中断来临就会置一。至于对应的EXTI线路与GPIO的对应关系在手册中有详尽说明。
3.最后的NVIC也很重要,这是需要配置寄存器的最后一部分,主要的是终端优先级分组,抢占优先级与子优先级的定义。

最后要说的是时钟很重要,要开启AFIO复用端口时钟,开启各个GPIO的时钟。

*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值