捕捉上升沿的问题,请大神不吝赐教

2019-07-21 06:33发布

我想捕捉上升沿,连续捕捉,每捕捉一次上升沿给一个控制信号,但进过测试发现在每次下降沿也会给一个控制信号,请大神帮忙解决一下这个问题,只想捕捉上升沿。用捕捉的方法处理上升沿的问题,不用外部中断。代码如下:捕捉引脚配置程序:

[mw_shl_code=c,true]void TIM2_Cap_Init(u16 arr,u16 psc)
{                 
        RCC->APB1ENR|=1<<0;           //TIM2 时钟使能
        RCC->APB2ENR|=1<<2;            //PORTA时钟使能
         
        GPIOA->CRL&=0XFFFFFFF0;
        GPIOA->CRL|=0X00000008;        //PA0 输入  
        GPIOA->ODR|=0<<0;                //PA0 下拉
          
        TIM2->ARR=arr;                  //设定计数器自动重装值
        TIM2->PSC=psc;                  //预分频器

        TIM2->CCMR1|=1<<0;                //CC1S=01         选择输入端
        TIM2->CCMR1|=0<<4;                 //不滤波
        TIM2->CCMR1|=0<<10;         //IC2PS=00         不分频

        TIM2->CCER &=~(1<<1);                 //CC1P=0        上升沿捕获
        TIM2->CCER|=1<<0;                 //CC1E=1         允许捕获计数器
        TIM2->DIER|=1<<1;           //允许捕获中断
        TIM2->DIER|=1<<0;           //允许更新中断
        TIM2->CR1|=0x01;            //使能定时器2
        MY_NVIC_Init(2,0,TIM2_IRQn,2);
}
[/mw_shl_code]



中断服务程序:
[mw_shl_code=c,true]void TIM2_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM2->SR;
        TIM2->CCER &=~(1<<1);
        if((TIM2CH1_CAPTURE_STA&0X40)==0)//未捕获成功
        {  
                if(tsr&0x02)  //捕获1发生
                {                               
                        TIM2CH1_CAPTURE_STA=0X40;                //捕获上升沿标记
                }                                                                                   
        }
        TIM2->SR=0;//清楚中断标志
}
[/mw_shl_code]

主函数:
[mw_shl_code=c,true]int main(void)
{                         
        u32 temp_one=0,temp_two=0;         
        Stm32_Clock_Init(9);       
        uart_init(72,9600);                
        delay_init(72);                           
        LED_Init();                         
        TIM2_Cap_Init(0XFFFF,72-1);
           while(1)
        {         
                if(TIM2CH1_CAPTURE_STA&0X40)//捕获一次上升沿
                {
                        temp_two++;
                        temp_one = temp_two;
                        if(temp_one==1)
                        {
                                  LED0 = 0;
                                 delay_ms(5);
                                 LED0 = 1;
                                  temp_two=0;
                        }

                        TIM2CH1_CAPTURE_STA=0;                        //开启下一次捕获
                }
        }
}

[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。