STM32的任何一个I/O端口都可以配置成中断触发端口,下面分硬件触发中断和软件触发中断配置。
硬件触发,选择PC13为线中断输入。
第一部:配置GPIO端口
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//打开PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_13; //选择第13引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化结构体
第二部:配置中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置PC13位线中断
EXTI_InitStructure.EXTI_Line = EXTI_Line13;//中断源为线中断13
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //下降沿触发中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //是能线中断
EXTI_Init(&EXTI_InitStructure); //初始化结构体
第三部:配置NVIC控制器
NVIC_InitTypeDef NVIC_InitStructure;//定义结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//先占优先级1位,从优先级3位
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//线中断中0-4单独,5-9公用,10-15公用
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
第三部:编写中断服务函数
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI15_10_LINE) != RESET) //确保是否产生了EXTI Line中断
{
EXTI_ClearITPendingBit(EXTI15_10LINE); //清除中断标志位
……
}
}
软件触发:在需要触发的时候调用EXTI_GenerateSWInterrupt(EXTI_Line13);//触发中断