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

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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
正点原子
1楼-- · 2019-07-21 06:44
scx2006114 发表于 2018-12-20 13:29
50Hz信号,周期是20ms,每个上升沿的间隔是20ms,延时5ms时间长了?我设置的捕捉上升沿,但是为啥它每次下 ...

哦,我算错了。
不好意思

你试试把这个延时去掉,或者降低信号频率,再试试看?
正点原子
2楼-- · 2019-07-21 08:40
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 13:34
信号频率是多高?是否超过20Hz了?
scx2006114
4楼-- · 2019-07-21 18:51
正点原子 发表于 2018-12-19 02:27
信号频率是多高?是否超过20Hz了?

原子哥,信号是50Hz的方波信号
正点原子
5楼-- · 2019-07-22 00:35
scx2006114 发表于 2018-12-19 08:18
原子哥,信号是50Hz的方波信号

50hZ,  那你在while里面延迟5ms就肯定出问题了
你延迟的时候,第二个上升沿就来到了。
scx2006114
6楼-- · 2019-07-22 02:48
正点原子 发表于 2018-12-20 02:19
50hZ,  那你在while里面延迟5ms就肯定出问题了
你延迟的时候,第二个上升沿就来到了。

50Hz信号,周期是20ms,每个上升沿的间隔是20ms,延时5ms时间长了?我设置的捕捉上升沿,但是为啥它每次下降沿也捕捉,然后输出一个低电平,不应该是捕捉到上升后才输出一个低电平吗?

一周热门 更多>