STM32F103ZET6 支持 20 个外部中断输入(EXIT0~EXIT19),其中有4个:
EXTI线16连接到PVD输出
EXTI线17连接到RTC闹钟事件
EXTI线18连接到USB唤醒事件
EXTI线19连接到以太网唤醒事件(只适用于互联型产品)
另外的16个均可以作为外部输入中断,其中:
EXIT0~EXIT4 有独立的中断向量
EXIT6~EXIT9 共享一个中断向量 EXTI9_5_IRQHandler
EXIT10~EXIT16 共享一个中断向量 EXTI15_10_IRQHandler
共享的中断向量需要在对应的 ISR 中通过读取 Pending 的标志位来判断到底是哪个信号上触发的中断
单板上,PE5/PE6 引脚通过通过上拉电阻连接到 Key1 和 Key2 上,Key1 和 Key2 的另一端连接 GND。
初始化配置 PE5/PE6 成为外部中断的流程如下:
1. 开启 AFIO 和 GPIO 的时钟
2. 配置 GPIO PE5/PE6 为上拉输入
3. 通过 AFIO 的 EXITCR 寄存器组配置 PE5/PE6 为外部 EXIT 中断的输入引脚
4. 配置 EXIT 寄存器,使能 PE5/PE6 的中断
5. 由于按下 Key 后,电平为低,故配置为下降沿产生中断
void SK_EXITInit(void)
{
GPIO_InitTypeDef stGpioInit;
EXTI_InitTypeDef stEXTIInit;
/// Step 1 : Power On the AFIO and GPIOE
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
/// Step 2 : Config the NVIC
SK_SK_EXITNVICConfig();
/// Step 3 : Config (PE5/PE6) As pull up input
stGpioInit.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
stGpioInit.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOE, &stGpioInit);
/// Step 4 : Select the output interrupt source
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource6);
/// Step 5 : Select the output interrupt source
stEXTIInit.EXTI_Line = EXTI_Line5 | EXTI_Line6;
stEXTIInit.EXTI_Mode = EXTI_Mode_Interrupt;
stEXTIInit.EXTI_Trigger = EXTI_Trigger_Falling;
stEXTIInit.EXTI_LineCmd = ENABLE;
EXTI_Init(&stEXTIInit);
}
由于 EXIT5~EXIT9 共享一个中断向量,故需要在中断中判断 Pending 标志位,便可知是哪个中断线上引起的中断:
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line5);
SK_SetLedStatus(SK_LED_1, SK_LED_ON);
delay_ms(5000);
SK_SetLedStatus(SK_LED_1, SK_LED_OFF);
}
if(EXTI_GetITStatus(EXTI_Line6) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line6);
SK_SetLedStatus(SK_LED_2, SK_LED_ON);
delay_ms(5000);
SK_SetLedStatus(SK_LED_2, SK_LED_OFF);
}
}
上一篇:STM32F103ZET6 — ADC
下一篇:STM32F103ZET6 — USART
推荐阅读最新更新时间:2024-03-16 16:11