思路是这样的,定时器1的通道1和4,定时器4通道1、2、3、4用来作为输入捕获通道,每个通道捕获都产生中断,各个中断的优先级都是完全一样的,先设置上升沿捕获中断,产生中断后在记录中断捕获值,然后设置下降沿中断,再产生中断后计算捕获的时间,定时器重置值是1000,分频值是72,更新中断后记录定时器溢出的次数并计算总的脉冲宽度,现在现象是有时候正常的,但是我变化宽度后就会出现类似溢
[mw_shl_code=c,true]#include "timer.h"
uint32_t TIM4_UP_Date_IRQCNT = 0;
TIMxCHx TIM1CH1;
TIMxCHx TIM1CH4;
TIMxCHx TIM4CH1;
TIMxCHx TIM4CH2;
TIMxCHx TIM4CH3;
TIMxCHx TIM4CH4;
RC_Channel RC;
/////////////////////////////////////////////////////////////////////
//函数名:Tim1_Init(uint16_t Arr, uint16_t Psc) //
//功 能:初始化定时器1 //
//入 参:装载值 分频值 //
//返 参:无 //
/////////////////////////////////////////////////////////////////////
void Tim1_Init(uint16_t Arr, uint16_t Psc)
{
GPIO_InitTypeDef GPIO_InitStructure; //IO初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TIM1时基初始化
NVIC_InitTypeDef NVIC_InitStructure; //中断向量初始化
TIM_ICInitTypeDef TIM_ICInitStructure; //输入捕获初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //开启TIM1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //开启GPIOA、AFIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_11);
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(TIM1, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //TIM1通道1
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//通道映射到TI1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入不分频
TIM_ICInitStructure.TIM_ICFilter = 0x00; //不滤波
TIM_ICInit(TIM1, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //TIM1通道4
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI4上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入不分频
TIM_ICInitStructure.TIM_ICFilter = 0x00; //不滤波
TIM_ICInit(TIM1, &TIM_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1捕获中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢断1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM1, TIM_IT_CC1|TIM_IT_CC4, ENABLE); //捕获中断使能
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
/////////////////////////////////////////////////////////////////////
//函数名:Tim2_Init(uint16_t Arr, uint16_t Psc) //
//功 能:初始化定时器2 //
//入 参:装载值 分频值 //
//返 参:无 //
/////////////////////////////////////////////////////////////////////
void Tim2_Init(uint16_t Arr, uint16_t Psc)
{ //GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; //时基初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; //输出比较初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //T2初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//GPIOA、AFIO初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较高电平有效
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE); //开启TIM2
}
/////////////////////////////////////////////////////////////////////
//函数名:Tim3_Init(uint16_t Arr, uint16_t Psc) //
//功 能:初始化定时器4支持包 //
//入 参:装载值 分频值 //
//返 参:无 //
/////////////////////////////////////////////////////////////////////
void Tim3_Init(uint16_t Arr, uint16_t Psc)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //时基
TIM_OCInitTypeDef TIM_OCInitStructure; //输出
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //TIM3时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //PA/PB/AFIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PB0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PB1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
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);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出高电平有效
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
}
/////////////////////////////////////////////////////////////////////
//函数名:Tim4_Init(uint16_t Arr, uint16_t Psc) //
//功 能:初始化定时器4 //
//入 参:装载值 分频值 //
//返 参:无 //
/////////////////////////////////////////////////////////////////////
void Tim4_Init(uint16_t Arr, uint16_t Psc)
{
GPIO_InitTypeDef GPIO_InitStructure; //IO初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TIM4时基初始化
NVIC_InitTypeDef NVIC_InitStructure; //中断向量初始化
TIM_ICInitTypeDef TIM_ICInitStructure; //输入捕获初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //开启TIM4时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //开启GPIOA、AFIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PB6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PB7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_7);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, 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(TIM4, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //TIM4通道1
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//通道映射到TI1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入不分频
TIM_ICInitStructure.TIM_ICFilter = 0x00; //不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //TIM4通道2
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI4上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入不分频
TIM_ICInitStructure.TIM_ICFilter = 0x00; //不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; //TIM4通道3
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI4上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入不分频
TIM_ICInitStructure.TIM_ICFilter = 0x00; //不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //TIM4通道4
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI4上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入不分频
TIM_ICInitStructure.TIM_ICFilter = 0x00; //不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢断1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4, ENABLE);
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
void TIM1_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
if(TIM1CH1.CAPTURE_STA & 0X80) //已经捕获到高电平了
{
if((TIM1CH1.CAPTURE_STA & 0X7F) == 0X7F) //高电平太长了
{
TIM1CH1.CAPTURE_STA = 0; //标记成功捕获了一次
}else TIM1CH1.CAPTURE_STA++;
}
if(TIM1CH4.CAPTURE_STA & 0X80)//已经捕获到高电平了
{
if((TIM1CH4.CAPTURE_STA & 0X7F) == 0X7F)//高电平太长了
{
TIM1CH4.CAPTURE_STA = 0;//标记成功捕获了一次
}else TIM1CH4.CAPTURE_STA++;
}
}
if(TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET) //捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); //清除中断标志位
if(TIM1CH1.CAPTURE_STA & 0X80) //已经捕获到了上升沿,现在捕获到了一个下降沿
{
TIM1CH1.CAPTURE_Falling = TIM_GetCapture1(TIM1);
if(TIM1CH1.CAPTURE_STA & 0x7F != 0)
{
TIM1CH1.CAPTURE_STA &= 0x7F;
RC.Ch1 = TIM1CH1.CAPTURE_STA * 1000 - TIM1CH1.CAPTURE_Rising + TIM1CH1.CAPTURE_Falling;
}else
{
RC.Ch1 = TIM1CH1.CAPTURE_Falling - TIM1CH1.CAPTURE_Rising;
}
TIM1CH1.CAPTURE_STA=0; //清空
TIM_OC1PolarityConfig(TIM1, TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //捕获上升沿
{
TIM1CH1.CAPTURE_Rising = TIM_GetCapture1(TIM1);
TIM1CH1.CAPTURE_STA |= 0X80; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM1, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
if(TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) //捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC4); //清除中断标志位
if(TIM1CH4.CAPTURE_STA & 0X80) //已经捕获到了上升沿,现在捕获到了一个下降沿
{
TIM1CH4.CAPTURE_Falling = TIM_GetCapture1(TIM1);
if(TIM1CH4.CAPTURE_STA & 0x7F != 0)
{
TIM1CH4.CAPTURE_STA &= 0x7F;
RC.Ch2 = TIM1CH4.CAPTURE_STA * 1000 - TIM1CH4.CAPTURE_Rising + TIM1CH4.CAPTURE_Falling;
}else
{
RC.Ch2 = TIM1CH4.CAPTURE_Falling - TIM1CH4.CAPTURE_Rising;
}
TIM1CH4.CAPTURE_STA=0; //清空
TIM_OC4PolarityConfig(TIM1, TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //捕获上升沿
{
TIM1CH4.CAPTURE_Rising = TIM_GetCapture4(TIM1);
TIM1CH4.CAPTURE_STA |= 0X80; //标记捕获到了上升沿
TIM_OC4PolarityConfig(TIM1, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
/////////////////////////////////////////////////////////////////////
//函数名:TIM4_IRQHandler(void) //
//功 能:定时器4中断1ms服务程序 //
//入 参:无 //
//返 参:无 //
/////////////////////////////////////////////////////////////////////
void TIM4_IRQHandler(void)
{
static u8 ms_10 = 0;
if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
TIM4_UP_Date_IRQCNT++;
ms_10++;
if(ms_10 == 10)
{
ms_10 = 0;
}
if(TIM4CH1.CAPTURE_STA & 0X80) //已经捕获到上升沿了
{
if((TIM4CH1.CAPTURE_STA & 0X7F) == 0X7F) //高电平太长了,放弃重新开始
{
TIM4CH1.CAPTURE_STA = 0;
}else TIM4CH1.CAPTURE_STA++;
}
if(TIM4CH2.CAPTURE_STA & 0X80)//已经捕获到高电平了
{
if((TIM4CH2.CAPTURE_STA & 0X7F) == 0X7F)//高电平太长了
{
TIM4CH2.CAPTURE_STA = 0;//标记成功捕获了一次
}else TIM4CH2.CAPTURE_STA++;
}
if(TIM4CH3.CAPTURE_STA & 0X80)//已经捕获到高电平了
{
if((TIM4CH3.CAPTURE_STA & 0X7F) == 0X7F)//高电平太长了
{
TIM4CH3.CAPTURE_STA = 0;//标记成功捕获了一次
}else TIM4CH3.CAPTURE_STA++;
}
if(TIM4CH4.CAPTURE_STA & 0X80)//已经捕获到高电平了
{
if((TIM4CH4.CAPTURE_STA & 0X7F) == 0X7F)//高电平太长了
{
TIM4CH4.CAPTURE_STA = 0;//标记成功捕获了
}else TIM4CH4.CAPTURE_STA++;
}
}
if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) //捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
if((TIM4CH1.CAPTURE_STA & 0X80)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) == 0)) //已经捕获到了上升沿,现在捕获到了一个下降沿
{
TIM4CH1.CAPTURE_Falling = TIM_GetCapture1(TIM4);
if(TIM4CH1.CAPTURE_STA & 0x7F != 0)
{
TIM4CH1.CAPTURE_STA = TIM4CH1.CAPTURE_STA & 0x7F;
RC.Ch3 = TIM4CH1.CAPTURE_STA * 1000 - TIM4CH1.CAPTURE_Rising + TIM4CH1.CAPTURE_Falling;
}else
{
RC.Ch3 = TIM4CH1.CAPTURE_Falling - TIM4CH1.CAPTURE_Rising;
}
printf("%d\n", RC.Ch3);
TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) == 1) //捕获上升沿
{
TIM4CH1.CAPTURE_Rising = TIM_GetCapture1(TIM4);
TIM4CH1.CAPTURE_STA = 0; //清空
TIM4CH1.CAPTURE_STA |= 0X80; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
if(TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET) //捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
if(TIM4CH2.CAPTURE_STA & 0X80) //已经捕获到了上升沿,现在捕获到了一个下降沿
{
TIM4CH2.CAPTURE_Falling = TIM_GetCapture2(TIM4);
if(TIM4CH2.CAPTURE_STA & 0x7F != 0)
{
TIM4CH2.CAPTURE_STA &= 0x7F;
RC.Ch4 = TIM4CH2.CAPTURE_STA * 1000 - TIM4CH2.CAPTURE_Rising + TIM4CH2.CAPTURE_Falling;
}else
{
RC.Ch4 = TIM4CH2.CAPTURE_Falling - TIM4CH2.CAPTURE_Rising;
}
TIM4CH2.CAPTURE_STA=0; //清空
TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //捕获上升沿
{
TIM4CH2.CAPTURE_Rising = TIM_GetCapture2(TIM4);
TIM4CH2.CAPTURE_STA |= 0X80; //标记捕获到了上升沿
TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
if(TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET) //捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
if(TIM4CH3.CAPTURE_STA & 0X80) //已经捕获到了上升沿,现在捕获到了一个下降沿
{
TIM4CH3.CAPTURE_Falling = TIM_GetCapture3(TIM4);
if(TIM4CH3.CAPTURE_STA & 0x7F != 0)
{
TIM4CH3.CAPTURE_STA &= 0x7F;
RC.Ch5 = TIM4CH3.CAPTURE_STA * 1000 - TIM4CH3.CAPTURE_Rising + TIM4CH3.CAPTURE_Falling;
}else
{
RC.Ch5 = TIM4CH3.CAPTURE_Falling - TIM4CH3.CAPTURE_Rising;
}
TIM4CH3.CAPTURE_STA=0; //清空
TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //捕获上升沿
{
TIM4CH3.CAPTURE_Rising = TIM_GetCapture3(TIM4);
TIM4CH3.CAPTURE_STA |= 0X80; //标记捕获到了上升沿
TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
if(TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET) //捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);
if(TIM4CH4.CAPTURE_STA & 0X80) //已经捕获到了上升沿,现在捕获到了一个下降沿
{
TIM4CH4.CAPTURE_Falling = TIM_GetCapture4(TIM4);
if(TIM4CH4.CAPTURE_STA & 0x7F != 0)
{
TIM4CH4.CAPTURE_STA &= 0x7F;
RC.Ch6 = TIM4CH4.CAPTURE_STA * 1000 - TIM4CH4.CAPTURE_Rising + TIM4CH4.CAPTURE_Falling;
}else
{
RC.Ch6 = TIM4CH4.CAPTURE_Falling - TIM4CH4.CAPTURE_Rising;
}
TIM4CH4.CAPTURE_STA=0; //清空
TIM_OC4PolarityConfig(TIM4, TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //捕获上升沿
{
TIM4CH4.CAPTURE_Rising = TIM_GetCapture4(TIM4);
TIM4CH4.CAPTURE_STA |= 0X80; //标记捕获到了上升沿
TIM_OC4PolarityConfig(TIM4, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
[/mw_shl_code]
出的错误,不知道什么原因,这是代码 |