OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 22780|回复: 21

关于外部中断疑惑

[复制链接]

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
发表于 2013-8-2 00:42:59 | 显示全部楼层 |阅读模式
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "12232.h"  

#define LED0 PAout(0)

void EXTI0_IRQHandler(void)       //?????????????????ü????
{
LED0=!LED0;
EXTI->R=1<<0;     //????LINE0????????±ê????  
}
//?????????????????ò
//??????PB0??????????

void Exti_Init(void)
{
RCC->APB2ENR|=1<<3;     

GPIOB->CRL&=0XFFFFFFF0;
GPIOB->CRL|=0X00000008;     
GPIOB->ODR|=1<<0;  

Ex_NVIC_Config(GPIO_B,0,FTIR);             //????????·?
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);      //????2??×???????2??×é2
}

void Led_Init(void)
{
RCC->APB2ENR|=1<<2;     

GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000003;     
GPIOA->ODR|=1<<0;  
}

int main(void)
{  
Stm32_Clock_Init(9);
delay_init(72);
Exti_Init();
Led_Init();
while(1)
{
}
}
在PB0输入2HZ的方波信号,幅值3.3V,偏置1.65V,看不到理论上1s周期的led闪烁,PA0的输出始终是高。
但是st-link仿真,在外部中断函数中设置断点,快速运行,却能看到led确实有翻转。单步运行时,执行很多次却进入不了外部中断函数内部。
请求原子哥的解答。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 10:50:33 | 显示全部楼层
回复【楼主位】idiot唐江平:
---------------------------------
你的方波信号是什么样的?最低1.65V,最高3.3V?
1.65对stm32来说,差不多就是高电平了哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-2 14:28:05 | 显示全部楼层
回复【2楼】正点原子:
--------------------------------
只设置幅度为3.3V的话,不是应该是-1.65到+1.65吗?所以要设置1.65的偏置,输出的方波才是0~3.3V。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 17:39:59 | 显示全部楼层
回复【3楼】idiot唐江平:
---------------------------------
哦,那就是说输入信号没问题了?0~3.3V的方波?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-2 20:01:56 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯,就是信号发生器的方波是没有问题的,就是没正确的结果:led周期为1s的闪烁,实际现象却是常亮
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 20:22:33 | 显示全部楼层
回复【5楼】idiot唐江平:
---------------------------------
可以用STM32的PWM输出一个方波测试下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-3 16:58:02 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
用示波器找到原因了,触发通道PB0的信号在每一个方波的下降沿,会马上会出现一个下降沿干扰信号,总是连续触发两次,所以,PAO看似是始终为高,实际上有个ns级别的持续低电平
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 09:21:21 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,这个问题,我虽然通过示波器找到了“常亮”直观上的原因。但造成离下降沿很短时间内有一次误触发的本质还不是很清楚。
我在程序上做了以下尝试,让其从“常亮”到“闪烁”。
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"

#define LED0 Bout(0)
#define OUT Bout(1)

void Exti_Init(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00800000;
GPIOB->ODR|=1<<5;
Ex_NVIC_Config(GPIO_B,5,FTIR);
MY_NVIC_Init(2,1,EXTI9_5_IRQChannel,2);
}

void Led_Init(void)
{
RCC->APB2ENR|=1<<3;     

GPIOB->CRL &= 0XFFFFFF00;
GPIOB->CRL |= 0X00000033;      
GPIOB->ODR |= 3<<0;   
}

// void EXTI9_5_IRQHandler(void)
// {
//  EXTI->R |= 1<<5;                        //正常闪烁
//  LED0=!LED0;
// }

// void EXTI9_5_IRQHandler(void)
// {
//  LED0=!LED0;                                //常亮
//  EXTI->R |= 1<<5;
// }

// void EXTI9_5_IRQHandler(void)
// {
//  LED0=!LED0;                                 //正常闪烁
//  delay_us(1);
//  EXTI->R |= 1<<5;
// }

void EXTI9_5_IRQHandler(void)
{
delay_us(1);                                //正常闪烁
LED0=!LED0;
EXTI->R |= 1<<5;
}

int main(void)
{   
Stm32_Clock_Init(9);
delay_init(72);
Exti_Init();
Led_Init();
while(1)
{
OUT=1;
delay_ms(250);
OUT=0;
delay_ms(250);
}
}

在此希望能得到造成干扰的本质原因。另外我可以提供示波器图片......
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 09:31:38 | 显示全部楼层
回复【7楼】idiot唐江平:
---------------------------------
由于不会上传图片或是不能,就没有上传照片了。

对于新手,这种细微的差别,如何避免,希望得到指导。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 10:38:34 | 显示全部楼层
在最右下角有:回复文章 的按钮,点击这个即可进入高级回复,可以上传图片
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 10:47:39 | 显示全部楼层

一图存在干扰,连续两次跳变,所以最后led状态为常亮
二图为正常闪烁图片
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 10:51:21 | 显示全部楼层
回复【11楼】idiot唐江平:

一图存在干扰,连续两次跳变,所以最后led状态为常亮
二图为正常闪烁图片

---------------------------------
根据光标定位测幅值,干扰信号应该至少有个1V以上的跳变,而且如果我没验证错误,1V方波的下降沿也足以触发外部中断。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 11:42:15 | 显示全部楼层
你的信号源来自何方啊...
从信号源找问题吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 12:53:00 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
while(1) 

OUT=1; 
delay_ms(250); 
OUT=0; 
delay_ms(250); 

#define OUT Bout(1) 
这个应该是原子哥指的信号源吧?

同一个信号源,整个程序其他部分都是相同的。不同的只是中断服务函数,语句的细微调整,结果却完全不同。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 13:09:49 | 显示全部楼层
回复【14楼】idiot唐江平:
---------------------------------
你这直接是GPIO产生的?
示波器里面看到的波形,是信号产生振铃现象了,但是你上面的代码,应该是输出很慢的信号,不会产生振铃才对.
你示波器里面的波形貌似很快啊...不是你13楼的代码产生的吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 13:57:15 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
是13楼产生的,完整的代码在7楼。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 15:10:15 | 显示全部楼层
回复【16楼】idiot唐江平:
---------------------------------
那奇怪了,你代码生成的频率就是2hz,2hz 的信号波形不可能这么差才对啊....
我用示波器看我们的波形都很漂亮的...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 15:58:58 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
差?原子哥没有误会我上传的照片吧?那个波形我是放大到了ns级别,才看到了那“瑕疵”。
要是方便的话,你可以把代码跑跑,跑那个led常亮的,再看看波形。我并没有无中生有.....
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 18:01:45 | 显示全部楼层
回复【18楼】idiot唐江平:
---------------------------------
我试过了,没出现你的那种毛刺和振铃.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 18:08:19 | 显示全部楼层
我的波形:









我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 18:10:58 | 显示全部楼层
你的第一个图250ns能看到2个波,我实在不解....2Hz在250ns的扫描周期下,怎么可能看到2个波啊...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 21:10:35 | 显示全部楼层



测试程序如下:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"

#define LED0 PBout(0)
#define OUT PBout(1)

void Exti_Init(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00800000;
GPIOB->ODR|=1<<5;
Ex_NVIC_Config(GPIO_B,5,FTIR);
MY_NVIC_Init(2,1,EXTI9_5_IRQChannel,2);
}

void Led_Init(void)
{
RCC->APB2ENR|=1<<3;     

GPIOB->CRL &= 0XFFFFFF00;
GPIOB->CRL |= 0X00000033;     
GPIOB->ODR |= 3<<0;  
}

// void EXTI9_5_IRQHandler(void)
// {
// EXTI->R |= 1<<5;
// LED0=!LED0;
// }

void EXTI9_5_IRQHandler(void)
{
LED0=!LED0;
EXTI->R |= 1<<5;
}

// void EXTI9_5_IRQHandler(void)
// {
// LED0=!LED0;
// delay_us(1);
// EXTI->R |= 1<<5;
// }

// void EXTI9_5_IRQHandler(void)
// {
// delay_us(1);
// LED0=!LED0;
// EXTI->R |= 1<<5;
// }

int main(void)
{  
Stm32_Clock_Init(9);
delay_init(72);
Exti_Init();
Led_Init();
while(1)
{
OUT=1;
delay_ms(250);
OUT=0;
delay_ms(250);
}
}

示波器图片说明:上面的测试信号是 LED0 PBout(0),第三张图可以看得出,电平始终为高,大概有3V的样子。
                        下面的测试信号是OUT PBout(1),由图可知,方波的发生信号没有问题。
持续的高电平说明必定不是每一个下降沿触发一个LED翻转,于是放大观察得到图一、图二,每个下降沿附近还有一个干扰信号触发了中断,连续跳变导致“持续”高电平。

这是我刚才重新再次验证得结果。如果,同一个程序,同样的接线:PB0接led,PB1接PB5,led是常亮的话,示波器就能看到同样的现象。要是led为闪烁的话,就另当别论了,那就只能理解为开发板“区别”了。








回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 14:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表