微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 EXIT

STM32 EXIT

时间:11-11 来源:互联网 点击:

这张图是一条外部中断线或外部事件线的示意图,途中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套,途中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输入到NVIC中断控制器,在这个通道上游4个控制选项,外部的信号收件经过边沿检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或是下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了,接下来是编号3的或门,这个或门的另一个输入时“软件中断/事件寄存器”,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当“软件中断/事件寄存器”的对应位为1时,不管外部信号如何,编号3的或门都会输出有效信号。

一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化,外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽

途中的红色箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的郁闷,这个与门的作用于编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器把一个跳变的信号转变位一个单脉冲,输出到芯片中的其他功能,

从这张图中可以看出,从外部激励信号来看,中断和事件是没有分别的,只是在芯片内部分开,一路信号会向CPU产生中断请求,另一路信号会向其他功能模块发送脉冲触发信号,其他功能模块如何响应这个信号,则由对应的模块自己决定。

在图上部的APB总线和外设模块接口,是每一个功能模块都有的部分

总结:

中断请求:当产生中断的时候,会执行对应的中断处理程序

事件请求:当产生事件的时候,会想向其他模块发送触发信号,对于其他模块如何处理这个信号,则由模块自己决定!

#include"exti.h"

voidEXTI_Config(void)
{
EXTI_GPIO_Config();
EXTI_InitStructure();

}

voidEXTI_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

NVIC_Exti();

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输
GPIO_Init(GPIOE,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}

voidEXTI_InitStructure(void)
{
EXTI_InitTypeDefEXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}

voidNVIC_Exti(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
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);
}

/*********************************************************************************
*********************************************************************************/
#include"exti.h"

/*
*函数名:NVIC_Configuration
*描述:配置嵌套向量中断控制器NVIC
*输入:无
*输出:无
*调用:内部调用
*/
staticvoidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;

/*Configureonebitforpreemptionpriority*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/*配置P[A|B|C|D|E]0为中断源*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

/*
*函数名:EXTI_PB0_Config
*描述:配置PB0为线中断口,并设置中断优先级
*输入:无
*输出:无
*调用:外部调用
*/
voidEXTI_PB0_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
EXTI_InitTypeDefEXTI_InitStructure;

/*configtheextiline(PB0)clockandAFIOclock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

/*configtheNVIC(PB0)*/
NVIC_Configuration();

/*EXTIlinegpioconfig(PB0)*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//上拉输入
GPIO_Init(GPIOB,&GPIO_InitStructure);

/*EXTIline(PB0)modeconfig*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿中断
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}

/*********************************************************************************
*********************************************************************************/
#include"stm32f10x_it.h"
voidEXTI15_10_Handler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)!=RESET)//确认产生了EXTILine中断
{

GPIO_ResetBits(GPIOE,GPIO_Pin_3);
EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位
}
}


/*
*注意:中断服务程序函数名有两种命名方法
*EXTI0_IRQHandler
*EXTI9_5_IRQHandler
*
*
*
*
*
*/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top