OpenEdv-开源电子网

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

STM32f407 定时器 溢出中断评率最大可到多少?

[复制链接]

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
发表于 2020-11-12 14:26:53 | 显示全部楼层 |阅读模式
1金钱
目的及结论:近期准备使用STM32定时器产生2MHZ的方波,配置定时器,使用其溢出中断,最快只能到666KHz左右,再提高频率就没什么作用了。

过程:(1)使用探索者开发板例程7程序,修改定时器3配置如下:
          TIM3_Int_Init(4-1,21-1);  // 84M/21 = 4M   1/4M *4 = 1μs ;
         波形如下:
          1us.jpg
         波形和实际配置及计算可以对上

         (2)修改定时器配置如下:
         TIM3_Int_Init(3-1,21-1);  // 84M/21 = 4M   1/4M *3 = 750ns;
         波形如下:
          750ns.jpg
         波形和实际配置计算已经有些许偏差

         (3)修改定时器配置如下:
         TIM3_Int_Init(2-1,21-1);  // 84M/21 = 4M   1/4M *2 = 500ns
         波形如下:
         
         波形也和实际配置对不上,变成了1μs的周期

         (4)修改定时器配置如下:
          TIM3_Int_Init(6-1,7-1);  // 84M/7 = 12M   1/12M *6 = 500ns
          波形如下:
         
         波形也和实际配置对不上,变成了1μs的周期

        (4)接下来还做了另外一个试验,使用TIM9(时钟挂在APB2上),最快频率可以到1M(这是因为APB2本身是APB1时钟的一倍)。
       配置如下: TIM9_Int_Init(4-1,21-1);  // 168M/21 = 8M   1/8M *4 = 500ns;
       但分频系数,自动重装载值在往小了改,频率也提不上去了。
        波形如下:
       500us.jpg
疑问:是否STM32F407挂在APB1上的定时器最快只能达到666.7KHz的频率,挂在APB2上的定时器最快只能1MHz不能再快了?分频系数,自动重装载值这两个参数是否有限制,并不是1~65535?
不知道各位大神是否探究过STM32F407定时器中断最快能达到多少,我的操作哪里有什么问题?
谢答!!

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

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5137
金钱
5137
注册时间
2014-8-26
在线时间
1316 小时
发表于 2020-11-12 17:40:31 | 显示全部楼层
不止这么小频率的,自己调整下分频系数和装载值
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
 楼主| 发表于 2020-11-13 09:47:58 | 显示全部楼层
login_FAE 发表于 2020-11-12 17:40
不止这么小频率的,自己调整下分频系数和装载值

你好,如上面四个步骤,定时器中断函数里就一个I/O口的电平翻转。再降分频系数和自动重装载值已无效果,频率不会进一步变大。实际测试如此,因此才有了上面的问题,不知您是否测过更快的波形?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-15 12:15:16 | 显示全部楼层
检查一下配置IO时所选择了的速度, 把它改为最快的试试
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
 楼主| 发表于 2020-11-15 12:18:22 来自手机 | 显示全部楼层
电平翻转的I/O配置的是100M啊,最快了。
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
 楼主| 发表于 2020-11-15 12:19:20 来自手机 | 显示全部楼层
edmund1234 发表于 2020-11-15 12:15
检查一下配置IO时所选择了的速度, 把它改为最快的试试

电平翻转的I/O配置的是100M,最快了。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-15 12:20:57 | 显示全部楼层
eaglemans 发表于 2020-11-15 12:19
电平翻转的I/O配置的是100M,最快了。

中断的代码贴一下
回复

使用道具 举报

11

主题

2141

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4855
金钱
4855
注册时间
2015-1-10
在线时间
608 小时
发表于 2020-11-16 11:29:54 | 显示全部楼层
中断只做IO电平翻转?溢出中断里做翻转要比定时器输出比较慢,换个思路试试?
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
 楼主| 发表于 2020-11-16 14:35:43 | 显示全部楼层
edmund1234 发表于 2020-11-15 12:20
中断的代码贴一下

中断函数里就一个电平翻转
Void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
    {
        LED0=!LED0;
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
 楼主| 发表于 2020-11-16 14:38:52 | 显示全部楼层
阿侑kevin 发表于 2020-11-16 11:29
中断只做IO电平翻转?溢出中断里做翻转要比定时器输出比较慢,换个思路试试?

中断函数里就一个电平翻转
Void TIM3_IRQHandler(void)
{
     if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
     {
         LED0=!LED0;
     }
     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
您说的换个思路试试是什么意思,我现在就是用电平翻转来测定时器中断的周期,中断函数里什么也不写,如何测试中断周期?从波形上看,I/O的电平翻转不会耗时那么久,比定时器周期长。
回复

使用道具 举报

11

主题

2141

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4855
金钱
4855
注册时间
2015-1-10
在线时间
608 小时
发表于 2020-11-16 15:07:03 | 显示全部楼层
eaglemans 发表于 2020-11-16 14:38
中断函数里就一个电平翻转
Void TIM3_IRQHandler(void)
{

我用F1的TIM4输出PWM帮你验证一下,我的板子在后端还有三极管的情况下可以输出1.6MHz的脉冲

800KHz

800KHz

1MHz

1MHz

1.6MHz

1.6MHz
回复

使用道具 举报

11

主题

2141

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4855
金钱
4855
注册时间
2015-1-10
在线时间
608 小时
发表于 2020-11-16 15:11:07 | 显示全部楼层
eaglemans 发表于 2020-11-16 14:38
中断函数里就一个电平翻转
Void TIM3_IRQHandler(void)
{

我把三极管拆了再给你补个2MHz和4MHz的

4MHz

4MHz

2MHz

2MHz
回复

使用道具 举报

11

主题

2141

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4855
金钱
4855
注册时间
2015-1-10
在线时间
608 小时
发表于 2020-11-16 15:32:23 | 显示全部楼层
前面是我用定时器输出比较实现的,然后我用定时器溢出操作IO,F1连300KHz都实现不了,楼主换个思路,用输出比较
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-16 16:00:06 | 显示全部楼层
eaglemans 发表于 2020-11-16 14:35
中断函数里就一个电平翻转
Void TIM3_IRQHandler(void)
{

其实我觉得这是合理的,就拿500ns的来算吧。
500ns就是36周期, CPU进中断就用去12周期, 翻转IO就用了6个周期, 判断中断标志4~5, 清标志位又另外4~5, 加上进中断后需要填满流水线的等待周期。
就是CPU的资源已经到其极限了。
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
 楼主| 发表于 2020-11-16 20:19:56 | 显示全部楼层
阿侑kevin 发表于 2020-11-16 15:32
前面是我用定时器输出比较实现的,然后我用定时器溢出操作IO,F1连300KHz都实现不了,楼主换个思路,用输出 ...

您好,感谢答复和验证。能否把定时器输出比较实现的定时器配置和中断函数两部分内容贴一下,我对比修改看下问题,谢谢。
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-3-26
在线时间
15 小时
 楼主| 发表于 2020-11-16 20:22:53 | 显示全部楼层
edmund1234 发表于 2020-11-16 16:00
其实我觉得这是合理的,就拿500ns的来算吧。
500ns就是36周期, CPU进中断就用去12周期, 翻转IO就用了6 ...

我用的是STM32F407,168M的时钟。关于您说的进中断12个周期,翻转IO用6个周期,判断中断标志4~5个周期,清标志4~5个周期,这些理论值如何得来的啊,我理解的还没有那么深刻,请不吝赐教,谢谢。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-17 11:10:07 | 显示全部楼层
eaglemans 发表于 2020-11-16 20:22
我用的是STM32F407,168M的时钟。关于您说的进中断12个周期,翻转IO用6个周期,判断中断标志4~5个周期,清 ...

中断耗时如图, 翻转IO的时间可以通过反汇编查看, 加载或存储到Memory的指令为2个周期
1605582405(1).png
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-17 11:11:45 | 显示全部楼层
eaglemans 发表于 2020-11-16 20:22
我用的是STM32F407,168M的时钟。关于您说的进中断12个周期,翻转IO用6个周期,判断中断标志4~5个周期,清 ...

明天有时间我用407来试一下, 估计是时钟设置的问题吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 23:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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