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

2019-07-20 21:41发布

本帖最后由 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):
已解决!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
ymy1989
1楼-- · 2019-07-20 23:04
正点原子 发表于 2016-6-15 21:54
说明你设置的有问题

问题解决了。不是软件设置问题,是硬件问题,我的脉冲高电平是5V,经过光耦给到io口也是超过3.3v的峰值,所以总是不行,后来我加了电阻分压,就正常了。
ymy1989
2楼-- · 2019-07-20 23:47
 精彩回答 2  元偷偷看……
龙之谷
3楼-- · 2019-07-21 01:18
GPIO_PuPd 改为上拉试试,s初始化一下
Lone
4楼-- · 2019-07-21 01:45
 精彩回答 2  元偷偷看……
止天
5楼-- · 2019-07-21 06:10
不知道问题在哪

为什么不用计数器啊
ymy1989
6楼-- · 2019-07-21 09:28
龙之谷 发表于 2016-5-31 14:30
GPIO_PuPd 改为上拉试试,s初始化一下

还是不行

一周热门 更多>