STM32外部中断(寄存器版本)

1 )初始化 IO 口为输入。

 

初始化你的按键输入口PA0,PA15,PC5。

2 )开启 IO 口复用时钟,设置 IO 口与中断线的映射关系

eg.PA0-15为EXTI0的外部中断输入源

3 )开启与该 IO 口相对的线上中断 / 事件,设置触发条件。

因为IO口设置的时候将PC5和PA15设置为了上拉输入,PA0为下拉输入,所以触发条件就是PC5和PA15当电位变化由高到低的时候(下降沿触发)触发中断,PA0则反之。

Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 三个参数分别为:GPIOA-G,需要使能的位,触发条件

RTIR:上升沿触发   FTIR:下降沿触发

其次,需要设置中断分组的问题

抢占优先级和响应优先级:

1.序号越小,优先级越高。

2.抢占优先级高的中断组可以打断抢占优先级低的中断组,但当两个抢占优先级同时到达的时候,会先执行响应优先级高的中断组,但当不是同时到达的时候,即使后来高的响应优先级到达的时候,也不可以打断当前的正在执行的较低的中断组,抢占优先级和响应优先级可以分为五组,每组都有16中分配方式。例如组2,抢占属性和响应属性,,抢占和响应即11:11,所以抢占和响应的选择都是四种(0-3).

STM32外部中断(寄存器版本)_第1张图片

 MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)

分别指的是:抢占优先级的数值,响应优先级的数值,io口对应的中断服务函数,组别。

 //设置触发条件
	Ex_NVIC_Config(GPIO_A,0,RTIR); 		//上升沿触发  wake_up 电位由低到高而触发输出变化  原本是下拉电阻
	Ex_NVIC_Config(GPIO_C,5,FTIR);		//下降沿触发  key0    电位由高到低而触发输出变化  原本是上拉电阻
	Ex_NVIC_Config(GPIO_A,15,FTIR);		//下降沿触发  key1	  电位由高到低而触发输出变化	 原本是上拉电阻
	//设置中断分组
	MY_NVIC_Init(2,2,EXTI0_IRQn,2);    	//抢占2,子优先级2,组2
	MY_NVIC_Init(2,1,EXTI9_5_IRQn,2);  	//抢占2,子优先级1,组2
	MY_NVIC_Init(2,0,EXTI15_10_IRQn,2);	//抢占2,子优先级0,组2 

exti.c(中断使用完后需要清除中断标志位)

//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
	delay_ms(10);	//消抖
	if(WK_UP==1)	//WK_UP按键 
	{
		LED0=!LED0;
		LED1=!LED1;	
	}		 
	EXTI->PR=1<<0;  //清除LINE0上的中断标志位  
}
//外部中断9~5服务程序
void EXTI9_5_IRQHandler(void)
{			
	delay_ms(10);   //消抖			 
    if(KEY0==0)		//按键0
	{
		LED0=!LED0;
	}
 	EXTI->PR=1<<5;     //清除LINE5上的中断标志位  
}
//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{			
	delay_ms(10);   //消抖			 
    if(KEY1==0)		//按键1
	{
		LED1=!LED1;
	}
 	EXTI->PR=1<<15; //清除LINE15上的中断标志位  
}
//外部中断初始化程序
//初始化PA0,PC5,PA15为中断输入.
void EXTI_Init(void)
{
	KEY_Init();
	Ex_NVIC_Config(GPIO_A,0,RTIR); 		//上升沿触发  wake_up 电位由低到高而触发输出变化  原本是下拉电阻
	Ex_NVIC_Config(GPIO_C,5,FTIR);		//下降沿触发  key0    电位由高到低而触发输出变化  原本是上拉电阻
	Ex_NVIC_Config(GPIO_A,15,FTIR);		//下降沿触发  key1	  电位由高到低而触发输出变化	 原本是上拉电阻

	MY_NVIC_Init(2,2,EXTI0_IRQn,2);    	//抢占2,子优先级2,组2
	MY_NVIC_Init(2,1,EXTI9_5_IRQn,2);  	//抢占2,子优先级1,组2
	MY_NVIC_Init(2,0,EXTI15_10_IRQn,2);	//抢占2,子优先级0,组2	   
}

int main()

int main(void)
{			
	Stm32_Clock_Init(9);//系统时钟设置
	delay_init(72);	    //延时初始化
	uart_init(72,9600); //串口初始化 
	LED_Init();		  	//初始化与LED连接的硬件接口
	EXTI_Init();		//外部中断初始化
	while(1)
	{	    
		printf("lalala\r\n");	
		delay_ms(1000);	  
	} 
}

你可能感兴趣的:(stm32,单片机,arm)