我想捕捉上升沿,连续捕捉,每捕捉一次上升沿给一个控制信号,但进过测试发现在每次下降沿也会给一个控制信号,请大神帮忙解决一下这个问题,只想捕捉上升沿。用捕捉的方法处理上升沿的问题,不用外部中断。代码如下:捕捉引脚配置程序:
[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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
哦,我算错了。
不好意思
你试试把这个延时去掉,或者降低信号频率,再试试看?
原子哥,信号是50Hz的方波信号
50hZ, 那你在while里面延迟5ms就肯定出问题了
你延迟的时候,第二个上升沿就来到了。
50Hz信号,周期是20ms,每个上升沿的间隔是20ms,延时5ms时间长了?我设置的捕捉上升沿,但是为啥它每次下降沿也捕捉,然后输出一个低电平,不应该是捕捉到上升后才输出一个低电平吗?
一周热门 更多>