STM32 外部中断_ 外部中断和事件 | |
GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3); //PD3作为外部中断引脚 /** * @brief Selects the GPIO pin used as EXTI Line. * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). * @param GPIO_PinSource: specifies the EXTI line to be configured. * This parameter can be GPIO_PinSourcex where x can be (0..15). * @retval None */ void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 2.中断初始化 EXTI_InitTypeDef EXTI_InitStructure; // Configure EXTI Line9 to generate an interrupt on falling edge EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4); // Configure EXTI Line9 to generate an interrupt on falling edge EXTI_InitStructure.EXTI_Line = EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 3.在NVIC_Configuration 中Configures the NVIC and Vector Table base address. /* Configure the Priority Group to 2 bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* enabling interrupt */ NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable the EXTI3 Interrupt on PD.3 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable the EXTI4 Interrupt on PD.4 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 4.在stm32f0x_it.c 中写入 中断处理函数 /******************************************************************************* * Function Name : EXTI3_IRQHandler * Description : This function handles External interrupt Line 3 request. * Input : None * Output : None * Return : None *******************************************************************************/ void EXTI3_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line3) != RESET) { // Led_RW_ON(); GPIO_SetBits(GPIOC, GPIO_Pin_4| GPIO_Pin_5 ); /* Clear the EXTI line 9 pending bit */ EXTI_ClearITPendingBit(EXTI_Line3); } } /******************************************************************************* * Function Name : EXTI4_IRQHandler * Description : This function handles External interrupt Line 4 request. * Input : None * Output : None * Return : None *******************************************************************************/ void EXTI4_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line4) != RESET) { //Led_RW_OFF(); GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5); /* Clear the EXTI line 9 pending bit */ EXTI_ClearITPendingBit(EXTI_Line4); } } ===================================================== STM32的“外部中断”和“事件”怎么理解? 事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断。 事件还是其它一些操作的触发源,比如DMA,还有TIM中影子寄存器的传递与更新;而中断是不能触发这些操作的,所以要把事件与中断区分开。 参考下图:当你只要产生中断而不想触发其它操作时,就可以用事件屏蔽寄存器实现。
STM32 中外部中断与外部事件 外部中断 ,
外部事件 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志 19 字样的注释,表示这样 的线路共有 19 套。 图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号 1 的芯片管脚进入,经过编号 2 的边沿 检测电路,通过编号 3 的或门进入中断 “ 挂起请求寄存器 ” ,最后经过编号 4 的与门输出到 NVIC 中断控制器;在这个通道上 有 4 个控制选项,外部的信号首先经过边沿检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以 使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受 2 个平行的寄存器控制,所以用户 可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 接下来是编号 3 的或门,这个或门的另一个输入是 “ 软件中断 / 事件寄存器 ” ,从这里可以看出,软件可以优先于外部 信号请求一个中断或事件,既当 “ 软件中断 / 事件寄存器 ” 的对应位为 “1” 时,不管外部信号如何,编号 3 的或门都会输出有 效信号。 一个中断或事件请求信号经过编号 3 的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是 一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。 外部请求信号最后经过编号 4 的与门,向 NVIC 中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为 “0” , 则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。 明白了外部中断的请求机制,就很容易理解事件的请求机制了。图中红色虚线箭头,标出了外部事件信号的传输路 径,外部请求信号经过编号 3 的或门后,进入编号 5 的与门,这个与门的作用与编号 4 的与门类似,用于引入事件屏蔽寄 存器的控制;最后脉冲发生器把一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块。 在这张图上我们也可以知道,从外部激励信号来看,中断和事件是没有分别的,只是在芯片内部分开,一路信号会 向 CPU 产生中断请求,另一路信号会向其它功能模块发送脉冲触发信号,其它功能模块如何相应这个触发信号,则由对 应的模块自己决定。 在图上部的 APB 总线和外设模块接口,是每一个功能模块都有的部分, CPU 通过这样的接口访问各个功能模块,这 里就不再赘述了。 -------------------------------------------------------- 总结 : (1) 事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断。 (2) 事件还是其它一些操作的触发源,比如 DMA, ADC ,还有 TIM 中影子寄存器的传递与更新;而中断是不能触发 这些操作的,所以要把事件与中断区分开。 (3) 在 STM32 中,中断与事件不是等价的,一个中断肯定对应一个事件,但一个事件不一定对应一个中断 |
共1条
1/1 1 跳转至页
STM32中外部中断与外部事件
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |