OpenEdv-开源电子网

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

求助大神,一个计数器触发另一个计数器计数的问题

[复制链接]

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-5-14
在线时间
6 小时
发表于 2015-6-19 09:40:47 | 显示全部楼层 |阅读模式
5金钱
最近在研究用2个计数器串联计外部脉冲,采用主从模式,主计数器计(TIM1)低16位,从计数器(TIM2)计高16位,大概的配置如下:
        时钟、GPIO配置略
        //定时器TIM1初始化
        TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;         //自动重装载计数值
        TIM_TimeBaseInitStruct.TIM_Prescaler =0x0000;        //预分频系数0+1,不分频
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down; //向下计数        
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);                
        //CH2通道输入TI1,上升沿计数,无滤波器
        TIM_TIxExternalClockConfig(TIM1,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0x0);        
        TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable); 
        //010:更新 – 更新事件被选为触发输入(TRGO)。
        //例如,一个主定时器的时钟可以被用作一个从定时器的预分频器。
        TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);        

        //定时器TIM2初始化
        TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;         //自动重装载计数值
        TIM_TimeBaseInitStruct.TIM_Prescaler =0x0000;        //预分频系数0+1,不分频
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down; //向下计数
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);        

        //连接定时器1的TRGO1输出至定时器2,设置TIM2_SMCR寄存器的TS=’000’,
        //配置定时器2为使用ITR1作为内部触发的从模式。
        TIM_SelectInputTrigger(TIM2,TIM_TS_ITR0);
        //然后把从模式控制器置于外部时钟模式1(TIM2_SMCR寄存器的SMS=111);
        //这样定时器2即可由定时器1周期性的上升沿(即定时器1的计数器溢出)信号驱动。
        TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_External1);
        TIM_Cmd(TIM1,ENABLE); //使能TIM1
        TIM_Cmd(TIM2,ENABLE); //使能TIM2

        大致的思路是外部脉冲接TIM1的CH1(PA8),当向下计数溢出时产生更新事件,输出TRGO至TIM2的ITR1,这个TIM1每溢出一次,TIM2计数器减1,在1s中断处理,用前1秒计数减去当前计数,可得出每秒计数即频率值。
       调试的时候,频率不对,然后分别输出TIM1和TIM2的计数器,发现TIM2计数值不对,比如我输入超过65535H在的频率,让TIM1每秒都溢出,但是结果是TIM2的计数值要过几秒以后才减1,感觉像是TIM2没计到似的,怀疑是不是配置有问题,然后各种看参考手册寄存器库函数,也没发现问题,后来想难道是TIM1没有产生更新中断,所以导致TIM2没计到?在TIM1加入更新中断配置,如下:
        //允许更新中断
        // TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);        
        //中断优先级NVIC设置 
       // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//0位抢占优先级,4位相应优先级        
         //NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;         //-_-
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//-_-
         //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//-_-
         //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//-_-
        // NVIC_Init(&NVIC_InitStructure);//-_-

        在中断函数里清标志位,结果居然好使了!!!
       接着调试看看是哪的问题,只要我编译上面带//-_-的红色代码的任意一行,如第2行,都可以,即使没有中断函数。难道是加延迟?加延迟语句也是不行。不知道大神们调没调过“使用一个定时器作为另一个的预分频器”,加一条语句就好使,这也太奇怪了!
       另外请问大神,输入26MHz,显示25997218Hz,输入27MHz,误差就很大了,难道这是外部输入脉冲的上限?

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-20 00:03:48 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 02:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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