您的位置:首页 > 其它

STM32学习之外部中断

2016-12-15 23:26 225 查看

STM32之中断的使用(EXTI NVIC)

外部中断/事件控制器由19 个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。

NVIC驱动有多种用途:例如使能或者失能IRQ中断,

使能或者失能单独的IRQ通道,改变IRQ通道的优先级等等。

EXTI结构体

typedef struct {
uint32_t EXTI_Line; // 中断/事件线
EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
FunctionalState EXTI_LineCmd; // EXTI 使能
} EXTI_InitTypeDef;


NVIC结构体

typedef struct {
uint8_t NVIC_IRQChannel; // 中断源
uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级
uint8_t NVIC_IRQChannelSubPriority; // 子优先级
FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能
} NVIC_InitTypeDef;


中断/事件线

EXTI 有20 个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0 至EXTI15,

还有另外七根用于特定的外设事件

中断/事件线 输入源

EXTI0 PX0(X 可为A,B,C,D,E,F,G,H,I)

EXTI1 PX1(X 可为A,B,C,D,E,F,G,H,I)

EXTI2 PX2(X 可为A,B,C,D,E,F,G,H,I)

EXTI3 PX3(X 可为A,B,C,D,E,F,G,H,I)

EXTI4 PX4(X 可为A,B,C,D,E,F,G,H,I)

EXTI5 PX5(X 可为A,B,C,D,E,F,G,H,I)

EXTI6 PX6(X 可为A,B,C,D,E,F,G,H,I)

EXTI7 PX7(X 可为A,B,C,D,E,F,G,H,I)

EXTI8 PX8(X 可为A,B,C,D,E,F,G,H,I)

EXTI9 PX9(X 可为A,B,C,D,E,F,G,H,I)

EXTI10 PX10(X 可为A,B,C,D,E,F,G,H,I)

EXTI11 PX11(X 可为A,B,C,D,E,F,G,H,I)

EXTI12 PX12(X 可为A,B,C,D,E,F,G,H,I)

EXTI13 PX13(X 可为A,B,C,D,E,F,G,H,I)

EXTI14 PX14(X 可为A,B,C,D,E,F,G,H,I)

EXTI15 PX15(X 可为A,B,C,D,E,F,G,H,I)

EXTI16 PVD 输出

EXTI17 RTC 闹钟事件

EXTI18 USB 唤醒事件

EXTI19 以太网唤醒事件(只适用互联型)

EXTI0 至EXTI15 用于GPIO,通过编程控制可以实现任意一个GPIO为EXTI 的输入

源。

代码过程:

extern "C"
void EXTI0_IRQHandler();
//设置中断函数
#define INT_GPIO    GPIOA                           //中断端口
#define INT_PIN     GPIO_Pin_0                      //端口引脚
#define INT_GPIO_RCC        RCC_APB2Periph_GPIOA    //端口时钟
#define INT_GPIO_AFIO       RCC_APB2Periph_AFIO     //复用AFIO
#define INT_NIVC_IRQCHANNEL     EXTI0_IRQn          //中断引脚所在线路
#define INT_EXIT_LINE   EXTI_Line0                  //中断线路

#define INT_EXTI_GPIOSOURCE GPIO_PortSourceGPIOA    //选择用作外部中断线源的GPIO端口
#define INT_EXTI_PINSOURCE  GPIO_PinSource0             //待设置的外部中断线路引脚
#define INTHandle EXTI0_IRQHandler                  //
NVIC_InitTypeDef NVIC_InitStructure;            //中断控制器
EXTI_InitTypeDef EXTI_InitStructure;            //外部中断事件
GPIO_InitTypeDef GPIO_InitStructure;            //引脚

void GPIOint::GPIOIntInit()
{
RCC_APB2PeriphClockCmd(INT_GPIO_AFIO | INT_GPIO_RCC, ENABLE);           //使能引脚时钟和复用时钟
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                         //配置优先级为组1
NVIC_InitStructure.NVIC_IRQChannel = INT_NIVC_IRQCHANNEL;               //选择GPIO所在引脚线路中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;               //主优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                      //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                         //允许中断
NVIC_Init(&NVIC_InitStructure);                                         //初始化中断控制器

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                   //浮空输入
GPIO_InitStructure.GPIO_Pin = INT_PIN;
GPIO_Init(INT_GPIO, &GPIO_InitStructure);                               //初始化GPIO

GPIO_EXTILineConfig(INT_EXTI_GPIOSOURCE, INT_EXTI_PINSOURCE);           //选择GPIO管脚用作外部中断线路
EXTI_InitStructure.EXTI_Line = INT_EXIT_LINE;                           //设置外部中断线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                     //设置为中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                  //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;                               //使能
EXTI_Init(&EXTI_InitStructure);                                         //初始化
}
void INTHandle()
{
if (EXTI_GetFlagStatus(INT_EXIT_LINE)==SET)                         //确保产生中断
{
GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);                    //亮led
EXTI_ClearFlag(INT_EXIT_LINE);                                  //清楚中断线路标志

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32