STM32 GPIO 中断 标准库

本文详细描述了如何在嵌入式系统中使用中断控制器NVIC和EXTI接口,配置GPIO线以及处理EXTI0,EXTI2,EXTI3和EXTI4中断,涉及中断优先级设置、EXTI初始化和中断服务函数的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "interrupt.h"

extern int select_time;

void interrupt(void){
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
	

//	SYSCFG_EXTICR2(2)=1;
	
	SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOA, EXTI_PinSource0);
	SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOE, EXTI_PinSource2);
	SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOE, EXTI_PinSource3);
	SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOE, EXTI_PinSource4);
	
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line2|EXTI_Line3|EXTI_Line4;
	EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
	EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_LineCmd=ENABLE;
	
	EXTI_Init(&EXTI_InitStruct);

	
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=  EXTI0_IRQn  ;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=5;
	NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
	
	NVIC_Init(&NVIC_InitStruct);
	
	NVIC_InitStruct.NVIC_IRQChannel=  EXTI2_IRQn  ;
	NVIC_Init(&NVIC_InitStruct);
	
	
	NVIC_InitStruct.NVIC_IRQChannel=  EXTI3_IRQn;
	NVIC_Init(&NVIC_InitStruct);
	
	NVIC_InitStruct.NVIC_IRQChannel=  EXTI4_IRQn;
	NVIC_Init(&NVIC_InitStruct);
	
}



 void EXTI0_IRQHandler(){
	 

	 if(EXTI_PR(0)==1){
		delay_us(5000);
//		PF_ODR(9)=!PF_ODR(9);
		PF_ODR(8)=0;
		EXTI_PR(0)=1;
	
	 }	
	 
	 extern int flag;
	 flag=flag-1;
	 if(flag<0){
	 flag=0;
	 }

}
 
void EXTI2_IRQHandler(){
	 if(EXTI_PR(2)==1){
		delay_us(5000);
//		PF_ODR(10)=!PF_ODR(10);
		select_time++;
		EXTI_PR(2)=1;
	 }	
	 
}

void EXTI3_IRQHandler(){
	 if(EXTI_PR(3)==1){
		delay_us(5000);
//		PE_ODR(13)=!PE_ODR(13);
		 extern RTC_TimeTypeDef RTC_AlarmTime;
		 switch (select_time){
				case 0: RTC_AlarmTime.RTC_Seconds++; if(RTC_AlarmTime.RTC_Seconds>=60){RTC_AlarmTime.RTC_Seconds=0;}  break;
				case 1: RTC_AlarmTime.RTC_Minutes++; if(RTC_AlarmTime.RTC_Minutes>=60){RTC_AlarmTime.RTC_Minutes=0;} break;
				case 2: RTC_AlarmTime.RTC_Hours++;   if(RTC_AlarmTime.RTC_Hours>=24){RTC_AlarmTime.RTC_Hours=0;} break;
				case 3: select_time=0;
			}
		EXTI_PR(3)=1;
	 }	
}

void EXTI4_IRQHandler(){
	 if(EXTI_PR(4)==1){
		delay_us(5000);
//		PE_ODR(14)=!PE_ODR(14);
		EXTI_PR(4)=1;
	 }	
}



























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值