OpenEdv-开源电子网

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

今天用外部中断做了一个计频器,成功了,但有出现奇异的问题

[复制链接]

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
发表于 2012-4-22 17:06:30 | 显示全部楼层 |阅读模式
先发问题,再发程序。

我把外部中断的输入引脚(Port_A.0),接到板上的其它引脚上或接到板外的金属,它显示的频率达以千计。怎么会这样,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
 楼主| 发表于 2012-4-22 17:07:12 | 显示全部楼层
#include"EXTI.h"
#include"sys.h"
#include"display.h"
#include"delay.h"

void display(void)
{
const unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管
u8 a,b,c,d;
d = count % 10;        //个
c = count / 10 % 10;   //十
b = count / 100 % 10;  //百
a = count / 1000 % 10; //千

RCC->APB2ENR |= 1<<3; //使能Port_B

GPIOB->CRL = 0x33333333;  //低8位输出   段选
GPIOB->CRH&= 0xffff0000;  //高四位      位选
GPIOB->CRH|= 0x00003333;  //输出 50M
GPIOB->ODR|= 0x00000fff;  //输出 高电平
outdata( table[d] );
Ud;
delay_us(222);
outdata( table[c] );
Uc;
delay_us(222);
outdata( table );
Ub;
delay_us(222);
outdata( table[a] );
Ua;
delay_us(222);
}
回复 支持 反对

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
 楼主| 发表于 2012-4-22 17:07:35 | 显示全部楼层
#include"sys.h"
#include"EXTI.h"


u16 count=0;
//中断服务
void EXTI0_IRQHandler(void)
{
EXTI->R = 1<<0;   //清除中断标志 (挂起寄存器)
count++;  //计数加1
}
//PortA.0中断
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2;//使能Port_A

GPIOA->CRL&=0xfffffff0; //Port_A.0
GPIOA->CRL|=0x00000008; //输入
GPIOA->ODR|=0<<0;  //下拉

Ex_NVIC_Config(GPIO_A,0,RTIR);   //Port_A.0上升沿触发
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //2抢占2优先  分组2
}
回复 支持 反对

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
 楼主| 发表于 2012-4-22 17:07:52 | 显示全部楼层
#include <stm32f10x_lib.h>
#include"EXTI.H"
#include"delay.h"
#include"sys.h"
#include"display.h"



int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
JTAG_Set(SWD_ENABLE);
EXTIX_Init(); //PortA.0
do
{
display();
}while(1);
}

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-22 17:48:45 | 显示全部楼层
回复【楼主位】767904101:
---------------------------------
1,可能是干扰造成的.
2,你的中断没有判别中断类型.这样任何其他类型的中断进入也被你计数,导致结果不准确.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
 楼主| 发表于 2012-4-22 18:59:51 | 显示全部楼层
EXTI0_IRQHandler  不是只有外部中断0么?  还用判断? 解释一下

我改程序再试试
回复 支持 反对

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
 楼主| 发表于 2012-4-22 19:34:23 | 显示全部楼层
//中断服务
void EXTI0_IRQHandler(void)
{
if(EXTI->R&0x01)
if(PAin(0)==1)
{
EXTI->R = 1<<0;   //清除中断标志 (挂起寄存器)
count++;  //计数加1
}
}

问题依旧,不晓得干扰何来
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-23 00:01:28 | 显示全部楼层
回复【7楼】767904101:
---------------------------------
你直接用我们的例程修改试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 16:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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