目錄
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 | 以太網喚醒事件(只適用互聯型) |
1、中斷向量表配置
使用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);
}
2、中斷引腳配置
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);
}
3、中斷處理函數
中斷函數在哪裏都沒問題????? 我一般卸載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);
}
}