OpenEdv-开源电子网

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

关于同时接收四路脉冲

[复制链接]

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-8-6
在线时间
2 小时
发表于 2015-8-9 12:55:25 | 显示全部楼层 |阅读模式
5金钱
定时器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]

最佳答案

查看完整内容[请看2#楼]

你中断处理就只做了一路,自然只能有一路能获得正确的值了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-9 12:55:26 | 显示全部楼层
你中断处理就只做了一路,自然只能有一路能获得正确的值了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-8-6
在线时间
2 小时
 楼主| 发表于 2015-8-15 22:20:14 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
哦哦谢谢啦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 21:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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