OpenEdv-开源电子网

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

请教定时器外部时钟模式2模式采集脉冲个数的问题

[复制链接]

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-11-24
在线时间
27 小时
发表于 2018-7-6 10:48:37 | 显示全部楼层 |阅读模式
1金钱
请教个问题,我用定时器2的外部时钟模式2检测脉冲个数,用普通IO模拟脉冲波形,然后把这个IO口和定时器2的ETR脚(PA1)短接,定时器2读取到的计数是对的,然后我用定时器3的通道2(PA7)产生PWM波形,把PA7和PA1短接,定时器2计数就不正确了,现象是第一次高电平来的时候,读取到的数值是1,后面再次来高电平时候,数值很大,像是定时器2在高电平期间计数器一直在走。大家有没遇到过这个现象问题
代码如下定时器2的外部模式2初始化代码
I/O口配置下拉和浮空模式都测试过
void TIME1_Init(void)
{

        TIM_TimeBaseInitTypeDef   TIM1_TimeBaseStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //ê1ÄüGPIOíaéèoíAFIO¸′óÃ1|ÄüÄ£¿éê±Öóê1Äü
                                                                                          //óÃóúTIM3μÄCH2êä3öμ&#196WMí¨1y¸ÃLEDÏÔê¾

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_IN_FLOATING; //
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M????
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        TIM_DeInit(TIM2);
        TIM1_TimeBaseStructure.TIM_Period = 0xFFFF;
        TIM1_TimeBaseStructure.TIM_Prescaler = 0x00;
        TIM1_TimeBaseStructure.TIM_ClockDivision = 0x0;
        TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM1_TimeBaseStructure); // Time base configuration


        TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 3);
        TIM_SetCounter(TIM2, 0);
        bcount = 0;
        TIM_Cmd(TIM2, ENABLE);
}
这个是读取I/0模拟脉冲的代码
        TIME1_Init();
        delay_ms(200);
         // GPIO_SetBits(GPIOA,GPIO_Pin_1);                                                 //PA.8 êä3ö¸ß
        for(dir = 0;dir<0xfff0;dir++)
        {
                GPIO_ResetBits(GPIOA,GPIO_Pin_1);
                delay_us(5);
                GPIO_SetBits(GPIOA,GPIO_Pin_1);
                delay_us(5);
        }
        led0pwmval = TIM_GetCounter(TIM2);
       
        delay_ms(50);
        TIM_SetCounter(TIM2, 0);
        led0pwmval=0;
        for(dir = 0;dir<0xff00;dir++)
        {
                GPIO_ResetBits(GPIOA,GPIO_Pin_1);
                delay_us(1);
                GPIO_SetBits(GPIOA,GPIO_Pin_1);
                delay_us(1);
        }
        led0pwmval = TIM_GetCounter(TIM2);




这个是定时器3产生脉冲波,然后在溢出中断里去读取定时器2的计数器
void PWM_Init(u16 arr,u16 psc)
{
        NVIC_InitTypeDef NVIC_InitStructure;       
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //ê1&#196;üGPIOíaéèoíAFIO&#184;′ó&#195;1|&#196;ü&#196;£&#191;éê±&#214;óê1&#196;ü
                                                                                          //ó&#195;óúTIM3μ&#196;CH2ê&#228;3&#246;μ&#196WMí¨1y&#184;&#195;LED&#207;&#212;ê&#190;
                                       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

   //éè&#214;&#195;&#184;&#195;òy&#189;&#197;&#206;a&#184;′ó&#195;ê&#228;3&#246;1|&#196;ü,ê&#228;3&#246;TIM3 CH2μ&#196WM&#194;&#246;3&#229;2¨D&#206;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET); // PA7é&#207;à-       

        TIM_TimeBaseStructure.TIM_Period = arr; //éè&#214;&#195;&#212;ú&#207;&#194;ò&#187;&#184;&#246;&#184;üD&#194;ê&#194;&#188;t×°è&#235;&#187;&#238;&#182;ˉμ&#196;×&#212;&#182;ˉ&#214;&#216;×°&#212;&#216;&#188;&#196;′&#230;&#198;÷&#214;ü&#198;úμ&#196;&#214;μ         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éè&#214;&#195;ó&#195;à′×÷&#206;aTIMxê±&#214;ó&#198;μ&#194;ê3yêyμ&#196;&#212;¤·&#214;&#198;μ&#214;μ  2&#187;·&#214;&#198;μ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //&#184;ù&#190;YTIM_TimeBaseInitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;
       
         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //&#209;&#161;&#212;&#241;&#182;¨ê±&#198;÷&#196;£ê&#189;:TIM&#194;&#246;3&#229;&#191;í&#182;èμ÷&#214;&#198;&#196;£ê&#189;2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è&#189;&#207;ê&#228;3&#246;ê1&#196;ü
        TIM_OCInitStructure.TIM_Pulse = 0; //éè&#214;&#195;′y×°è&#235;2&#182;&#187;&#241;±è&#189;&#207;&#188;&#196;′&#230;&#198;÷μ&#196;&#194;&#246;3&#229;&#214;μ
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê&#228;3&#246;&#188;&#171;D&#212;:TIMê&#228;3&#246;±è&#189;&#207;&#188;&#171;D&#212;&#184;&#223;
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //&#184;ù&#190;YTIM_OCInitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèTIMx
        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //ê1&#196;üTIMx&#212;úCCR2é&#207;μ&#196;&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷
       
        TIM_ARRPreloadConfig(TIM3, ENABLE); //ê1&#196;üTIMx&#212;úARRé&#207;μ&#196;&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷
       


        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3&#214;D&#182;&#207;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //&#207;è&#213;&#188;ó&#197;&#207;è&#188;&#182;0&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //′óó&#197;&#207;è&#188;&#182;3&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±&#187;ê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);  //&#184;ù&#190;YNVIC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèNVIC&#188;&#196;′&#230;&#198;÷
       
        TIM_SetCompare2(TIM3,8);
        TIM_SetCounter(TIM3, 0);
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        acount = 0;
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //ê1&#196;ü&#214;&#184;&#182;¨μ&#196;TIM3&#214;D&#182;&#207;,&#212;êDí&#184;üD&#194;&#214;D&#182;&#207;
        TIM_Cmd(TIM3, ENABLE);  //ê1&#196;üTIMxíaéè


}

void TIM3_IRQHandler(void)
{
                if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //&#188;ì2é&#214;&#184;&#182;¨μ&#196;TIM&#214;D&#182;&#207;·¢éúó&#235;·&#241;:TIM &#214;D&#182;&#207;&#212;′
                {
                        acount++;
                        bcount = TIM_GetCounter(TIM2);
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //&#199;&#229;3yTIMxμ&#196;&#214;D&#182;&#207;′y′|àí&#206;&#187;:TIM &#214;D&#182;&#207;&#212;′
                }
//                if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) //&#188;ì2é&#214;&#184;&#182;¨μ&#196;TIM&#214;D&#182;&#207;·¢éúó&#235;·&#241;:TIM &#214;D&#182;&#207;&#212;′
//                {
//                        bcount = TIM_GetCounter(TIM3);
//                        TIM_ClearITPendingBit(TIM3, TIM_IT_CC2  );  //&#199;&#229;3yTIMxμ&#196;&#214;D&#182;&#207;′y′|àí&#206;&#187;:TIM &#214;D&#182;&#207;&#212;′
//                }
}

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

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-11-24
在线时间
27 小时
 楼主| 发表于 2018-7-6 10:56:59 | 显示全部楼层
本帖最后由 默铭 于 2018-7-6 10:59 编辑

1530845709(1).png 这个是仿真读取到的,一次定时3的溢出中断就代表一个脉冲波,可以看到第一次中断,定时器2的计数器也是1,然后第2个脉冲波到来时,定时器2的计数器非常大
1530845784(1).png


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2018-7-7 01:09:23 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2022-6-27
在线时间
0 小时
发表于 2022-6-27 22:47:59 | 显示全部楼层
改一下TIM2的TIM_Prescaler 试试, 我也遇到这个问题了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 19:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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