OpenEdv-开源电子网

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

定时器配置为外部计数【库函数】---求解答。

[复制链接]

19

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
728
金钱
728
注册时间
2015-8-20
在线时间
58 小时
发表于 2017-10-15 04:50:27 | 显示全部楼层 |阅读模式
1金钱
背景:
要测一个方波信号的频率,频率范围是35k---45k。
之前我的思路是:外部中断+定时器中断。
信号来一个上升沿,触发一次外部中断,在外部中断函数里让计数变量(Ex_interrupts)加1.
定时器配置为定时模式,每1s中断一次,每次中断的时候,把(Ex_interrupts)的值记录下来。

这样做的效果不是很理想,测1Hz-1000Hz还挺准的,到了10k之后误差就越来越大,20kHz时差不多有1.1kHz的误差。


下面是我从网上查到的一些提示。
基本思路跟我上面的思路差不多。
区别在于:他是把一个定时器(TIM1)配置成外部计数模式,另一个定时器(TIM2)配置成定时模式.
TIM1负责计数。
TIM2负责定时(比如1s)中断,每次中断时, TIM_GetCounter(TIM1)=记录外部计数的次数(之后再清零,下次在从0开始计数)。

代码如下:
void TIM2_Configuration(void) //只用一个外部脉冲端口
{
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
    TIM_SetCounter(TIM2, 0);
   TIM_Cmd(TIM2, ENABLE);
}

对于TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);这个函数调用不是很清楚
请有识之士,不吝赐教!


最佳答案

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

把你的中断 服务函数尽量精简,然后要同步定时器计时和中断计数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-10-15 04:50:28 | 显示全部楼层
把你的中断 服务函数尽量精简,然后要同步定时器计时和中断计数
回复

使用道具 举报

19

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
728
金钱
728
注册时间
2015-8-20
在线时间
58 小时
 楼主| 发表于 2017-10-16 04:26:19 | 显示全部楼层
正点原子 发表于 2017-10-16 01:20
把你的中断 服务函数尽量精简,然后要同步定时器计时和中断计数

嗯,测频率这个问题我已经解决了!
中断服务函数体过大导致的测量误差我也发现了!

谢谢!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 10:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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