目录
1、中断向量表配置
2、中断引脚配置
3、中断处理函数
EXTI0 至 EXTI15 用于 GPIO,通过编程控制可以实现任意一个 GPIO作为 EXTI的输入源。由表 18-1 可知, EXTI0 可以通过 AFIO 的外部中断配置寄存器 1(AFIO_EXTICR1)的EXTI0[3:0]位选择配置为 PA0、 PB0、 PC0、 PD0、 PE0、 PF0、 PG0、 PH0 或者 PI0。
XTI9_5_IRQn即5-9线都连接到一个中断源上去了,那么可以有多个外部中断共同使用这个中断源,多个外部中断占用一个中断源的。可以同时配置中断,且中断触发方式不同。只不过他们发生中断进入的是同一个中断函数,需要在函数里面判断是哪个中断。至于他们是那种边缘中断,各设置各的。
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line7) != RESET)
{
}
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line9);
}
}
中断/事件线 | 输入源 |
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 | 以太网唤醒事件(只适用互联型) |
使用GPIOC,PIN5,中断EXTI9_5_IRQn
/**
* @brief 配置嵌套向量中断控制器NVIC
* @param 无
* @retval 无
*/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置NVIC为优先级组1 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中断源:按键1 */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
/* 配置抢占优先级 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 配置子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
1、浮空输入;2、输入中断模式;3、信号源的选择;4、上升沿下降沿进入中断
/**
* @brief 配置 IO为EXTI中断口,并设置中断优先级
* @param 无
* @retval 无
*/
void EXTI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*开启按键GPIO口的时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
/* 配置 NVIC 中断*/
NVIC_Configuration();
/*--------------------------配置引脚-----------------------------*/
/* 选择按键用到的GPIO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
/* 配置为浮空输入 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
//GPIO_Initstructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( GPIOC, &GPIO_InitStructure);
/* -------------选择EXTI的信号源 -------------*/
GPIO_EXTILineConfig( GPIO_PortSourceGPIOC, GPIO_PinSource5);
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//EXTI_Trigger_Rising;//EXTI_Trigger_Rising_Falling
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
中断函数在哪里都没问题????? 我一般卸载stm32f10x_it.c
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(INT_EXTI_LINE) != RESET)
{
if(GPIO_ReadInputDataBit(INT_GPIO_PORT, INT_GPIO_PIN) )
{
GPIO_ResetBits(OUT7_GPIO_PORT, OUT7_GPIO_PIN);
}
else
{
GPIO_SetBits(OUT7_GPIO_PORT, OUT7_GPIO_PIN);
}
EXTI_ClearITPendingBit(INT_EXTI_LINE);
}
}