OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4640|回复: 3

写了个6通道PWM捕获的程序,偶尔会不正常啊

[复制链接]

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-6-14 12:50:08 | 显示全部楼层 |阅读模式
5金钱
思路是这样的,定时器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]

出的错误,不知道什么原因,这是代码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-14 23:31:21 | 显示全部楼层
先做一个通道,正常了再做2个通道,之后再做你说的6个通道,方便找问题点.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-3-11
在线时间
0 小时
 楼主| 发表于 2014-6-19 09:17:14 | 显示全部楼层
if(TIM4CH4.CAPTURE_STA & 0x7F != 0)
这个if里面的TIM4CH4.CAPTURE_STA & 0x7F加了个括号就都正常了 ,表示不能理解
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-19 23:07:54 | 显示全部楼层
回复【3楼】数字鹰:
---------------------------------
运算符优先级的问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 01:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表