OpenEdv-开源电子网

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

STM32使用定时器计算时间问题

[复制链接]

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
发表于 2016-7-11 16:41:55 | 显示全部楼层 |阅读模式
我采用stm32的定时器来计时,实现的方式是在定时器中断里面去设置变量让其加加,但是每次计算到的时间和实际比较起来都是2倍的关系???

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

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 16:43:29 | 显示全部楼层
void TIM4_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1 ;  
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

       

        //ÖD¶ÏóÅÏè¼¶NVIC
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);


                                 
}
void TIM4_IRQHandler(void)   //TIM4ÖD¶Ï
{
       
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
                {
                   TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
                        reacttime++;
                     
                }
}

void startcounttime(void){
        TIM_Cmd(TIM4, ENABLE);  //ê1ÄüTIMx       
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
}
void stopcounttime(void){
        TIM_Cmd(TIM4, DISABLE);  //ê1ÄüTIMx               
        TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE );
}

回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 16:44:48 | 显示全部楼层
有没有可能是计数方式的问题 但是没有那种同时向上又向下计数的技术方式额!!!知道的大牛进来说一下啊!!!!
回复 支持 反对

使用道具 举报

6

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1581
金钱
1581
注册时间
2016-7-2
在线时间
277 小时
发表于 2016-7-11 17:00:58 | 显示全部楼层
你用的是中央对齐模式,是不是这里产生的问题
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 17:01:57 | 显示全部楼层
迪拜大呲花 发表于 2016-7-11 17:00
你用的是中央对齐模式,是不是这里产生的问题

不是,我一开始用的是向上计数的方式,结果也是一样!!!!
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-11 17:15:01 | 显示全部楼层
你怎么算的?
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 17:22:44 | 显示全部楼层

就是每进入一次定时器的中断处理函数就让全局变量加1啊,定时器就是每1us进入一次中断服务程序额!!!!!
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-11 17:26:35 | 显示全部楼层
你验证过你的定时器是1us进一次中断吗?
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 17:31:15 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-11 17:26
你验证过你的定时器是1us进一次中断吗?

这个要怎么验证?????
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 17:33:30 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-11 17:26
你验证过你的定时器是1us进一次中断吗?

我分频系数是72 TIM3的时钟是72MHZ 这样计算完 溢出时间不就刚好是1us?????
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-11 17:37:23 | 显示全部楼层
thrive 发表于 2016-7-11 17:33
我分频系数是72 TIM3的时钟是72MHZ 这样计算完 溢出时间不就刚好是1us?????

最简单的IO口输出高低电平,挂示波器看
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 17:43:25 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-11 17:37
最简单的IO口输出高低电平,挂示波器看

你意思是输出PWM波吧,我之前看过了,没错!!!!
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-11 17:45:31 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-11 17:37
最简单的IO口输出高低电平,挂示波器看

不过我想如果是确定都是成两倍关系的话,那每次就加2得了,但是为什么会是两倍关系,明明设置的是1us的溢出时间,没搞明白
回复 支持 反对

使用道具 举报

6

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1581
金钱
1581
注册时间
2016-7-2
在线时间
277 小时
发表于 2016-7-12 08:26:50 | 显示全部楼层
thrive 发表于 2016-7-11 17:33
我分频系数是72 TIM3的时钟是72MHZ 这样计算完 溢出时间不就刚好是1us?????

T=(arr+1)*(psc+1)/72,你是不是这里计算错了
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-12 08:57:19 | 显示全部楼层
thrive 发表于 2016-7-11 17:45
不过我想如果是确定都是成两倍关系的话,那每次就加2得了,但是为什么会是两倍关系,明明设置的是1us的溢 ...

1、你的定时器中断1us进一次,你说验证过了
2、每进一次标志位+1
3、你用标志位计算出来的值是实际值的2倍
你好好想想吧,你的逻辑就有错误,你肯定有一步搞错了,我怀疑你的定时器不是1us的
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-12 15:57:59 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-12 08:57
1、你的定时器中断1us进一次,你说验证过了
2、每进一次标志位+1
3、你用标志位计算出来的值是实际值的 ...

定时器是1us的没错,但是每次进中断服务程序的时间是2us
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-13 10:46:48 | 显示全部楼层
thrive 发表于 2016-7-12 15:57
定时器是1us的没错,但是每次进中断服务程序的时间是2us

我的理解是:定时器1us你是计算出来的,但是算错了,所以每次进中断的时间是2us
你之前说的挂示波器验证了定时器是1us的,现在又说进中断时间是2us,不是自相矛盾吗,不知道你是怎么验证的
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-15 09:44:53 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-13 10:46
我的理解是:定时器1us你是计算出来的,但是算错了,所以每次进中断的时间是2us
你之前说的挂示波器验证 ...

我想问一下用示波器查看的时候,底下那个M代表的就是溢出时间吗???
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-15 09:54:01 | 显示全部楼层
thrive 发表于 2016-7-15 09:44
我想问一下用示波器查看的时候,底下那个M代表的就是溢出时间吗???

示波器可以调每个格子的单位时间的,然后乘以格数就是时间
你的arr和psc值是多少?
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-15 15:53:32 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-15 09:54
示波器可以调每个格子的单位时间的,然后乘以格数就是时间
你的arr和psc值是多少?

我刚才看了下示波器,我底下那个M的值上面显示的是2us
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-15 16:02:10 | 显示全部楼层
thrive 发表于 2016-7-15 15:53
我刚才看了下示波器,我底下那个M的值上面显示的是2us

((1+TIM_Prescaler )/72M)*(1+TIM_Period ),这是公式
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-15 22:37:40 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-15 16:02
((1+TIM_Prescaler )/72M)*(1+TIM_Period ),这是公式

额,谢谢了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-7-18
在线时间
0 小时
发表于 2016-7-19 09:58:36 | 显示全部楼层
thrive 发表于 2016-7-11 17:33
我分频系数是72 TIM3的时钟是72MHZ 这样计算完 溢出时间不就刚好是1us?????

你是F407吗  我查芯片手册 TIM3的最高是42MHZ
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-21 10:29:39 | 显示全部楼层
goforlove 发表于 2016-7-19 09:58
你是F407吗  我查芯片手册 TIM3的最高是42MHZ

不是,我是F103ZET6
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-21 11:34:30 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-15 16:02
((1+TIM_Prescaler )/72M)*(1+TIM_Period ),这是公式

我觉得问题是因为这个,引脚最高响应频率是50MHz,所以我不管如何设置了,它的输出就只能到这么高的频率。。。
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-21 12:53:26 | 显示全部楼层
thrive 发表于 2016-7-21 11:34
我觉得问题是因为这个,引脚最高响应频率是50MHz,所以我不管如何设置了,它的输出就只能到这么高的频率 ...

你指的是用引脚输出高低电平来判断定时周期吗?
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-21 13:38:26 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-21 12:53
你指的是用引脚输出高低电平来判断定时周期吗?

我指的是PWM输出的的那个引脚,最大只支持50HZ的频率,因为我根据那个公司把值改的再怎么小,它都只能到2us。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-21 13:47:17 | 显示全部楼层
thrive 发表于 2016-7-21 13:38
我指的是PWM输出的的那个引脚,最大只支持50HZ的频率,因为我根据那个公司把值改的再怎么小,它都只能到2 ...

怎么又变成PWM波了
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-21 13:48:02 | 显示全部楼层
thrive 发表于 2016-7-21 13:38
我指的是PWM输出的的那个引脚,最大只支持50HZ的频率,因为我根据那个公司把值改的再怎么小,它都只能到2 ...

你做这个就是想验证你的定时器定时时间是吧?
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-5-12
在线时间
62 小时
 楼主| 发表于 2016-7-21 14:03:31 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-21 13:48
你做这个就是想验证你的定时器定时时间是吧?

我就是想验证定时器的最大精度是否能到1us。。。。。。。。。,通过的方法就是在定时器中断里面去改变某一个GPIO的高低电平来输出PWM波实现的。。。,这样就能通过示波器来看了,但是发现GPIO的最大输出HZ是50MHZ,所以我定时器虽然可能设置的是1us,但是示波器永远只能测到2us,我感觉问题是出在这里
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-21 14:45:42 | 显示全部楼层
thrive 发表于 2016-7-21 14:03
我就是想验证定时器的最大精度是否能到1us。。。。。。。。。,通过的方法就是在定时器中断里面去改变某 ...

那你可以进10次中断,置一次高电平,再进10次,置一次低电平,不一定要一次
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 22:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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