一、EXTI 中斷
PA0,PB0,......PG0 共用一個中斷标志 EXT0
PA1,PB1,......PG1 共用一個中斷标志 EXT1
...................................
...................................
PA15,PA15,......PG15 共用一個中斷标志 EXT15
疑問:官方庫函數有19條EXTI_Line,EXTI_Line0 -- EXTI_Line18,多出來的3條在哪裡?
祥見 EXTI_InitTypeDef.EXTI_Line 段落
二、在NVIC中:
EXTI0--EXTI4各自有獨立的IRQ_Channel,對應的中斷服務函數是 void EXTI(n)_IRQHandler(void),(n)=0--4。
EXTI5--EXTI9共用一個IRQ_Channel,對應的中斷服務函數是 void EXTI9_5_IRQHandler(void)。
EXTI10--EXTI15共用一個IRQ_Channel,對應的中斷服務函數是 void EXTI15_10_IRQHandler(void)。
三、如何啟用EXTI中斷
1 .啟動所需GPIOn_Pin及AFIO的RCC時鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,RCC_APB2Periph_AFIO,ENABLE);
!!!千萬别忘記啟動RCC_APB2Periph_AFIO!!!,否則管腳隻能做普通高低電平來用。
2 .用GPIO_InitStructure(用GPIO_InitTypeDef預先定義一下)設定所需GPIO口的Pin,Speed,Mode,
然後用GPIO_Init(GPIOn,&GPIO_InitStructure)來啟用這些GPIO的Pin。
3 .用GPIO的中斷線控制函數啟動指定GPIO的某個Pin
GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource7);
4 .初始化中斷,類似初始化GPIO
a)定義一個初始化的結構變量 EXTI_InitTypeDef EXTI_InitStructure;
!!!這步應該在函數外預先聲明名!!!
b)輸入該結構的成員值:EXTI_Line,EXTI_Mode,EXTI_Trigger,EXTI_LineCmd
c)用EXTI_Init(&EXTI_InitStructure);完成初始化
例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE );
GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource7);
EXTI_InitStructure.EXTI_Line = EXTI_Line7;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
四、可以用軟體模拟一個EXTI中斷的産生,指令如下:
EXTI_GenerateSWInterrupt(EXTI_Line7);//産生EXTI_Line7的中斷。
五、對應的中斷服務函數在 "stm32f10x_it.c" 中
六、需用的 ".c" 檔案有:
stm32f10x_rcc.c
stm32f10x_nvic.c
stm32f10x_gpio.c
stm32f10x_exti.c
stm32f10x_it.c