基礎知識
1、外部中斷/事件框架: STM32F407一共有16+7條中斷/事件線(如下圖),也就是說在STM32工作過程中同時支持22條外部中斷/事件。
從上圖也可以看出,所有的GPIO口都可以當作外部中斷/事件源。但是同時只能有16條位於不同的GPIO口上的中斷/事件源。
2、中斷/事件源配置: 選擇EXIT0-16中斷/事件線的中斷/事件源在相應的SYSCFG_EXTICRx寄存器裏配置。如配置EXIT0-3中斷/事件線的源寄存器爲下圖:
3、中斷與事件: 在這裏我們需要辨識以下中斷與事件的區別:
中斷是需要CPU參與的,需要軟件的中斷服務函數才能完成中斷後產生的結果;
事件是靠脈衝發生器產生一個脈衝,進而由硬件自動完成這個事件產生的結果,當然相應的聯動部件需要先設置好,比如引起DMA操作,AD轉換等;(參考)
4、更多關於STM32F407x外部中斷手冊與寄存器可下載(僅是外部中斷部分)
代碼設計
.c代碼
void mpuIntInit(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//開啓相關時鐘
RCC_AHB1PeriphClockCmd(MPU_EXIT_RCCPERIPH, ENABLE);
//GPIO設置-下拉輸入
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = MPU_EXIT_GPIO_PIN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;//大於等於50最好開啓IO補償
GPIO_Init(MPU_EXIT_GPIO, &GPIO_InitStruct);
//EXIT設置-中斷模式上升沿觸發
EXTI_InitStruct.EXTI_Line = MPU_EXTI_LINE;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
//NVIC設置-中斷配置
NVIC_InitStruct.NVIC_IRQChannel = MPU_EXIT_IT_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//最高
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
//中斷源配置-PA1
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
}
void MPU_EXIT_IT_HANDLER()
{
if(EXTI_GetITStatus(MPU_EXTI_LINE) == SET)
{
EXTI_ClearITPendingBit(MPU_EXTI_LINE);
printf("coming");
}
}
.h代碼
#define MPU_EXIT_GPIO GPIOA
#define MPU_EXIT_GPIO_PIN GPIO_Pin_1
#define MPU_EXIT_RCCPERIPH RCC_AHB1Periph_GPIOA
#define MPU_EXTI_LINE EXTI_Line1
#define MPU_EXIT_IT_IRQn EXTI1_IRQn
#define MPU_EXIT_IT_HANDLER EXTI1_IRQHandler
#define MPU_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA
#define MPU_EXTI_PIN_SOURSE EXTI_PinSource1
void mpuIntInit(void);
void MPU_EXIT_IT_HANDLER(void);
總結
一般配置外部中斷/事件一般步驟:
1、先配置對應GPIO的時鐘;
RCC_AHB1PeriphClockCmd
2、初始化配置GPIO(根據觸發方式設置上下拉模式);
GPIO_Init
3、初始化配置EXTI中斷線;
EXTI_Init
4、如需中斷則初始化配置NVIC
NVIC_Init
5、設置中斷線的中斷源
SYSCFG_EXTILineConfig