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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版