你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103的定时器时钟频率的问题,困扰了我5年,至今搞不透

[复制链接]
张亚飞 提问时间:2017-7-13 11:15 /
我从时钟树分析一直认为,如果AHB是72M的话,APB1和APB2是72M频率,然后APB1 2分频成36M频率给PCLK1下边的外设,与此同时连接着TIM2~TIM7的倍频器由于APB1 不是1分频所以自动乘2,既TIM2~7的定时器时钟频率为72M。所以我下面的定时器配置图出来的定时器应该是1s的定时器。 但是实际测试并不是,实际出来的是2s的定时器。我时钟理解不了,难道是网上的时钟树分析都是错的? 你们是怎么理解的呢?

时钟树分析

时钟树分析


定时器配置

定时器配置







收藏 3 评论21 发布时间:2017-7-13 11:15

举报

21个回答
张亚飞 回答时间:2017-8-21 14:49:04
感谢 zhao.zhao 大神的帮忙,问题解决了,问题出在时钟分频上用串了。
七哥 回答时间:2017-7-14 11:23:10
我用3.1.2的库中样例程序“TimeBase”,TIM2时钟被4分频了
  1. void RCC_Configuration(void)
  2. {
  3.   /* Setup the microcontroller system. Initialize the Embedded Flash Interface,  
  4.      initialize the PLL and update the SystemFrequency variable. */
  5.   SystemInit();

  6.   /* PCLK1 = HCLK/4 */
  7.   RCC_PCLK1Config(RCC_HCLK_Div4);

  8.   /* TIM2 clock enable */
  9.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  10.   /* GPIOC clock enable */
  11.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  12. }
复制代码

  1. #define RCC_HCLK_Div4                    ((uint32_t)0x00000500)
复制代码

  1. /**
  2.   * @brief  Configures the Low Speed APB clock (PCLK1).
  3.   * @param  RCC_HCLK: defines the APB1 clock divider. This clock is derived from
  4.   *   the AHB clock (HCLK).
  5.   *   This parameter can be one of the following values:
  6.   *     @arg RCC_HCLK_Div1: APB1 clock = HCLK
  7.   *     @arg RCC_HCLK_Div2: APB1 clock = HCLK/2
  8.   *     @arg RCC_HCLK_Div4: APB1 clock = HCLK/4
  9.   *     @arg RCC_HCLK_Div8: APB1 clock = HCLK/8
  10.   *     @arg RCC_HCLK_Div16: APB1 clock = HCLK/16
  11.   * @retval None
  12.   */
  13. void RCC_PCLK1Config(uint32_t RCC_HCLK)
  14. {
  15.   uint32_t tmpreg = 0;
  16.   /* Check the parameters */
  17.   assert_param(IS_RCC_PCLK(RCC_HCLK));
  18.   tmpreg = RCC->CFGR;
  19.   /* Clear PPRE1[2:0] bits */
  20.   tmpreg &= CFGR_PPRE1_Reset_Mask;
  21.   /* Set PPRE1[2:0] bits according to RCC_HCLK value */
  22.   tmpreg |= RCC_HCLK;
  23.   /* Store the new value */
  24.   RCC->CFGR = tmpreg;
  25. }
复制代码



七哥 回答时间:2017-7-14 12:01:41
算你狠,用的3.0.0的库,建的uv5.0的工程

时钟初始化部分有错误。
  1. void init_rcc(void)
  2. {
  3.    ErrorStatus         HSEStrartUpStatus;
  4.    RCC_DeInit();        //³õʼ»¯
  5.    RCC_HSEConfig(RCC_HSE_ON) ;
  6.    HSEStrartUpStatus =RCC_WaitForHSEStartUp();

  7.    if(HSEStrartUpStatus ==SUCCESS)
  8.    {
  9.           RCC_HCLKConfig(RCC_SYSCLK_Div1);
  10.           RCC_PCLK2Config(RCC_SYSCLK_Div1);
  11.           RCC_PCLK1Config(RCC_SYSCLK_Div2);
复制代码


RCC_PCLK2Config、RCC_PCLK1Config不能用RCC_SYSCLK_Div1的参数。
进去函数看一下说明,要用对应的,RCC_HCLK_Div2。

RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);


另外你这程序能跑吗?时钟不对,跑不动吧。
建议升级库。
Paderboy 回答时间:2017-7-13 13:39:12
本帖最后由 Paderboy 于 2017-7-13 13:43 编辑

这是我从cube f103 里的时钟树截图。。 HCLK 72MHZ 经过 APB1/2得到最大36MHZ 但是 (APB1 timer) 时钟默认自动由APB1X2 所以是72MHZ
只是针对timer的。。其他APB1的外设最大时钟还是36MHZ。。。

QQ截图20170713133158.png
按照以下配置,实现了1s的延时测试

QQ截图20170713133806.png


我测试了,确实是1s 的延时。。。


胡电子 回答时间:2017-7-13 13:41:34
大胆猜测了下,工作时是内部RC 36MHZ跑的。检测下时钟初始化
张亚飞 回答时间:2017-7-13 13:56:35
Paderboy 发表于 2017-7-13 13:39
这是我从cube f103 里的时钟树截图。。 HCLK 72MHZ 经过 APB1/2得到最大36MHZ 但是 (APB1 timer) 时钟默 ...

我也是用了cubemx这样配置确实是1s的定时器,但是用库函数版的就不对,这也让我下决心发帖子搞搞明白。
张亚飞 回答时间:2017-7-13 13:58:13
胡电子 发表于 2017-7-13 13:41
大胆猜测了下,工作时是内部RC 36MHZ跑的。检测下时钟初始化

这是时钟配置的截图


时钟初始化

时钟初始化


张亚飞 回答时间:2017-7-14 10:10:24
要石沉大海了,自己顶一下吧。
七哥 回答时间:2017-7-14 11:14:05
看看RCC_CFGR寄存器什么情况?
用的哪个版本的库?要不发个程序过来
张亚飞 回答时间:2017-7-14 11:26:38
工程的压缩包问题挺多的,TIM时钟不对,外部中断触发不了。

001_Systick.rar

下载

2.19 MB, 下载次数: 9, 下载积分: ST金币 -1

TIM时钟不对,外部中断进不去

张亚飞 回答时间:2017-7-14 11:27:20
toofree 发表于 2017-7-14 11:14
看看RCC_CFGR寄存器什么情况?
用的哪个版本的库?要不发个程序过来

工程发了
张亚飞 回答时间:2017-7-14 12:10:23
toofree 发表于 2017-7-14 12:01
算你狠,用的3.0.0的库,建的uv5.0的工程

时钟初始化部分有错误。

改过来确实好了,这个工程用了很久,没注意到这个问题。
张亚飞 回答时间:2017-7-14 12:24:25
toofree 发表于 2017-7-14 12:01
算你狠,用的3.0.0的库,建的uv5.0的工程

时钟初始化部分有错误。

void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)  这个函数不调用就可以默认用PLL作为system clock了吗
zhao.zhao 回答时间:2017-7-14 13:33:27

用Cube吧,去年我把外部时钟改成内部时钟,看参考手册,小心翼翼的,花了一上午。一气之下,今年改Cube了,点点鼠标,花了5分钟,这个就是效率。
张亚飞 回答时间:2017-7-14 13:45:27
zhao.zhao 发表于 2017-7-14 13:33
用Cube吧,去年我把外部时钟改成内部时钟,看参考手册,小心翼翼的,花了一上午。一气之下,今年改Cube了 ...

cube的串口定长接收太操蛋,DMA中断接收按照网上的帖子弄了两回没弄成。 关键现在的一个项目用cube的串口接收数据时不定时会停止接收了,仿真的时候进不了中断,比较烦。
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版