STM32之EXTI
扫描二维码
随时随地手机看文章
STM32因为具有NVIC使其中断体系大大提升,NVIC使用来管理异常与中断的,并且NVIC模块中还包含SysTick。
这次我们来讲一下EXTI外部中断。
1.在用到时我们必须要设置中断向量表,我们要将中断向量表存储在一个固定的位置,究竟是RAM还是FLASH就得看你的需求了。
2.STM32中中断优先级分组总共有四种分组方式,我们只能用其中的一组。所以在设置完毕中断向量表的存储位置后我们就得选择合适我们的中断优先级分组。(这一部分可以我的STM32之NVIC一文)
3.然后你要使用哪个外部中断就对此中断设置抢占优先级,亚优先级,以及打开。
4.然后就是相应中断的模式,方式,等配置了
5.设置相应的引脚为输入浮空
下面我们上两个框图看一下:
这里我们可以形象的看到STM32共有64个外部中断,公用16个外部中断通道,并与NVIC中断分组里的16级对应起来
通过这张图我们可以清楚的看到中断或者事件相应的过程,如果有什么不清楚的请回复我会继续补充
下面我们就把程序拿上来,供大家做参考(基于V3.3.0的库)
-
/********************************************************************************
-
*@fileEXTI/main.c
-
*@authorswei
-
*@versionV3.3.0
-
*@date04/16/2010
-
*@briefMainprogrambody.
-
******************************************************************************/
-
#include"stm32f10x.h"
-
voidRCC_Configuration(void);//时钟配置函数
-
voidNVIC_Configuration(void);//NVIC配置函数
-
voidEXTI_Configuration(void);//外部中断配置函数
-
voidGPIO_Configuration(void);//GPIO配置函数
-
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);//打开相应模块的时钟
-
}
-
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);//选择中断优先级分组,此处选择0。使0级抢占式优先级,16级亚优先级
-
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//相应的通道配置,此处选择中断通道
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占式优先级配置
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//亚优先级配置
-
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//时能通道
-
NVIC_Init(&NVIC_InitStructure);//使用结构体完成配置
-
}
-
voidEXTI_Configuration(void)//相应的中断配置
-
{
-
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****/