STM32因为具有NVIC使其中断体系大大提升,NVIC使用来管理异常与中断的,并且NVIC模块中还包含SysTick。
这次我们来讲一下EXTI外部中断。
1.在用到时我们必须要设置中断向量表,我们要将中断向量表存储在一个固定的位置,究竟是RAM还是FLASH就得看你的需求了。
2.STM32中中断优先级分组总共有四种分组方式,我们只能用其中的一组。所以在设置完毕中断向量表的存储位置后我们就得选择合适我们的中断优先级分组。(这一部分可以我的STM32之NVIC一文)
3.然后你要使用哪个外部中断就对此中断设置抢占优先级,亚优先级,以及打开。
4.然后就是相应中断的模式,方式,等配置了
5.设置相应的引脚为输入浮空
下面我们上两个框图看一下:
这里我们可以形象的看到STM32共有64个外部中断,公用16个外部中断通道,并与NVIC中断分组里的16级对应起来
通过这张图我们可以清楚的看到中断或者事件相应的过程,如果有什么不清楚的请回复我会继续补充
下面我们就把程序拿上来,供大家做参考(基于V3.3.0的库)
/********************************************************************************
* @file EXTI/main.c
* @author swei
* @version V3.3.0
* @date 04/16/2010
* @brief Main program body.
******************************************************************************/
#include "stm32f10x.h"
void RCC_Configuration(void); //时钟配置函数
void NVIC_Configuration(void); //NVIC配置函数
void EXTI_Configuration(void); //外部中断配置函数
void GPIO_Configuration(void); //GPIO配置函数
int main(void)
{
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
EXTI_Configuration();
while(1)
{
}
}
void RCC_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);//打开相应模块的时钟
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_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); //使用结构体完成配置
}
void EXTI_Configuration(void) //相应的中断配置
{
EXTI_InitTypeDef EXTI_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);
}
void GPIO_Configuration(void) //GPIO引脚的配置,如果不明白请看我的STM32之GPIO一文
{
GPIO_InitTypeDef GPIO_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) COPYRIGHT 2010 SWEI ********************END OF FILE****/
上一篇:STM32 温度传感器 探究
下一篇:STM32之用SysTick做准确定时
推荐阅读最新更新时间:2024-03-16 15:47