stm32中斷學習總結


經過了兩天,終於差不多能看懂32的中斷了,由於是用的庫函數操作的,所以有些內部知識並沒有求甚解,只是理解知道是這樣的。但對於要做簡單開發的我來說這些已經夠了。

我學習喜歡從一個例程來看,下面的程序是我粘貼但是改編的,大部分都做了注釋。

主要是感謝這位博主的文章:http://www.cnblogs.com/chineseboy/archive/2013/03/14/2956782.html

其實主要步驟就是:

1、將GPIO口配置成中斷輸入模式。

void Init_LED(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義一個GPIO結構體變量

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG, ENABLE);
//使能各個端口時鍾,
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //板上LED編號 D2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //板上LED編號 D5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}

 

2、這個例程是做的按鍵,就是你要哪個地方產生中斷,然后將其所在的總線配置成中斷源,然后照貓畫虎,填寫中斷結構體成員,就是配置外部事件的模式、觸發條件、使能外部觸發,

但是別忘了打開復用功能(現在我還不理解)

void Init_TI_KEY(void)
{

EXTI_InitTypeDef EXTI_InitStructure; //定義一個EXTI結構體變量

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO復用功能,使用中斷功能重要!!!

/* 引腳選擇 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端口C的13引腳為中斷源 重要!! 板上標號INT2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端口E的0引腳為中斷源 重要!! 板上標號INT1


/* 設置外部中斷結構體的成員*/
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式為中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中斷線
EXTI_Init(&EXTI_InitStructure); //根據參數初始化中斷寄存器
}

 

3、現在就該配置中斷了。也即是配置中斷分組,以及中斷優先級。

不說了,直接上程序,看注釋。

void Init_NVIC(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

// #ifdef VECT_TAB_RAM //向量表基地址選擇

// NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //將0x20000000地址作為向量表基地址(RAM)
// #else

// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //將0x08000000地址作為向量表基地址(FLASH)
// #endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置中斷優先級分組2

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //設定中斷源為PC13
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //中斷占優先級為2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副優先級為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
NVIC_Init(&NVIC_InitStructure); //根據參數初始化中斷寄存器

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //設定中斷源為PE0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中斷占優先級為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副優先級為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
NVIC_Init(&NVIC_InitStructure); //根據參數初始化中斷寄存器
}

 

4、最后一步了,也是很重要的一步,配置中斷服務函數,也有叫什么入口函數的。說白了,就是你想讓你的這個中斷做什么。

/*************************************************************
注意,中斷服務程序雖然簡單,但是在寫入口函數的時候,注意函數名的寫法,只有如下3種命名方式。
(1)EXTI0_IRQHandler;EXTI Line 0
EXTI1_IRQHandler;EXTI Line 1
EXTI2_IRQHandler;EXTI Line 2
EXTI3_IRQHandler;EXTI Line 3
EXTI4_IRQHandler;EXTI Line 4
(2)
EXTI9_5_IRQHandler;EXTI Line 5-9
(3)
EXTI15_10_IRQHandler;EXTI Line 10-15

只要是中斷線5后的就不能像前四個那樣命名,他們有自己的方式。
************************************************************/
void EXTI15_10_IRQHandler(void) //pc13中斷服務程序,也是中斷子函數
{
//檢測按鍵之前一般有個消抖延時,直接調用下面的延時函數即可

if(EXTI_GetITStatus(EXTI_Line13)!= RESET) //判斷是否發生中斷,發生則中斷標志置1
{
// LED1=0;

// LED2=1;

GPIO_ResetBits(GPIOG, GPIO_Pin_14); //GPIOG設置為低電平,
GPIO_SetBits(GPIOD, GPIO_Pin_13); //GPIOD設置為高電平,其實這一部分也是可以寫在主函數中的,在while那個死循環中。

}

EXTI_ClearITPendingBit(EXTI_Line13); //利用庫函數清除中斷標志位,進入中斷服務程序之后。首先就是清除標志位,
} //否則他會不響應中斷,不進入中斷函數

 

 

好了,基本上就是這些了,希望對像我這樣的初學者有一定的幫助。終於可以說一句,其實32也不是很難。哈哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM