OpenEdv-开源电子网

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

定时器的定时

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-11-4
在线时间
0 小时
发表于 2011-12-2 16:13:20 | 显示全部楼层 |阅读模式
在STM32的定时器中断实验中(书上127-128页)
原文是:因为在Stm32_Clock_Init函数里已经初始化APB1的时钟为2分频,所以,TIM3的时钟为36MHZ,再根据设计的arr和psc的值,就可以计算中断时间了。计算公式如下:Tout=(arr×(psc+1))/Tclk。其中Tclk为TIM3的输入时钟频率,Tout为TIM3溢出时间。Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms  ,仿真图中是500ms是正确的。
我的问题是:Timerx_Init(1,7199);  应该是100us,可仿真波形是200us
                  Timerx_Init(2,7199);  应该是200us,可仿真波形是300us
                  Timerx_Init(3,7199);  应该是300us,可仿真波形是400us
怎么定时的时间又不正确了呢?

原文中讲APB1的时钟为2分频,那TIM3的时钟应该为72MHZ。望会的人解答下。



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

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-11-4
在线时间
0 小时
 楼主| 发表于 2011-12-2 16:25:07 | 显示全部楼层
APB1的时钟为2分频,那TIM3的时钟应该为72MHZ,计算公式如下:Tout=((arr+1)×(psc+1))/Tclk。我想应该是这样
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-12-2 17:10:01 | 显示全部楼层
回复【楼主位】woshizu:
---------------------------------
是72M的。
当频率不为72M的时候,会乘以二。这个最新版本的手册应该修正过来了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-2 19:32:33 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
void TIM3_Configuration(void)
{
/* rivate variables ---------------------------------------------------------*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;


/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//TIMx寄存器重设为缺省值
   TIM_DeInit(TIM3);
/* ---------------------------------------------------------------
TIM3CLK 即PCLK1=36MHz
TIM3CLK = 36 MHz, rescaler = 7200, TIM3 counter clock = 5K,
即改变一次为5K, t=1/5k; 周期就为 2*(1/5k)秒
--------------------------------------------------------------- */
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  
 // 计数到5000为 :(1/5k) *5000=1秒
//实际是 500ms 中断一次  ???????????????
TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
/* Enables the Update event for TIM3 */
//TIM_UpdateDisableConfig(TIM3,ENABLE);  //使能 TIM3 更新事件 

  TIM_ITConfig(  //使能或者失能指定的TIM中断
TIM3, //TIM3
TIM_IT_Update  |  //TIM 中断源
TIM_IT_Trigger,   //TIM 触发中断源 
ENABLE  //使能
);
//  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
 }
  
我也是这个问题????
大家都知道PCLK1最大36MHz,PCLK2最大72MHz

TIM3CLK 即PCLK1=36MHz
TIM3CLK = 36 MHz, rescaler = 7200, TIM3 counter clock = 5K,
即改变一次为5K, t=1/5k; 周期就为 2*(1/5k)秒

 // 计数到5000为 :(1/5k) *5000=1秒
//实际是 500ms 中断一次  ???????????????
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-2 19:38:11 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
当频率不为72M的时候,会乘以二。这个最新版本的手册应该修正过来了。


当频率不为72M的时候,会乘以二????
这句是在哪种情况下呢??不会每种情况都要乘以2吧 ,
不是 CLK1最大36MHz,PCLK2最大72MHz 


请问原子哥,,最新版是哪一版呢,,能上传上来么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-12-3 01:46:04 | 显示全部楼层
回复【5楼】提刀上马:
---------------------------------
<<STM32参考手册>>里面有个时钟树图,你看这个图就明白了.
比如,如果你要36M的频率,你就必须分频为4,才是36M.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 11:14:50 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
哦~~
那个图上说:如果预分频APB1系数为1,则频率不变,否则 *2

TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍

请问原子哥:
为什么  必须分频为4,才是36M. 呢???
不是说只要不是1,频率就*2 么??
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 11:32:47 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
再问下原子哥;
分频是在哪个寄存器里面配置呢??

TIMx_CR1->CKD[1:0]:  时钟分频因子
定义在定时器时钟(CK_INT)频率与数字滤波器(ETR ,TIx) 使用的采样频率之间的分频比例
这几位怎么用呢,有点不懂~~~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-12-3 13:41:10 | 显示全部楼层
回复【7楼】提刀上马:
---------------------------------
那我要36M 的定时器时钟,你说我要设置分频系数为几?

回复【8楼】提刀上马:
---------------------------------
看我的代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 15:03:13 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
在SystemInit();后PCLK1 clock frequency = 36M

把APB1的预分频系数设为 1    TIM2~7就是 36M了,,

怎么把这个APB1的预分频系数设为 1,,我还是不懂~~??
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 15:35:02 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
是设置RCC_CFGR-》PPRE1[2:0] 吧
我把那个搞混了~~
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 15:36:52 | 显示全部楼层
一看图,,看是2个倍频器
可是名字都一样
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-12-3 15:38:34 | 显示全部楼层
回复【10楼】提刀上马:
---------------------------------
看来我的理解有误。
首先,TIM2~7定时器的时钟是来源于APB1。
所以所谓的定时器时钟,直接就是来自APB1的时钟,并且注意分频不为1的时候,会倍频后作为TIM的时钟。
分频系数通过CFGR寄存器的PPRE1几个位来决定。
而定时器的计数时钟,则还需要经过定时器的寄存器PSC来分频后得到。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 17:47:49 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
嗯~
我在加了 RCC->CFGR &= 0XFFFFF9FF; //位10:8   PRE1[2:0]: 0xx:HCLK不分频 
貌似没什么变化~
是不是加错位置了~~~
void TIM3_Configuration(void)
{
/* rivate variables ---------------------------------------------------------*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;


/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//TIMx寄存器重设为缺省值
   TIM_DeInit(TIM3);
          TIM_InternalClockConfig(TIM3); //采用内部时钟给TIM3提供时钟源
  //缺省是 采用内部时钟



 RCC->CFGR &= 0XFFFFF9FF;    



/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  
  TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
/* Enables the Update event for TIM3 */
//TIM_UpdateDisableConfig(TIM3,ENABLE);  //使能 TIM3 更新事件 

  /* TIM IT enable 
TIM_ITConfig(  //使能或者失能指定的TIM中断
TIM3, //TIM3
TIM_IT_Update  |  //TIM 中断源
TIM_IT_Trigger,   //TIM 触发中断源 
ENABLE  //使能
);   */
 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);  //使能TIMx计数器
 }
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-12-3 19:57:32 | 显示全部楼层
回复【14楼】提刀上马:
---------------------------------
APB1最大只能36M。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 21:44:29 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
嗯啊,

但是
RCC->CFGR &= 0XFFFFF9FF;     
我用串口读回来的值打印出来是 72M
PCLK1 clock frequency = 72000000 hz 
这个有点怪
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-12-3 23:26:21 | 显示全部楼层
回复【16楼】提刀上马:
---------------------------------
直接看寄存器值.应该不会错的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-12-3 23:52:39 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
嗯 谢原子~\(≧▽≦)/~啦啦啦
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-7-30
在线时间
0 小时
发表于 2014-8-18 00:43:12 | 显示全部楼层

这个是网上其他视频讲解的截图,希望能帮到你

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 11:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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