打印

STM32F103ZGT6外部中断exti

[复制链接]
6090|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xdpzxh|  楼主 | 2011-6-15 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位,我遇到一个很离奇的问题,我设置上升沿触发,但检测到一个外部中断时,其上升沿/下降沿都触发,我只需要上升沿触发,很奇怪,那位大侠指点下!  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB_11;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
void GPIO_Configuration(void)  
{  
    GPIO_InitTypeDef GPIO_InitStructure;  


    /* Configure PB8 as input floating */  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  
    GPIO_Init(GPIOB,&GPIO_InitStructure);  


}  
继续配置NVIC  
/**  
  * @brief  Configures NVIC and Vector Table base location.  
  * @param  None  
  * @retval : None  
  */  
void NVIC_Configuration(void)  
{  
    NVIC_InitTypeDef NVIC_InitStructure;  
    /* Configure the NVIC Preemption Priority Bits*/   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  
    /* Set the Vector Table base location at 0x08000000 */   
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
    NVIC_Init(&NVIC_InitStructure);     



}  
配置EXTI ,PB11连接到EXTI  

void EXTI_Configuration(void)  
{  
    EXTI_InitTypeDef EXTI_InitStructure;  
    /*connect PB11 to EXTI*/  
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);  
    /*Config EXTI11*/  
    EXTI_InitStructure.EXTI_Line = EXTI_Line11;  
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
    EXTI_Init(&EXTI_InitStructure);  
}  


在中断函数里面记得清除标志位  

void EXTI15_10_IRQHandler(void)  
{  
     if(EXTI_GetITStatus(EXTI_Line11)!= RESET)  
     {  
        EXTI_ClearITPendingBit(EXTI_Line11);  
        GPIO_SetBits(GPIOC, GPIO_Pin_5);//PC5连蜂鸣器,让蜂鸣器响
        GPIO_SetBits(GPIOC, GPIO_Pin_6);//PC6连指示灯,让指示灯亮
        Delayms(100); 延时100ms
     }  
}  
在主函数里面蜂鸣器一直关着,指示灯灭,我PB11连接每中断一次,蜂鸣器响两次,指示灯亮两次。示波器查看中断信号很好,在上升沿时和下降沿时蜂鸣器都响,指示灯都亮,很郁闷。希望大侠指点下。
沙发
香水城| | 2011-6-15 17:33 | 只看该作者
你的中断信号的上升沿和下降沿之间有多长时间?

使用特权

评论回复
板凳
xdpzxh|  楼主 | 2011-6-15 21:08 | 只看该作者
和时间没有关系,PB11外部连接一红外光电对射管,光电管中间被遮挡后,就一直高电平。遮挡瞬间,上升沿触发蜂鸣器响一次和指示灯亮一下,然后一直高电平,无论多久时间后拿开遮挡物瞬间下降沿又触发一次,蜂鸣器又响一次和指示灯又亮一下后变为低电平。用泰克2440示波器能观察到很好的触发信号,遮挡一次,只有一次高电平信号。

使用特权

评论回复
地板
香水城| | 2011-6-16 12:10 | 只看该作者
1,你的红外管输出到MCU端的电气特性是怎样的?推挽还是开路输出?
2,试试看把这个脚用开关直接接高或低,不用红外管,看有什么结果?

使用特权

评论回复
5
video_vb| | 2011-6-21 15:33 | 只看该作者
我也碰到同样的问题,光藕输出还有10K上拉,用示波器测量输出电压:高电平为3.3V,低电平为220mV,很标准没有毛刺。设置为下降沿触发,在下降沿能每次进中断。但在上升沿经常也进入中断,但不是每次。

不管管脚配置为上拉还是下拉,上升沿触发还是下降沿触发,都会出现两个边沿都触发。

折腾很久了,求解。

使用特权

评论回复
6
xdpzxh|  楼主 | 2011-6-21 21:39 | 只看该作者
好像是由很小的毛刺引起边沿不标准而造成的,示波器看不出来,我经过IC转换后产生标准的上升沿,就没有出现这个问题了,谢谢香主的帮助。

使用特权

评论回复
7
derde| | 2011-6-22 11:14 | 只看该作者
这个问题我也遇到过,看完版主所说的, 也挺有感触的

使用特权

评论回复
8
derde| | 2011-6-22 11:14 | 只看该作者
这是学习帖:)

使用特权

评论回复
9
video_vb| | 2011-6-22 15:37 | 只看该作者
我还是没搞定,加运放隔离,加去耦电容,都不行。
只好配合其他条件来自己判断是上升还是下降,多出十几行代码才完事。
外部中断这么怕干扰吗?

使用特权

评论回复
10
xdpzxh|  楼主 | 2011-6-22 19:40 | 只看该作者
外部边沿干扰要很好处理哦,困扰我很久,还好解决了。

使用特权

评论回复
11
hobbolo| | 2011-6-30 11:54 | 只看该作者
增加红外发射管的功率,可能好点。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

0

粉丝