1. 程式人生 > >STM32(暫存器)學習筆記——實驗五:外部中斷

STM32(暫存器)學習筆記——實驗五:外部中斷

儲備知識:

(1)STM32F103ZET6(CM3核心)共有256箇中斷,需要進行管理

首先,要對STM32進行分組,組0~4,同時要對每個中斷設定一個搶佔優先順序響應優先順序

(搶佔優先順序:是指打斷其它中斷的級別,高的搶佔優先順序可以打斷低的搶佔優先順序的工作

   相應優先順序:是指在搶佔屬性相同的情況下,當兩個中斷向量的搶佔優先順序相同時,

如果兩個中斷同時到達,則先處理響應優先順序高的中斷

其級別編號越小,表明它的優先級別越高

暫存器設定函式

MY_NVIC_INIT(搶佔,響應,EXIT外部中斷引腳口對應分組_IRQn,分組)

(2)設定外部中斷觸發條件

外部中斷觸發函式

Ex_NVIC_Config(GPIO_X,引腳口,觸發條件(暫存器))

RTIR:上升沿觸發

FTIR:下降沿觸發 (3)外部中斷函式

函式:void EXITx_IRQHandler(void)

引腳口為0,1,2,3,4時

外部中斷函式為

void EXIT0(1/2/3/4)_IRQHandler(void)

引腳口為5,6,7,8,9時

外部中斷函式為

void EXIT9_5_IRQHandler(void)

引腳口為10,11,12,13,14,15時

外部中斷函式為

void EXIT15_10_IRQHandler(void)

編寫程式

1、初始化I/O輸入。

GPIOA->CRL&=0XFFFFFFF0;	//PA0設定成輸入,預設下拉	  
GPIOA->CRL|=0X00000008; 
	  
GPIOE->CRL&=0XFFF00FFF;	//PE3/4設定成輸入	  
GPIOE->CRL|=0X00088000; 				   
GPIOE->ODR|=3<<3;	   	//PE3/4 上拉*/

2、開啟I/O口複用時鐘,設定I/O口與中短線的對映關係

3、初始化線上中斷,設定觸發條件

Ex_NVIC_Config(GPIO_A,0,RTIR); 	//上升沿觸發 Ex_NVIC_Config,4.設定中斷分組,並且使能中斷MY_NVIC_Init
Ex_NVIC_Config(GPIO_E,3,FTIR); 	//下降沿觸發5.設定中斷分組
Ex_NVIC_Config(GPIO_E,4,FTIR); 	//下降沿觸發

這個函式就完成了2,3步

 4、配置中斷分組(NVIC),並使能中斷

MY_NVIC_Init(2,3,EXTI0_IRQn,2);	//搶佔2,子優先順序3,組2  
MY_NVIC_Init(2,1,EXTI3_IRQn,2);	//搶佔2,子優先順序1,組2	   
MY_NVIC_Init(2,0,EXTI4_IRQn,2);	//搶佔2,子優先順序0,組2	   

  5、編寫中斷服務函式

void EXTI0_IRQHandler(void)//EXTI9_5_IRQHandler(void)
{
	delay_ms(10);	//消抖
	if(WK_UP==1)	//WK_UP按鍵
	{				 
		BEEP=!BEEP;	
	}		 
	EXTI->PR=1<<0;  //清除LINE0上的中斷標誌位  PR掛起暫存器,1表示外部中斷線上發生了選擇的邊沿事件。通過向該暫存器的對應位寫入 1 可以清除該位。
} 
//外部中斷3服務程式
void EXTI3_IRQHandler(void)
{
	delay_ms(10);	//消抖
	if(KEY1==0)	 	//按鍵KEY1
	{				 
		LED1=!LED1;
	}		 
	EXTI->PR=1<<3;  //清除LINE3上的中斷標誌位  
}
//外部中斷4服務程式
void EXTI4_IRQHandler(void)
{
	delay_ms(10);	//消抖
	if(KEY0==0)	 	//按鍵KEY0
	{
		LED0=!LED0;
		LED1=!LED1;
	}		 
	EXTI->PR=1<<4;  //清除LINE4上的中斷標誌位  
}		   

PR是EXIT結構體的暫存器,PR為1,清除中斷標誌位,PR為0