STM32之EXTI
STM32因?yàn)榫哂蠳VIC使其中斷體系大大提升,NVIC使用來管理異常與中斷的,并且NVIC模塊中還包含SysTick。
這次我們來講一下EXTI外部中斷。
1.在用到時(shí)我們必須要設(shè)置中斷向量表,我們要將中斷向量表存儲(chǔ)在一個(gè)固定的位置,究竟是RAM還是FLASH就得看你的需求了。
2.STM32中中斷優(yōu)先級(jí)分組總共有四種分組方式,我們只能用其中的一組。所以在設(shè)置完畢中斷向量表的存儲(chǔ)位置后我們就得選擇合適我們的中斷優(yōu)先級(jí)分組。(這一部分可以我的STM32之NVIC一文)
3.然后你要使用哪個(gè)外部中斷就對(duì)此中斷設(shè)置搶占優(yōu)先級(jí),亞優(yōu)先級(jí),以及打開。
4.然后就是相應(yīng)中斷的模式,方式,等配置了
5.設(shè)置相應(yīng)的引腳為輸入浮空
下面我們上兩個(gè)框圖看一下:
這里我們可以形象的看到STM32共有64個(gè)外部中斷,公用16個(gè)外部中斷通道,并與NVIC中斷分組里的16級(jí)對(duì)應(yīng)起來
通過這張圖我們可以清楚的看到中斷或者事件相應(yīng)的過程,如果有什么不清楚的請(qǐng)回復(fù)我會(huì)繼續(xù)補(bǔ)充
下面我們就把程序拿上來,供大家做參考(基于V3.3.0的庫)
-
/********************************************************************************
-
*@fileEXTI/main.c
-
*@authorswei
-
*@versionV3.3.0
-
*@date04/16/2010
-
*@briefMainprogrambody.
-
******************************************************************************/
-
#include"stm32f10x.h"
-
voidRCC_Configuration(void);//時(shí)鐘配置函數(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)//時(shí)鐘配置,如果不明白請(qǐng)看我的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)模塊的時(shí)鐘
-
}
-
voidNVIC_Configuration(void)
-
{
-
NVIC_InitTypeDefNVIC_InitStructure;
-
#ifdefVECT_TAB_RAM//條件編譯,對(duì)異常向量表進(jìn)行配置(放在RAM還是FLASH)
-
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
-
#else
-
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
-
#endif
-
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//選擇中斷優(yōu)先級(jí)分組,此處選擇0。使0級(jí)搶占式優(yōu)先級(jí),16級(jí)亞優(yōu)先級(jí)
-
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//相應(yīng)的通道配置,此處選擇中斷通道
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//搶占式優(yōu)先級(jí)配置
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//亞優(yōu)先級(jí)配置
-
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//時(shí)能通道
-
NVIC_Init(&NVIC_InitStructure);//使用結(jié)構(gòu)體完成配置
-
}
-
voidEXTI_Configuration(void)//相應(yīng)的中斷配置
-
{
-
EXTI_InitTypeDefEXTI_InitStructure;
-
EXTI_DeInit();//還原到默認(rèn)配置
-
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;//時(shí)能中斷
-
EXTI_Init(&EXTI_InitStructure);
-
}
-
voidGPIO_Configuration(void)//GPIO引腳的配置,如果不明白請(qǐng)看我的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****/