这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STM32中外部中断与外部事件

共1条 1/1 1 跳转至

STM32中外部中断与外部事件

助工
2014-09-16 20:11:47     打赏
STM32 外部中断_ 外部中断和事件
  
1.GPIO 的正确设置
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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]