定时器TIM1发出pwm波,定时器TIM2的四个通道进行捕获,然而只有一个通道好使,百思不得其解。。。附上程序代码,各位高手求解::
[mw_shl_code=c,true]#include "timer.h"
#include "led.h"
#include "usart.h"
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//±????ò???©?§?°?????????×÷???í???????????????ü????????
//ALIENTEK Mini STM32??·?°?
//PWM ?????ú??
//?????×?@ALIENTEK
//????????:www.openedv.com
//????????:2010/12/03
//°?±???V1.0
//°??¨?ù??????°?±?????
//Copyright(C) ?????×? 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//TIM1 PWM??????????
void TIM1_PWM_Init(u16 arr1,u16 psc1)
{
GPIO_InitTypeDef GPIO_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
TIM_OCInitTypeDef TIM_OCInitStructure1;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //????GPIO???è?±??????
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //????GPIO???è?±??????
//?è??????????????????????,????TIM1 CH2??PWM?????¨??
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_6; //TIM_CH2
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì????
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure1);
GPIO_Init(GPIOB, &GPIO_InitStructure1);
//GPIO_SetBits(GPIOB,GPIO_Pin_6);
TIM_TimeBaseStructure1.TIM_Period = arr1; //?è???????????ü??????×°????????×?????×°???????÷???????? 80K
TIM_TimeBaseStructure1.TIM_Prescaler =psc1; //?è??????×÷??TIMx?±?????????????¤·????? ??·???
TIM_TimeBaseStructure1.TIM_ClockDivision = 0; //?è???±??·???:TDTS = Tck_tim
TIM_TimeBaseStructure1.TIM_CounterMode = TIM_CounterMode_Up; //TIM?ò??????????
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure1); //?ù??TIM_TimeBaseInitStruct?????¨????????????TIMx???±???ù??????
TIM_OCInitStructure1.TIM_OCMode = TIM_OCMode_PWM1; //?????¨?±?÷????:TIM?????í???÷??????2
TIM_OCInitStructure1.TIM_OutputState = TIM_OutputState_Enable; //±???????????
TIM_OCInitStructure1.TIM_Pulse = 0; //?è????×°??????±????????÷????????
TIM_OCInitStructure1.TIM_OCPolarity = TIM_OCPolarity_High; //????????:TIM????±?????????
TIM_OC1Init(TIM1, &TIM_OCInitStructure1); //?ù??TIM_OCInitStruct?????¨???????????????èTIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE ?÷????????
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1?¤×°??????
TIM_ARRPreloadConfig(TIM1, ENABLE); //????TIMx??ARR?????¤×°???????÷
TIM_Cmd(TIM1, ENABLE); //????TIM1
}
//?¨?±?÷2?¨??1????????????
TIM_ICInitTypeDef TIM2_ICInitStructure;
void TIM2_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //????TIM2?±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //????GPIOA?±??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //PA0 ?????®?°?è??
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 ????
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //PA0 ???
//???????¨?±?÷2 TIM2
TIM_TimeBaseStructure.TIM_Period = arr; //?è?¨?????÷×?????×°??
TIM_TimeBaseStructure.TIM_Prescaler =psc; //?¤·????÷
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //?è???±??·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM?ò??????????
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //?ù??TIM_TimeBaseInitStruct?????¨????????????TIMx???±???ù??????
//??????TIM2????????CH1
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 ??????????IC1??????TI1??
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //??????????
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //??????TI1??
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //????????·???,??·???
TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ???????????¨?÷ ?????¨
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
//??????TIM2????????CH2
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01 ??????????IC1??????TI1??
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //??????????
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //??????TI1??
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //????????·???,??·???
TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ???????????¨?÷ ?????¨
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
//??????TIM2????????CH3
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01 ??????????IC1??????TI1??
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //??????????
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //??????TI1??
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //????????·???,??·???
TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ???????????¨?÷ ?????¨
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
//??????TIM2????????CH4
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_4; //CC1S=01 ??????????IC1??????TI1??
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //??????????
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //??????TI1??
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //????????·???,??·???
TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ???????????¨?÷ ?????¨
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
//????·?×é??????
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2????
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //??????????2??
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //????????0??
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??±?????
NVIC_Init(&NVIC_InitStructure); //?ù??NVIC_InitStruct?????¨???????????????èNVIC?????÷
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//???í?ü?????? ,???íCC1IE????????
TIM_Cmd(TIM2,ENABLE ); //?????¨?±?÷2
}
u8 TIM2CH1_CAPTURE_STA=0; //????????×???
u16 TIM2CH1_CAPTURE_VAL; //??????????
u8 TIM2CH2_CAPTURE_STA=0; //????????×???
u16 TIM2CH2_CAPTURE_VAL; //??????????
u8 TIM2CH3_CAPTURE_STA=0; //????????×???
u16 TIM2CH3_CAPTURE_VAL; //??????????
u8 TIM2CH4_CAPTURE_STA=0; //????????×???
u16 TIM2CH4_CAPTURE_VAL; //??????????
//?¨?±?÷2????·??????ò
void TIM2_IRQHandler(void)
{
// if((TIM2CH1_CAPTURE_STA&0X80)==0)//????????????
//{
// if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
//
// {
// if(TIM2CH1_CAPTURE_STA&0X40)//?????????????????
// {
// if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//?????????¤??
// {
// TIM2CH1_CAPTURE_STA|=0X80;//±ê????????????????
// TIM2CH1_CAPTURE_VAL=0XFFFF;
// }else TIM2CH1_CAPTURE_STA++;
// }
// }
// if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//????1·??ú????????
// {
// if(TIM2CH1_CAPTURE_STA&0X40) //????????????????
// {
// TIM2CH1_CAPTURE_STA|=0X80; //±ê??????????????????????
// TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
// TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 ?è??????????????
// }else //????????,????????????????
// {
// TIM2CH1_CAPTURE_STA=0; //????
// TIM2CH1_CAPTURE_VAL=0;
// TIM_SetCounter(TIM2,0);
// TIM2CH1_CAPTURE_STA|=0X40; //±ê????????????????
// TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 ?è??????????????
//}
// }
// }
// TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //????????±ê????
if((TIM2CH2_CAPTURE_STA&0X80)==0)//????????????
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH2_CAPTURE_STA&0X40)//?????????????????
{
if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//?????????¤??
{
TIM2CH2_CAPTURE_STA|=0X80;//±ê????????????????
TIM2CH2_CAPTURE_VAL=0XFFFF;
}else TIM2CH2_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//????1·??ú????????
{
if(TIM2CH2_CAPTURE_STA&0X40) //????????????????
{
TIM2CH2_CAPTURE_STA|=0X80; //±ê??????????????????????
TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2);
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 ?è??????????????
}else //????????,????????????????
{
TIM2CH2_CAPTURE_STA=0; //????
TIM2CH2_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH2_CAPTURE_STA|=0X40; //±ê????????????????
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 ?è??????????????
}
}
}
// TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //????????±ê????
[/mw_shl_code]
|