打印
[STM8]

【求助】STM8捕获中断无法进入-附代码

[复制链接]
1291|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
longmyall|  楼主 | 2015-7-21 23:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电路板应用中出现问题,STM8S105,运用定时器的通道1和通道4,设置成为下降沿输入捕获,定时器周期1.5ms。但目前出现问题,通道1可以进入中断,通道4却不可以。输入信号为脉冲信号,周期6ms,占空比75%。输出为溢出中断,完成一定功能。怀疑是不是两通道相互有影响?1.5ms周期过短?还是其他?大神们求助。
void Init_TIM1(void)
{
        TIM1_CR1=0x00;    //关闭定时器
        TIM1_IER=0x00;    //关闭中断
       
        TIM1_PSCRH=0x00;    //将16M晶振预分频为1M,计数器精度1us
        TIM1_PSCRL=0x0f;

        TIM1_CCMR1=0x31;    //CC1通道输入,IC1映射在TI1FP1,采样频率N=4
        TIM1_CCMR4=0x31;    //CC4通道输入,IC1映射在TI3FP4,采样频率N=4
       
        TIM1_CCER1=0x03;    //OC1下降沿捕捉,捕获使能;OC2输出到对应引脚,高电平有效
        TIM1_CCER2=0x30;    //OC4下降沿捕捉,捕获使能;OC3输出到对应引脚,高电平有效
       
        TIM1_ARRH=0x05;    //设置自动重装载寄存器(十进制6000)
        TIM1_ARRL=0xdc;
       
        TIM1_CNTRH=0x00;    //设置计数器寄存器(十进制0)
        TIM1_CNTRL=0x00;
       
        TIM1_BKR=0x80;    //OC,OCN使能
        TIM1_EGR=0x13;    //产生更新事件
        TIM1_IER=0x13;    //允许捕获比较1,2,3,4中断,允许更新中断       
        TIM1_CR1=0x01;    //开启定时器
}

@far @interrupt void TIM1_CC_IRQHandler(void)
{
                //******一路的捕捉控制 输入为TIM1_CH1,PC1 ******  
        if((TIM1_SR1&0x02)==0x02)    //判断是否为TIM1_CH1捕获
        {       
            CurrentT1Value1=TIM1_CCR1H;
                CurrentT1Value1=CurrentT1Value1<<8;
                CurrentT1Value1+=TIM1_CCR1L;
               
                TIM1_SR1&=0xfd;    //清除中断标志
                TIM1_SR2&=0xfd;    //清除中断标志               
                m3++;    //进入中断次数
                if((TIM1_CCER1&0x02)==0x02)    //再次判断捕获发生在下降沿
                {
                        if((PC_IDR&0x02)==0x02)    //滤掉小毛刺
                        {
                                return;
                        }

                        TIM1_CCER1&=0xfd;    //捕捉发生在TI1F的高电平或上升沿

                        FallingValue1=CurrentT1Value1;    //记下一路第一次捕捉下降沿值

                }
                else    //上升沿
                {
                        if((PC_IDR&0x02)==0x00)    //滤掉小毛刺
                        {
                                return;
                        }
                        TIM1_CCER1|=0x03;    //下降沿捕获
                       
                        RisingValue1=CurrentT1Value1;//记下一路第一次捕捉上升沿值                       
                       
                        Pulse1=RisingValue1-FallingValue1;
                          }
        }
          return;

        //******二路的捕捉控制 输入TIM1_CH4,PD7
        if((TIM1_SR1&0x10)==0x10)    //判断是否为TIM1_CH4捕获
        {
                CurrentT1Value2=TIM1_CCR4H;
                CurrentT1Value2=CurrentT1Value2<<8;
                CurrentT1Value2+=TIM1_CCR4L;
               
                TIM1_SR1&=0xef;    //清除中断标志 输入清除
                TIM1_SR2&=0xef;    //清除中断标志 输入清除
               
                m2++;

                if((TIM1_CCER2&0x20)==0x20)    //再次判断捕获发生在下降沿
                {
                        if((PD_IDR&0x80)==0x80)    //滤掉小毛刺
                        {
                                return;       
                        }
                        TIM1_CCER2&=0xdf;    //捕捉发生在TI1F的高电平或上升沿

                        FallingValue2=CurrentT1Value2;    //记下二缸捕捉下降沿值
                }
                else    //上升沿
                {                       
                        if((PD_IDR&0x80)==0x00)    //滤掉小毛刺
                        {
                                return;
                        }                       
                        TIM1_CCER2|=0x30;    //下降沿捕获

                        RisingValue2=CurrentT1Value2;    //记下二路捕捉上升沿值
                        Pulse2=RisingValue2-FallingValue2;
                          }
                }
          return;
        }
        return;
}

//TIM1溢出中断
@far @interrupt void TIM1_OVF_IRQHandler(void)
{
        v++;           //另有用
        TIM1_SR1&=0xfe;          //清除溢出标志位
        return;
}
沙发
longmyall|  楼主 | 2015-7-21 23:13 | 只看该作者
void main(void)
{
        Init_TIM1();

        CLK_SWR=0xb4;
        CLK_PCKENR1=0xe8;
        CLK_PCKENR2=0x0c;
        CLK_CKDIVR=0x00;   //CPU 16M
        CLK_SWCR|=0x02;

        _asm("rim");      //开启全局中断
        while (1)
       {
        }
}

使用特权

评论回复
板凳
amanda_s| | 2015-7-22 15:01 | 只看该作者
单独试试通道4;
看看通道4的中断标志有没有置位;
看看GPIO口的初始化有没有问题。

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝