OpenEdv-开源电子网

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

TIM1还没使能,怎么就开始工作了?

[复制链接]

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-12-16 16:03:25 | 显示全部楼层 |阅读模式
5金钱
在初始化里,并没有执行:TIM_Cmd(TIM1,ENABLE );
但初始化完成后,tim1就开始连续不停滴进入输入捕获中断了void TIM1_CC_IRQHandler(void)。

为什么?

不是应该使能后才工作的吗?如何才能控制tim1开启和停止?

最佳答案

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

TIM_Cmd(TIM1,ENABLE);执行之前,中断函数void TIM1_CC_IRQHandler(void)不断在执行,每次连续两次上升沿时获取到的值CapValue1和CapValue2都是相同值保持固定 TIM_Cmd(TIM1,ENABLE);执行之后,中断函数void TIM1_CC_IRQHandler(void)不断在执行,每次连续两次上升沿时获取到的值是正确的不同的两个值。 TIM_Cmd(TIM1,DISABLE);执行之后,中断函数void TIM1_CC_IRQHandler(void)还是不断在执行,每次连续两次上 ...
小小蜗牛
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-16 16:03:26 | 显示全部楼层
TIM_Cmd(TIM1,ENABLE);执行之前,中断函数void TIM1_CC_IRQHandler(void)不断在执行,每次连续两次上升沿时获取到的值CapValue1和CapValue2都是相同值保持固定
TIM_Cmd(TIM1,ENABLE);执行之后,中断函数void TIM1_CC_IRQHandler(void)不断在执行,每次连续两次上升沿时获取到的值是正确的不同的两个值。
TIM_Cmd(TIM1,DISABLE);执行之后,中断函数void TIM1_CC_IRQHandler(void)还是不断在执行,每次连续两次上升沿时获取到的值CapValue1和CapValue2都是相同值保持固定

综上,准备这么干:初始化里注释掉最后两句
需要开启时:
   TIM_ITConfig(TIM1, TIM_IT_CC1,ENABLE); //允许CC1IE捕获中断
   TIM_Cmd(TIM1,ENABLE ); //使能定时器1 
需要关闭时:
   TIM_Cmd(TIM1,DISABLE ); //失能定时器1 
   TIM_ITConfig(TIM1, TIM_IT_CC1,DISABLE); //禁止CC1IE捕获中断
   
即把这两句作为一个整体出现。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-16 16:29:01 | 显示全部楼层
void TIM1_Cap_Init(u16 arr,u16 psc)
{  
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_ICInitTypeDef  TIM1_ICInitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能TIM1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;  //PA8  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PA8浮空输入 
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOA,GPIO_Pin_8);

    //初始化定时器TIM1  
    TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器   
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  
    //初始化TIM1输入捕获参数
    TIM1_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择通道1
    TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
    TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
    TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
    TIM1_ICInitStructure.TIM_ICFilter = 0x00;//不滤波
    TIM_ICInit(TIM1, &TIM1_ICInitStructure);
 
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;  //TIM1中断   TIM1_CC_IRQn
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级2级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级0级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 

   TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);//清中断,避免一启用中断后立即产生中断
   TIM_ITConfig(TIM1, TIM_IT_CC1,ENABLE); //允许更新中断,允许CC1IE捕获中断
       
   //TIM_Cmd(TIM1,ENABLE ); //使能定时器1    
}

帮我看一下吧,想需要的时候才开启tim1输入捕获。结果一初始化就开始了。
小小蜗牛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-16 23:09:17 | 显示全部楼层
中断问题不一定是定时器已经运行了,STM32的中断配置,一般一配置完就会进入一次中断服务函数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-17 08:30:21 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
它不是进入一次,是不使能TIM_Cmd(TIM1,ENABLE );的情况下,连续不断产生中断。

导致我无法控制它什么时候 开 和 关。

我外接的交流电,上升沿触发。一初始化就开始捕获产生中断了。

我的tim3用的update,init后会触发一次,但只要不使能cmd enable,就不会再触发。
输入捕获难道不依赖cmd?不使能外设按道理应该不能用才对。

我在初始化后面加TIM_Cmd(TIM1,DISABLE )同样控制不了它停。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-17 15:31:46 | 显示全部楼层
什么情况下会发生:在 不使能TIM_Cmd的情况下,定时器就开始工作了呢?
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-17 16:51:01 | 显示全部楼层
虽然实现了功能,但道理没搞明白。
只能由现象分析得出结论:
1.cmd开关并不能控制定时器输入捕获中断产生与否,
2.cmd可以控制获取定时器的计数值。失能则计数值不再更新,会变为一个莫名其妙的数字,保持固定,但再次关闭时又是另一个固定的数值。
小小蜗牛
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 16:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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