求一段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]
一周热门 更多>