对于遥控器的接收,首先想到的是TIM2和TIM3虽然进行了初始化,但是并没有发挥什么作用
查看他们的中断函数,两个中断函数在同一文件里,以TIM2为例
u8 Rc_Capture_Sta[6] = {0};//6个通道的捕获状态 u16 Rc_Channel_Val[6] = {0};//6个通道的捕获值 /* * 函数名:TIM2_IRQHandler * 描述 :定时器2输入捕获中断函数 * 输入 :无 * 输出 :无 */ void TIM2_IRQHandler(void) { //**************************捕获1发生捕获事件************************** if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { if(Rc_Capture_Sta[0]) //捕获到下降沿 { Rc_Channel_Val[0] = TIM_GetCapture1(TIM2); //读取捕获值,这里为PWM高电平时间 Rc_Capture_Sta[0] = 0; //标记捕获到下升沿 TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else //捕获到上升沿 { TIM_SetCounter(TIM2,0); //计数器立刻清零计数 Rc_Capture_Sta[0] = 1; //标记捕获到了上升沿 TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //设置为下降沿捕获 } TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 | TIM_IT_Update ); //清除通道1中断标志位 } //**************************捕获2发生捕获事件************************** if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) { if(Rc_Capture_Sta[1]) //捕获到下降沿 { Rc_Channel_Val[1] = TIM_GetCapture2(TIM2); //读取捕获值,这里为PWM高电平时间 Rc_Capture_Sta[1] = 0; //标记捕获到下升沿 TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else //捕获到上升沿 { Rc_Capture_Sta[1] = 1; //计数器立刻清零计数 TIM_SetCounter(TIM2,0); //标记捕获到了上升沿 TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //设置为下降沿捕获 } TIM_ClearITPendingBit(TIM2, TIM_IT_CC2 ); //清除通道2中断标志位 } //**************************捕获3发生捕获事件************************** if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET) { if(Rc_Capture_Sta[2]) //捕获到下降沿 { Rc_Channel_Val[2]=TIM_GetCapture3(TIM2); //读取捕获值,这里为PWM高电平时间 Rc_Capture_Sta[2]=0; //标记捕获到下升沿 TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else //捕获到上升沿 { Rc_Capture_Sta[2]=1; //计数器立刻清零计数 TIM_SetCounter(TIM2,0); //标记捕获到了上升沿 TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling); //设置为下降沿捕获 } TIM_ClearITPendingBit(TIM2, TIM_IT_CC3 ); //清除通道3中断标志位 } //**************************捕获4发生捕获事件************************** if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET) { if(Rc_Capture_Sta[3]) //捕获到下降沿 { Rc_Channel_Val[3]=TIM_GetCapture4(TIM2); //读取捕获值,这里为PWM高电平时间 Rc_Capture_Sta[3]=0; //标记捕获到下升沿 TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else //捕获到上升沿 { Rc_Capture_Sta[3]=1; //计数器立刻清零计数 TIM_SetCounter(TIM2,0); //标记捕获到了上升沿 TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Falling); //设置为下降沿捕获 } TIM_ClearITPendingBit(TIM2, TIM_IT_CC4 ); //清除通道4中断标志位 } } /* * 函数名:TIM3_IRQHandler * 描述 :定时器3输入捕获中断函数 * 输入 :无 * 输出 :无 */ void TIM3_IRQHandler(void) { //**************************捕获1发生捕获事件************************** if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) { if(Rc_Capture_Sta[4]) //捕获到下降沿 { Rc_Channel_Val[4] = TIM_GetCapture1(TIM3); //读取捕获值,这里为PWM高电平时间 Rc_Capture_Sta[4] = 0; //标记捕获到下升沿 TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else //捕获到上升沿 { TIM_SetCounter(TIM3,0); //计数器立刻清零计数 Rc_Capture_Sta[4] = 1; //标记捕获到了上升沿 TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling); //设置为下降沿捕获 } TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 | TIM_IT_Update ); //清除通道1中断标志位 } //**************************捕获2发生捕获事件************************** if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) { if(Rc_Capture_Sta[5]) //捕获到下降沿 { Rc_Channel_Val[5] = TIM_GetCapture2(TIM3); //读取捕获值,这里为PWM高电平时间 Rc_Capture_Sta[5] = 0; //标记捕获到下升沿 TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else //捕获到上升沿 { Rc_Capture_Sta[5] = 1; //计数器立刻清零计数 TIM_SetCounter(TIM3,0); //标记捕获到了上升沿 TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Falling); //设置为下降沿捕获 } TIM_ClearITPendingBit(TIM3, TIM_IT_CC2 ); //清除通道2中断标志位 } }
其实这些是我在看姿态控制的时候偶然发现的这里的TIM2的4个通道加TIM3的2个通道,共6个通道,
在这里TIM2的4个通道中断函数类似,这里以1通道为例;
在初始化的时候if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { if(Rc_Capture_Sta[0]) //捕获到下降沿 { Rc_Channel_Val[0]=TIM_GetCapture1(TIM2); //读取捕获值,这里为PWM高电平时间 Rc_Capture_Sta[0]=0; //标记捕获到下升沿 TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else //捕获到上升沿 { TIM_SetCounter(TIM2,0); //计数器立刻清零计数 Rc_Capture_Sta[0]=1; //标记捕获到了上升沿 TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);//设置为下降沿捕获 } TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 | TIM_IT_Update ); //清除通道1中断标志位 }
上升沿触发中断,首先捕获中断,计数器清零,标记捕获了上升沿,将中断设置成下降沿触发,清除道1中断标志位,然后再次触发的时候,下降沿触发,获得TIMx输入捕获1的值即通道1的遥控输入,将中断设置成上升沿触发,清除道1中断标志位,这里的设置不是很清楚,可能是为了消抖,具体是为什么再查查。TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
但是在清除清除通道1中断标志位的时候同时清除了TIM2中断源,
而在清除清除通道2中断标志位的时候就没有清除TIM2中断源为什么????
TIM3中断函数也是这样处理.