STM32之EXTI
STM32因為具有NVIC使其中斷體系大大提升,NVIC使用來管理異常與中斷的,并且NVIC模塊中還包含SysTick。
這次我們來講一下EXTI外部中斷。
1.在用到時我們必須要設(shè)置中斷向量表,我們要將中斷向量表存儲在一個固定的位置,究竟是RAM還是FLASH就得看你的需求了。
2.STM32中中斷優(yōu)先級分組總共有四種分組方式,我們只能用其中的一組。所以在設(shè)置完畢中斷向量表的存儲位置后我們就得選擇合適我們的中斷優(yōu)先級分組。(這一部分可以我的STM32之NVIC一文)
3.然后你要使用哪個外部中斷就對此中斷設(shè)置搶占優(yōu)先級,亞優(yōu)先級,以及打開。
4.然后就是相應(yīng)中斷的模式,方式,等配置了
5.設(shè)置相應(yīng)的引腳為輸入浮空
下面我們上兩個框圖看一下:
這里我們可以形象的看到STM32共有64個外部中斷,公用16個外部中斷通道,并與NVIC中斷分組里的16級對應(yīng)起來
通過這張圖我們可以清楚的看到中斷或者事件相應(yīng)的過程,如果有什么不清楚的請回復(fù)我會繼續(xù)補充
下面我們就把程序拿上來,供大家做參考(基于V3.3.0的庫)
-
/********************************************************************************
-
*@fileEXTI/main.c
-
*@authorswei
-
*@versionV3.3.0
-
*@date04/16/2010
-
*@briefMainprogrambody.
-
******************************************************************************/
-
#include"stm32f10x.h"
-
voidRCC_Configuration(void);//時鐘配置函數(shù)
-
voidNVIC_Configuration(void);//NVIC配置函數(shù)
-
voidEXTI_Configuration(void);//外部中斷配置函數(shù)
-
voidGPIO_Configuration(void);//GPIO配置函數(shù)
-
intmain(void)
-
{
-
RCC_Configuration();
-
NVIC_Configuration();
-
GPIO_Configuration();
-
EXTI_Configuration();
-
while(1)
-
{
-
-
}
-
}
-
voidRCC_Configuration(void)//時鐘配置,如果不明白請看我的STM32之RCC一文
-
{
-
RCC_DeInit();
-
RCC_HSEConfig(RCC_HSE_ON);
-
while(!RCC_WaitForHSEStartUp());
-
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
-
FLASH_SetLatency(FLASH_Latency_2);
-
RCC_HCLKConfig(RCC_SYSCLK_Div1);
-
RCC_PCLK2Config(RCC_HCLK_Div1);
-
RCC_PCLK1Config(RCC_HCLK_Div2);
-
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
-
RCC_PLLCmd(ENABLE);
-
while(!(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==SET));
-
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
-
while(!(RCC_GetSYSCLKSource()==0x08));
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//打開相應(yīng)模塊的時鐘
-
}
-
voidNVIC_Configuration(void)
-
{
-
NVIC_InitTypeDefNVIC_InitStructure;
-
#ifdefVECT_TAB_RAM//條件編譯,對異常向量表進行配置(放在RAM還是FLASH)
-
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
-
#else
-
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
-
#endif
-
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//選擇中斷優(yōu)先級分組,此處選擇0。使0級搶占式優(yōu)先級,16級亞優(yōu)先級
-
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//相應(yīng)的通道配置,此處選擇中斷通道
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//搶占式優(yōu)先級配置
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//亞優(yōu)先級配置
-
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//時能通道
-
NVIC_Init(&NVIC_InitStructure);//使用結(jié)構(gòu)體完成配置
-
}
-
voidEXTI_Configuration(void)//相應(yīng)的中斷配置
-
{
-
EXTI_InitTypeDefEXTI_InitStructure;
-
EXTI_DeInit();//還原到默認配置
-
EXTI_InitStructure.EXTI_Line=EXTI_Line15;//選擇中斷線
-
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//選擇中斷模式
-
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//選擇中斷方式
-
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//時能中斷
-
EXTI_Init(&EXTI_InitStructure);
-
}
-
voidGPIO_Configuration(void)//GPIO引腳的配置,如果不明白請看我的STM32之GPIO一文
-
{
-
GPIO_InitTypeDefGPIO_InitStructure;
-
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
-
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
-
GPIO_Init(GPIOB,&GPIO_InitStructure);
-
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
-
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
-
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
-
GPIO_Init(GPIOA,&GPIO_InitStructure);
-
}
-
/*******************(C)COPYRIGHT2010SWEI********************ENDOFFILE****/