OpenEdv-开源电子网

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

关于STM32 定时器输入捕获多次进中断的问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-2-2
在线时间
1 小时
发表于 2019-2-2 18:35:51 | 显示全部楼层 |阅读模式
1金钱
各位 在做定时器输入捕获  现在遇到了点问题 用的定时器4 CH2 上升沿捕获 中断我只开了通道2捕获  其他全部关闭   按理说只有CH2产生上升沿才会进入中断函数 其他原因是不可能进中断函数的  我看原子 包括其他的历程 五一例外的都在中断函数加了这一句if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)   用来确认是CC2的捕获中断   今天尝试把这个判断去掉 发现  程序会多进中断   进中断的频率 是不加这个判断的2倍  也就是说有其他事件触发了中断 那么为什么呢? 所有中断我都关了啊?  代码如下   ,麻烦大佬给分析一下   
void TIM4_CH2_Cap_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef  TIM4_ICInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);   //TIM4时钟使能   
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  //使能PORTB时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //GPIOA7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB7
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4); //PB7复用位定时器4
  
   
TIM_TimeBaseStructure.TIM_Prescaler=10000;  //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=10000;   //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

//初始化TIM5输入捕获参数
TIM4_ICInitStructure.TIM_Channel = TIM_Channel_2;    //  选择输入端 CC2
  TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕获
  TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
  TIM4_ICInitStructure.TIM_ICFilter = 10;     //配置输入滤波器
  TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM_ITConfig(TIM4,TIM_IT_CC2,ENABLE);//允许CC2捕获中断
TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC3|TIM_IT_CC4|TIM_IT_COM|TIM_IT_Trigger|TIM_IT_Break,DISABLE);//禁止其他所有中断
  TIM_Cmd(TIM4,ENABLE );  //使能定时器4
}

void TIM4_IRQHandler(void)
{      
//  if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)    //不加这个判断 test会多加两倍???
//  {
   test=test+1;            
//  }

    TIM4->SR =0;
}  


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-2-2
在线时间
1 小时
 楼主| 发表于 2019-2-2 18:54:46 | 显示全部楼层
很奇怪的解决了  把中断函数里 清除标志位放在第一句执行就好了


void TIM4_IRQHandler(void)
{      
  TIM4->SR =0;
   test=test+1;            

}  

这样的话就不会有问题


void TIM4_IRQHandler(void)
{      
  
   test=test+1;            
TIM4->SR =0;
}  

而这样就会有问题   test会多加  为什么呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 20:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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