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

2019-07-14 22:17发布

电路板应用中出现问题,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;
}


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)
       {
        }
}
0条回答

一周热门 更多>