求一段F407多通道输入捕获的代码(寄存器版)

2019-07-20 11:00发布

求一段F407多通道输入捕获的代码(寄存器版),已经卡在此地好久了,没有个明白人给指点一下,自己编的代码不报错,就是不工作,不胜感激涕零呀 [mw_shl_code=c,true]void TIM5_CH2_Cap_Init(u32 arr,u16 psc) { RCC->APB1ENR|=1<<3; //TIM5 时钟使能 RCC->AHB1ENR|=1<<0; //使能PORTA时钟 GPIO_Set(GPIOA,PIN1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//复用功能,下拉 GPIO_AF_Set(GPIOA,1,2); //PA1,AF2,TIM5-CH2 qinhao TIM5->ARR=arr; //设定计数器自动重装值 TIM5->SC=psc; //预分频器 TIM5->CCMR1|=1<<8; //CC2S=01 选择输入端 IC2映射到TI2上 TIM5->CCMR1|=0<<12; //IC2F=0000 配置输入滤波器 不滤波 TIM5->CCMR1|=0<<10; //IC2PSC=00 配置输入分频,不分频 TIM5->CCER&=~(1<<5); //CC2P=0 上升沿捕获 TIM5->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中 TIM5->EGR=1<<0; //软件控制产生更新事件,使写入PSC的值立即生效,否则将会要等到定时器溢出才会生效! TIM5->DIER|=1<<2; //允许捕获2中断 TIM5->DIER|=1<<0; //允许更新中断 TIM5->CR1|=0x01; //使能计数器 MY_NVIC_Init(2,1,TIM5_IRQn,2);//抢占2,子优先级1(CH1为0),组2 } u8 TIM5CH2_CAPTURE_STA=0; //输入捕获状态 u32 TIM5CH2_CAPTURE_VAL; //输入捕获值(TIM2/TIM5是32位) //定时器5中断服务程序 void TIM5_IRQHandler(void)//添加到原中断服务子函数里去--qinhao { u16 tsr; tsr=TIM5->SR; if((TIM5CH2_CAPTURE_STA&0X80)==0)//还未成功捕获 { if(tsr&0X01)//溢出更新中断 { if(TIM5CH2_CAPTURE_STA&0X40)//已经捕获到上升沿 { if((TIM5CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 { TIM5CH2_CAPTURE_STA|=0X80; //标记成功捕获了一次 TIM5CH2_CAPTURE_VAL=0XFFFFFFFF; }else TIM5CH2_CAPTURE_STA++; } } if(tsr&0x04)//捕获2发生捕获事件--qinhao { if(TIM5CH2_CAPTURE_STA&0X40) //则表示本次捕获到一个下降沿 { TIM5CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽 TIM5CH2_CAPTURE_VAL=TIM5->CCR2; //获取当前的捕获值.CCR2 TIM5->CCER&=~(1<<5); //CC2P=0 设置为上升沿捕获 }else //第一次捕获到上升沿 { TIM5CH2_CAPTURE_STA=0; //清空 TIM5CH2_CAPTURE_VAL=0; TIM5CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM5->CR1&=~(1<<0) ; //定时器5清零,重启 TIM5->CNT=0; //计数器清空 TIM5->CCER|=1<<5; //CC2P=1 设置为下降沿捕获 TIM5->CR1|=0x01; //使能定时器5 } } } TIM5->SR=0;//清除中断标志位 } int capture(void) { //long long temp=0; long long temp2=0;//qinhao //TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);//以1Mhz的频率计数 TIM5_CH2_Cap_Init(0XFFFFFFFF,84-1);//以1Mhz的频率计数 while(1) { if(TIM5CH2_CAPTURE_STA&0X80)//成功捕获到了一次高电平 { temp2=TIM5CH2_CAPTURE_STA&0X3F; temp2*=0XFFFFFFFF; //溢出时间总和 temp2+=TIM5CH2_CAPTURE_VAL; //得到总的高电平时间 printf("HIGH2:%lld us ",temp2);//打印总的高点平时间 TIM5CH2_CAPTURE_STA=0; //开启下一次捕获 } //LED0_PWM_VAL=temp; } }[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。