OpenEdv-开源电子网

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

F407 外部中断记录脉冲个数问题

[复制链接]

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
发表于 2016-5-31 13:46:33 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 ymy1989 于 2016-5-31 14:23 编辑

想用PF8这个引脚设为外部中断记录脉冲个数,我配置的是下降沿触发中断,然后在中断里脉冲个数加1,然后主函数循环把脉冲个数显示在液晶上。但为什么记录的脉冲数总是真实个数的2倍呢?
附代码:
extern long s;
   
//外部中断初始化程序
//初始化PF8为中断输入.
void EXTIX_Init(void)
{
NVIC_InitTypeDef   NVIC_InitStructure;
EXTI_InitTypeDef   EXTI_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF8
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource8);//PF8 连接到中断线8
  /* 配置EXTI_Line8 */
  EXTI_InitStructure.EXTI_Line = EXTI_Line8;//LINE8
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE8
  EXTI_Init(&EXTI_InitStructure);//配置


  NVIC_InitStructure.NVIC_IRQChannel =  EXTI9_5_IRQn  ;//外部中断8
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//子优先级1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置

}


void EXTI9_5_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_Line8) != RESET)        //判断中断发生线
  {
     EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE8上的中断标志位
    s++; //脉冲计数+1
  }
}

主函数
long s;    定义脉冲总个数
int main(void)
{

u8 tbuf[40];//设置一个显示到液晶的字符数组,放的是转换成字符串的s(脉冲总个数)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168);      //初始化延时函数
uart_init(115200);  //初始化串口波特率为115200
EXTIX_Init();  //初始化LED
  LCD_Init();           //初始化LCD FSMC接口     
while(1)   
{   
  
  LCD_Clear(RED);
  POINT_COLOR=WHITE;
        sprintf((char*)tbuf,"%ld",s); //把脉冲总个数转换为字符串
  LCD_ShowString(30,40,210,24,24,tbuf);                 //把脉冲总个数显示到液晶上
  delay_ms(1000);
}
}


为什么每次S的值永远都是真实脉冲个数的两倍呢?哪里配置错了呢?
已验证脉冲发生器(图1)是没问题的,用了十几年的东西,但为什么外部中断的计数总是脉冲数的2倍呢?(图2)

还有我设置成上升下降沿触发,记录的脉冲数依然是2倍,这个倒是对的,但为什么设置上升沿或者下降沿,也是2倍呢?



补充内容 (2016-6-18 11:07):
已解决!

脉冲发生器

脉冲发生器

显示到液晶的记录值

显示到液晶的记录值

最佳答案

查看完整内容[请看2#楼]

问题解决了。不是软件设置问题,是硬件问题,我的脉冲高电平是5V,经过光耦给到io口也是超过3.3v的峰值,所以总是不行,后来我加了电阻分压,就正常了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
 楼主| 发表于 2016-5-31 13:46:34 | 显示全部楼层
正点原子 发表于 2016-6-15 21:54
说明你设置的有问题

问题解决了。不是软件设置问题,是硬件问题,我的脉冲高电平是5V,经过光耦给到io口也是超过3.3v的峰值,所以总是不行,后来我加了电阻分压,就正常了。
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
 楼主| 发表于 2016-5-31 14:03:51 | 显示全部楼层
自己顶
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-5-31 14:30:31 | 显示全部楼层
GPIO_PuPd 改为上拉试试,s初始化一下
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

5

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-5-29
在线时间
5 小时
发表于 2016-5-31 15:08:50 | 显示全部楼层
路过帮顶
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-5-31 15:17:45 | 显示全部楼层
不知道问题在哪

为什么不用计数器啊
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
 楼主| 发表于 2016-5-31 15:40:30 | 显示全部楼层
龙之谷 发表于 2016-5-31 14:30
GPIO_PuPd 改为上拉试试,s初始化一下

还是不行
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
 楼主| 发表于 2016-5-31 17:55:02 | 显示全部楼层
自己再顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-6-1 21:04:54 | 显示全部楼层
验证下是否时钟的上升沿/下降沿都触发了中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
 楼主| 发表于 2016-6-14 13:07:30 | 显示全部楼层
正点原子 发表于 2016-6-1 21:04
验证下是否时钟的上升沿/下降沿都触发了中断。

都触发了中断,可我设置的是下降沿触发啊,为什么会这样
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-6-15 21:54:59 | 显示全部楼层
ymy1989 发表于 2016-6-14 13:07
都触发了中断,可我设置的是下降沿触发啊,为什么会这样

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

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
 楼主| 发表于 2016-6-18 11:04:38 | 显示全部楼层
已解决,脉冲给的是5v的,io口输入超过3.3V,所以不行,我加了电阻分压,就正常了
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
 楼主| 发表于 2016-6-18 11:06:38 | 显示全部楼层
正点原子 发表于 2016-6-15 21:54
说明你设置的有问题

帖子已解决的话我怎么改帖子状态?还是管理员改?我没看到能改帖子状态的地方嘛
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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