赞
踩
每个 GPIO 端口均有16个管脚,因此把每个端口的 16 个 IO 对应那 16 根中断线 EXTI0-EXTI15 .
比如:GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线EXTI0-EXTI15,这样一来每个中断线就对应了最多 7 个 IO 口,
比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
但是中断线每次只能连接一个在IO口上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的EXTIx[3:0]位来决定对应的中断线映射到哪个 GPIO 端口上,
启用或禁用高速 APB (APB2) 外设时钟。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
参数:
#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001)
NewState:ENABLE 或 DISABLE。
选择用作 EXTI 线的 GPIO 引脚。
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
参数:
GPIO_PortSource:选择用作 EXTI 线源的 GPIO 端口。此参数可以是 GPIO_PortSourceGPIOx
GPIO_PinSource:指定要配置的 EXTI 线。此参数可以是 GPIO_PinSourcex x->0~15
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
参数:
NVIC_PriorityGroup:指定优先级分组位长度。
此参数可以是以下值之一:
@arg NVIC_PriorityGroup_0:0 位用于抢占优先级,4 位用于子优先级
@arg NVIC_PriorityGroup_1:1 位用于抢占优先级,3 位用于子优先级
@arg NVIC_PriorityGroup_2:2 位用于抢占优先级,2 位用于子优先级
@arg NVIC_PriorityGroup_3:3 位用于抢占优先级,1 位用于子优先级
@arg NVIC_PriorityGroup_4:4 位用于抢占优先级,0 位表示子优先级
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
根据指定初始化 NVIC 外设
参数:
typedef struct
{
uint8_t NVIC_IRQChannel; /*指定要启用或禁用的 IRQ 通道*/
/*EXTI0_IRQn*/
uint8_t NVIC_IRQChannelPreemptionPriority; /*指定 IRQ 通道的抢占优先级在 NVIC_IRQChannel 中指定,0 和 15 之间*/
uint8_t NVIC_IRQChannelSubPriority; /*指定 IRQ 通道的子优先级*/
FunctionalState NVIC_IRQChannelCmd; /* ENABLE or DISABLE */
} NVIC_InitTypeDef;
根据指定初始化EXTI外设:
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
参数:
typedef struct
{
uint32_t EXTI_Line; /*指定要启用或禁用的EXTI行, 中断/事件线*/
/*EXTI_Line0*/
EXTIMode_TypeDef EXTI_Mode; /* 指定 EXTI 行的模式 */
EXTITrigger_TypeDef EXTI_Trigger; /*指定 EXTI 线的触发信号有效边沿。*/
FunctionalState EXTI_LineCmd; /* ENABLE 或 DISABLE*/
}EXTI_InitTypeDef;
EXTI 模式枚举:
typedef enum
{
EXTI_Mode_Interrupt = 0x00, //中断
EXTI_Mode_Event = 0x04 //事件
}EXTIMode_TypeDef;
EXTI 触发器枚举:
typedef enum
{
EXTI_Trigger_Rising = 0x08, //上升沿
EXTI_Trigger_Falling = 0x0C, //下降沿
EXTI_Trigger_Rising_Falling = 0x10 //上+下
}EXTITrigger_TypeDef;
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
void exitInit(){ NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //选择用作 EXTI 线的 GPIO 引脚。 A0 E3 E4 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ; EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line3|EXTI_Line4; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ; EXTI_Init(&EXTI_InitStructure); } void EXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0)==1) { DelayMs(10); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1) { LED(LED0,OFF); LED(LED1,OFF); } } EXTI_ClearITPendingBit(EXTI_Line0); } void EXTI3_IRQHandler (void){ if(EXTI_GetITStatus(EXTI_Line3)==1) { DelayMs(10); if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0) { LED(LED0,ON); } } EXTI_ClearITPendingBit(EXTI_Line3); } void EXTI4_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line4)==1) { DelayMs(10); if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0) { LED(LED1,ON); } } EXTI_ClearITPendingBit(EXTI_Line4); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。