一下便為4路PWM輸入捕獲:
#include "capture.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
TIM_ICInitTypeDef TIM3_ICInitStructure;
void TIM3_Capture(u16 arr,u16 psc) //接收函數的初始化工作,比較基礎,不做詳細概述
{ GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //輸入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
//GPIO_InitStructure.GPIO_Speed=2»Dèòa
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); //注意要將捕獲的引腳做到下拉,再進行捕獲
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //¶¨ê±Æ÷3ÅäÖÃ
//3õê¼»ˉTIM3êäèë2¶»ñμÄ2Îêy
TIM3_ICInitStructure.TIM_Channel=TIM_Channel_1;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;//ÅäÖÃÂË2¨Æ÷ £¬2»ÂË2¨
TIM_ICInit(TIM3,&TIM3_ICInitStructure);
TIM3_ICInitStructure.TIM_Channel=TIM_Channel_2;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;
TIM_ICInit(TIM3,&TIM3_ICInitStructure);
TIM3_ICInitStructure.TIM_Channel=TIM_Channel_3;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;
TIM_ICInit(TIM3,&TIM3_ICInitStructure);
TIM3_ICInitStructure.TIM_Channel=TIM_Channel_4;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;
TIM_ICInit(TIM3,&TIM3_ICInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE); //ÔêDíCC1IE2¶»ñÖD¶Ï
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC2,ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC3,ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC4,ENABLE);
TIM_Cmd(TIM3,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//í¨μàéèÖÃÎaTIM3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//ÇàÕ¼0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//Ïìó|2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//′ò¿aÖD¶Ïí¨μà
NVIC_Init(&NVIC_InitStructure);
}
u8 TIM3CH1_CAPTURE_STA=0; //高兩位做捕獲標志,低六位做溢出計數
u16 TIM3CH1_CAPTURE_VAL; //
u32 temp1=0;
u8 TIM3CH2_CAPTURE_STA=0;
u16 TIM3CH2_CAPTURE_VAL;
u32 temp2=0;
u8 TIM3CH3_CAPTURE_STA=0;
u16 TIM3CH3_CAPTURE_VAL;
u32 temp3=0;
u8 TIM3CH4_CAPTURE_STA=0;
u16 TIM3CH4_CAPTURE_VAL;
u32 temp4=0;
void CaptureGesture(void)//接收姿態解算
{
if(TIM3CH1_CAPTURE_STA&0x80)
{temp1=TIM3CH1_CAPTURE_STA&0X3F; //更新中斷的次數
temp1*=20000; //20000的自動重裝載值。
TIM3CH1_CAPTURE_VAL+=temp1; //當前的VAL值加上若有更新中斷的值
CA_CH.ROLL=TIM3CH1_CAPTURE_VAL;
TIM3CH1_CAPTURE_STA=0;
}
if(TIM3CH2_CAPTURE_STA&0x80)
{temp2=TIM3CH2_CAPTURE_STA&0X3F;
temp2*=20000;
TIM3CH2_CAPTURE_VAL+=temp2;
CA_CH.PITCH=TIM3CH2_CAPTURE_VAL;
TIM3CH2_CAPTURE_STA=0;
}
if(TIM3CH3_CAPTURE_STA&0x80)
{temp3=TIM3CH3_CAPTURE_STA&0X3F;
temp3*=20000;
TIM3CH3_CAPTURE_VAL+=temp3;
CA_CH.YAW=TIM3CH3_CAPTURE_VAL;
TIM3CH3_CAPTURE_STA=0;
}
if(TIM3CH4_CAPTURE_STA&0x80)
{temp4=TIM3CH4_CAPTURE_STA&0X3F;
temp4*=20000;
TIM3CH4_CAPTURE_VAL+=temp4;
CA_CH.THROTTLE=TIM3CH4_CAPTURE_VAL;
TIM3CH4_CAPTURE_STA=0;
}
}
//TIM_SetCounter(TIM5,0); ¼ÆêyÆ÷μÄÖμÇåáã¡£¸Ãoˉêy¿éòÔÇåáã¼ÆêyÆ÷¼Ä′æÆ÷μÄÖμ¡£
void TIM3_IRQHandler(void)
{
//CC1
if((TIM3CH1_CAPTURE_STA&0X80)==0)//還沒捕獲成功
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
if(TIM3CH1_CAPTURE_STA&0X40)//ò已經捕獲到高電平了
{
if((TIM3CH1_CAPTURE_STA&0X3F)==0X3F)/高電平太長了
{
TIM3CH1_CAPTURE_STA|=0X80;//標記成功捕獲依次
TIM3CH1_CAPTURE_VAL=20000;
}else TIM3CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕獲1發生捕獲事件
{ TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
if(TIM3CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM3CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一個下降沿
TIM3CH1_CAPTURE_VAL=TIM_GetCapture1(TIM3);
TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC1P=0 設置為上升沿捕獲
}else //還未開始,第一次上升沿捕獲
{
TIM3CH1_CAPTURE_STA=0; //清空
TIM3CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM3,0);
TIM3CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿,下次捕獲下降沿
TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling); //CC1P=1 設置為下降沿捕獲
}
}
}
//CC2
if((TIM3CH2_CAPTURE_STA&0X80)==0)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
if(TIM3CH2_CAPTURE_STA&0X40)
{
if((TIM3CH2_CAPTURE_STA&0X3F)==0X3F)
{
TIM3CH2_CAPTURE_STA|=0X80;
TIM3CH2_CAPTURE_VAL=20000;
}else TIM3CH2_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
if(TIM3CH2_CAPTURE_STA&0X40)
{
TIM3CH2_CAPTURE_STA|=0X80;
TIM3CH2_CAPTURE_VAL=TIM_GetCapture2(TIM3);
TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising);
}else
{
TIM3CH2_CAPTURE_STA=0;
TIM3CH2_CAPTURE_VAL=0;
TIM_SetCounter(TIM3,0);
TIM3CH2_CAPTURE_STA|=0X40;
TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Falling);
}
}
}
//CC3
if((TIM3CH3_CAPTURE_STA&0X80)==0)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
if(TIM3CH3_CAPTURE_STA&0X40)
{
if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F)
{
TIM3CH3_CAPTURE_STA|=0X80;
TIM3CH3_CAPTURE_VAL=20000;
}else TIM3CH3_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_CC3);
if(TIM3CH3_CAPTURE_STA&0X40)
{
TIM3CH3_CAPTURE_STA|=0X80;
TIM3CH3_CAPTURE_VAL=TIM_GetCapture3(TIM3);
TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Rising);
}else
{
TIM3CH3_CAPTURE_STA=0;
TIM3CH3_CAPTURE_VAL=0;
TIM_SetCounter(TIM3,0);
TIM3CH3_CAPTURE_STA|=0X40;
TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Falling);
}
}
}
//CC4
if((TIM3CH4_CAPTURE_STA&0X80)==0)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
if(TIM3CH4_CAPTURE_STA&0X40)
{
if((TIM3CH4_CAPTURE_STA&0X3F)==0X3F)
{
TIM3CH4_CAPTURE_STA|=0X80;
TIM3CH4_CAPTURE_VAL=20000;
}else TIM3CH4_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{ TIM_ClearITPendingBit(TIM3,TIM_IT_CC4);
if(TIM3CH4_CAPTURE_STA&0X40)
{
TIM3CH4_CAPTURE_STA|=0X80;
TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3);
TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising);
}else
{TIM3CH4_CAPTURE_STA=0;
TIM3CH4_CAPTURE_VAL=0;
TIM_SetCounter(TIM3,0);
TIM3CH4_CAPTURE_STA|=0X40;
TIM_OC4PolarityConfig(TIM3,TIM_ICPolarity_Falling);
}
}
}
CaptureGesture();
}
以上便為核心函數。不同的單片機還需稍加改變。大家可以通過串口通信來檢測捕獲是否成功。可以利用printf函數打印到串口上,相對比較方便。
在主函數中 初始化串口再初始化定時器輸入捕獲,就可以通過串口通信來檢測是否成功捕獲。希望大家可以采納。本人剛剛起步,若有錯誤,多多指教。  
|