输入捕获实验,我把TIM5改成TIM2的通道二结果就不对捕获出来的就是65536

2019-08-13 21:32发布

我只把TIM5改成了TIM2的通道2 ,求大神指导!感激不尽!
void TIM2_Cap_Init(u16 arr, u16 psc)
{
    RCC->APB1ENR|=1<<0;     //开启TIM2时钟     
    RCC->APB2ENR|=1<<2;     //使能PORTA时钟
    
    GPIOA->CRL&=0XFFFFFF0F;
    GPIOA->CRL|=0X00000080; //配置PA1为输入
    GPIOA->ODR|=0<<1;       //配置PA1为下拉
    
    TIM2->ARR=arr;          //设置重装载值
    TIM2->SC=psc;          //设置预分频器
    
    TIM2->CCMR1|=1<<8;      //CC2S=01  选择输入端ic2映射到TI1上
    TIM2->CCMR1|=0<<12;     //IC1F=0000 配置输入滤波器 不滤波
    TIM2->CCMR1|=0<<10;      //IC2PS=00 不预分频
    
    TIM2->CCER|=1<<5;       //上升沿捕获;
    TIM2->CCER|=1<<4;       //允许捕获;
    
    TIM2->DIER|=1<<2;       //允许捕获中断
    TIM2->DIER|=1<<0;       //允许更新中断
    TIM2->CR1|=0X01;        //使能计数器允许计数
    MY_NVIC_Init(1,0,TIM2_IRQChannel,2);//抢庄优先级2,子优先级0,组2
}

void TIM2_IRQHandler(void)
{    
u16 tsr;
tsr=TIM2->SR;
  if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(tsr&0X01)//溢出
{    
if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
 
}
if(tsr&0x02)//捕获1发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{  
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
   TIM5CH1_CAPTURE_VAL=TIM2->CCR1; //获取当前的捕获值.
TIM2->CCER&=~(1<<1); //CC1P=0 设置为上升沿捕获
}else   //还未开始,第一次捕获上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM2->CNT=0; //计数器清空
TIM2->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
}    
}           
  }
TIM2->SR=0;//清除中断标志位    
}

int main()
{
u32 temp=0;
Stm32_Clock_Init(9);
uart_init(72,9600);
//delay_init(72);
PWM_Init(999,71);
//TIM2_init(0xffff,71);
TIM2_Cap_Init(999, 71);


while(1)
{
 TIM3->CCR2=600;//tim3比较寄存器的值
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
temp=TIM5CH1_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM5CH1_CAPTURE_VAL; //得到总的高电平时间
printf("HIGH:%d us ",temp); //打印总的高点平时间
TIM5CH1_CAPTURE_STA=0; //开启下一次捕获
}

}

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