网站建设 国外,天猫网站做链接怎么做,网站在工信部备案,青岛高品质网站建设上回书说到定时器的级联#xff0c;今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。 什么是中断呢#xff1f;中断是指计算机在执行程序的过程中#xff0c;当出现某些异常情况或特殊事件#xff08;例如外部设备请求、定时时间到达、程序错误等… 上回书说到定时器的级联今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。 什么是中断呢中断是指计算机在执行程序的过程中当出现某些异常情况或特殊事件例如外部设备请求、定时时间到达、程序错误等时计算机暂停当前正在执行的程序转而去处理这些异常情况或特殊事件的机制。也就是只要你触发了中断只有等把中断的事件处理完了才能去运行其他的程序。stm32的中断非常强大每个外设都可以产生中断这里呢我就单纯的说说外部中断按键的方式如何去控制小灯的亮灭。也就是我们常说的独立按键怎么用。继续往下看。 EXTIExternal Interrupt/event controller) 是外部中断/事件控制器管理了控制器的20个中断/事件线。每个中断/事件线都对应一个边沿检测器可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置可以单独配置为中断或者事件以及触发事件的属性。 EXTI功能框图 中断/事件线 EXTI一共有20个中断/事件线。每个GPIO口都可以被设置成输入线占用EXTI0~EXTI15也就是PX0就对应着EXTI0一一对应。 我们先来看看程序首先是开启外部中断的时候我们需要用到两个时钟GPIOC端口对应外部中断的端口和AFIO端口EXTI所需要的端口。
void RCC_Configuration(void)
{/* 时钟开启 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
} 接下来配置GPIO口NVIC中断以及EXTI初始化。这里我使用的是GPIOC的line13作为它的外部中断对应单片机上的KEY2按键通过控制GPIOA上PIN3的LED3小灯来观测现象。 void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOC, GPIO_InitStructure);
}void EXIT_Configuration(void)
{EXTI_InitTypeDef EXTI_InitStructure;GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);EXTI_InitStructure.EXTI_Line EXTI_Line13;EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd ENABLE;EXTI_Init(EXTI_InitStructure);
}void NVIC_Configuration(void)
{ NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM , 0x0);
#else NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0);
#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority 0;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;NVIC_Init(NVIC_InitStructure);
} 配置是配置完了接下来就是中断函数。大家可以打开自己的启动文件来看看对应中断函数的命名0到4是每个都有自身的一个中断函数。5~9是共用中断EXTI9_5_IRQHandler(),10~15是共用一个中断函数EXTI15_10_IRQHandler。因为我用的是GPIOC的13引脚我使用的中断就是EXTI15_10_IRQHandler。这里要注意使用对应的GPIO口要用上GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);这个语句。否则无法看到对应的现象。接下来是中断程序。
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line13) ! RESET) {GPIO_WriteBit(GPIOA, GPIO_Pin_3,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3))));EXTI_ClearITPendingBit(EXTI_Line13); }} 大家看看现象吧应该是D3受到KEY2按键的控制。使灯发生亮灭的操作。 谈到中断这里就要考虑到中断优先级的问题有两个优先级的概念分别是抢占式优先级和响应优先级每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应即中断嵌套或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。当两个中断源的抢占式优先级相同时这两个中断将没有嵌套关系。当一个中断到来后如果正在处理另一个中断这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达则中断控制器根据它们的响应优先级高低来决定先处理哪一个如果它们的抢占式优先级和响应优先级都相等则根据它们在中断表中的排位顺序决定先处理哪一个。优先级是从0开始是最高的优先级优先级越大越低。大家可以结合串口通信设置EXTI0、EXTI1、EXTI2这三个外部中断来看看。 这里就不过多说了给个简单的代码中断配置和中断函数。请看代码。
void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 如果定义了 VECT_TAB_RAM 宏#ifdef VECT_TAB_RAM // 将中断向量表设置为位于 RAM 中并设置偏移量为 0NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); // 否则#else // 将中断向量表设置为位于 FLASH 中并设置偏移量为 0NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif// 设置中断优先级分组为 2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 配置 EXTI0 中断NVIC_InitStructure.NVIC_IRQChannel EXTI0_IRQn;// 设置抢占优先级为 2NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2;// 设置响应优先级为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority 0;// 使能该中断通道NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;// 初始化 EXTI0 中断NVIC_Init(NVIC_InitStructure);// 配置 EXTI1 中断NVIC_InitStructure.NVIC_IRQChannel EXTI1_IRQn;// 设置抢占优先级为 1NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;// 设置响应优先级为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority 0;// 使能该中断通道NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;// 初始化 EXTI1 中断NVIC_Init(NVIC_InitStructure);// 配置 EXTI2 中断NVIC_InitStructure.NVIC_IRQChannel EXTI2_IRQn;// 设置抢占优先级为 0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0;// 设置响应优先级为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority 0;// 使能该中断通道NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;// 初始化 EXTI2 中断NVIC_Init(NVIC_InitStructure);
} 中断函数
/*******************************************************************************
* Function Name : EXTI0_IRQHandler
* Description : This function handles External interrupt Line 0 request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void EXTI0_IRQHandler(void)
{printf(\r\nEXIT0 IRQHandler enter.\r\n);EXTI_GenerateSWInterrupt(EXTI_Line1);printf(\r\nEXIT0 IRQHandler return.\r\n);EXTI_ClearFlag(EXTI_Line0);
}/*******************************************************************************
* Function Name : EXTI1_IRQHandler
* Description : This function handles External interrupt Line 1 request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void EXTI1_IRQHandler(void)
{printf(\r\nEXIT1 IRQHandler enter.\r\n);EXTI_GenerateSWInterrupt(EXTI_Line2);printf(\r\nEXIT1 IRQHandler return.\r\n);EXTI_ClearFlag(EXTI_Line1);
}/*******************************************************************************
* Function Name : EXTI2_IRQHandler
* Description : This function handles External interrupt Line 2 request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void EXTI2_IRQHandler(void)
{printf(\r\nEXIT2 IRQHandler enter.\r\n);printf(\r\nEXIT2 IRQHandler return.\r\n);EXTI_ClearFlag(EXTI_Line2);
}好了今天就说这么多。 欲知后事如何且听下回分解。OVO......