打印

定时器加上一截内容造成程序执行错误

[复制链接]
2076|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ysumryxsx|  楼主 | 2013-1-29 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
keil4编译器,用的是定时器4的输出比较功能,定时器内容为计算输出脉冲数量
代码如下
void TIM4_IRQHandler(void)
{
  u16 capture;
  if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)//捕获/比较中断1
        {   
                TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);//清除中断标志位
//                TIM_Cmd(TIM1,ENABLE);
    capture = TIM_GetCapture1(TIM4);
    TIM_SetCompare1(TIM4, capture + CCR1_Val);
                 if(NumPulse++>=Num_PULE)
                 {
                        NumPulse = 0;
                         Cho_CHx=1;
                         //TIM_Cmd(TIM1, ENABLE);
                        GPIO_ResetBits(GPIOB, GPIO_Pin_6);//将端口置低
                         TIM_CCxCmd(TIM4,TIM_Channel_1, DISABLE);//通道一关断
                        TIM_ITConfig(TIM4, TIM_IT_CC1, DISABLE);//中断禁止
                         //NumPulse = 0;
                         TIM_Cmd(TIM4,DISABLE);
                         //TIM_Cmd(TIM3,ENABLE);  
                 }   
        }
  else if(TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET)//捕获/比较中断1
        {   
                TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);//清除中断标志位
//                 TIM_Cmd(TIM1,ENABLE);
    capture = TIM_GetCapture4(TIM4);
    TIM_SetCompare4(TIM4, capture + CCR1_Val);
                 if(NumPulse++>=Num_PULE)
                 {
                NumPulse = 0;
                         Cho_CHx=2;
                         //TIM_Cmd(TIM1, ENABLE);
                        GPIO_ResetBits(GPIOB, GPIO_Pin_9);//将端口置低
                         TIM_CCxCmd(TIM4,TIM_Channel_4, DISABLE);//通道一关断
                        TIM_ITConfig(TIM4, TIM_IT_CC4, DISABLE);//中断禁止
                        
                         TIM_Cmd(TIM4,DISABLE);
                         //TIM_Cmd(TIM3,ENABLE);  
                 }   
        }
        else if(TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)//捕获/比较中断2
        {   
                TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);//清除中断标志位
    capture = TIM_GetCapture2(TIM4);
    TIM_SetCompare2(TIM4, capture + CCR1_Val);
                 if(NumPulse++>=Num_PULE)
                 {
                        NumPulse = 0;
                         Cho_CHx=4;
                        GPIO_ResetBits(GPIOB, GPIO_Pin_7);//将端口置低
                         TIM_CCxCmd(TIM4,TIM_Channel_2, DISABLE);//通道二关断
                        TIM_ITConfig(TIM4, TIM_IT_CC2, DISABLE);//中断禁止
                         TIM_Cmd(TIM4,DISABLE);
                 }   
        }
//  else if(TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)//捕获/比较中断3
//         {   
//                 TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);//清除中断标志位
//    capture = TIM_GetCapture3(TIM4);
//    TIM_SetCompare3(TIM4, capture + CCR1_Val);
//                 if(NumPulse++>=Num_PULE)
//                 {
//                        NumPulse = 0;
//                         Cho_CHx=1;
//                        GPIO_ResetBits(GPIOB, GPIO_Pin_8);//将端口置低
//                         TIM_CCxCmd(TIM4,TIM_Channel_3, DISABLE);//通道三关断
//                        TIM_ITConfig(TIM4, TIM_IT_CC3, DISABLE);//中断禁止
//                         TIM_Cmd(TIM4,DISABLE);
//                 }   
//         }                                   
}
加上屏蔽的那段代码,程序执行错误,不知为什么,求高手指教
沙发
huangxz| | 2013-1-29 11:00 | 只看该作者
文中有六处屏蔽,你指的是哪一出啊

使用特权

评论回复
板凳
ysumryxsx|  楼主 | 2013-1-29 11:17 | 只看该作者
就是最后一段的ELSE IF

使用特权

评论回复
地板
airwill| | 2013-1-29 12:50 | 只看该作者
程序执行错误, 没有说明是什么错误.
一般象这类实际调试的问题, 网友比较难帮你解决问题.
如果是编程思路, 或涉及软硬件的功能,框架方面的问题, 还是可以好好帮助你的.
结合仿真器, 看数据手册. 看问题在哪里吧.
祝楼主顺利

使用特权

评论回复
5
ysumryxsx|  楼主 | 2013-1-29 16:09 | 只看该作者
比较输出200khz的脉冲,定时器比较中断记录脉冲数量,中断频率是不是太高了呢?

使用特权

评论回复
6
uet_cache| | 2013-1-30 10:12 | 只看该作者
你的执行错误是什么意思,,脉冲数量有误?

使用特权

评论回复
7
airwill| | 2013-1-30 16:26 | 只看该作者
可能是频率太高了点, 导致中断来不及完成而新的中断又到了

使用特权

评论回复
8
ysumryxsx|  楼主 | 2013-2-19 11:03 | 只看该作者
已解决:将 if(TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET)改成if(TIM4->SR & TIM_IT_CC1) 即可

使用特权

评论回复
9
平常人| | 2013-2-19 22:04 | 只看该作者
ysumryxsx 发表于 2013-2-19 11:03
已解决:将 if(TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET)改成if(TIM4->SR & TIM_IT_CC1) 即可

这么一改明显地缩短了执行时间,正好印证了7楼的说法,但不能说明这就是根本原因。

使用特权

评论回复
10
ysumryxsx|  楼主 | 2013-2-20 09:29 | 只看该作者
不是根本原因,因为将中断内容挪出中断程序,中断的执行还是乱的,按上述修改后才正常执行。求高人指点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

22

帖子

1

粉丝