张亚飞 发表于 2017-7-13 11:15:05

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

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









张亚飞 发表于 2017-8-21 14:49:04

感谢 zhao.zhao 大神的帮忙,问题解决了,问题出在时钟分频上用串了。

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。。。


按照以下配置,实现了1s的延时测试




我测试了,确实是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

要石沉大海了,自己顶一下吧。

toofree 发表于 2017-7-14 11:14:05

看看RCC_CFGR寄存器什么情况?
用的哪个版本的库?要不发个程序过来

toofree 发表于 2017-7-14 11:23:10

我用3.1.2的库中样例程序“TimeBase”,TIM2时钟被4分频了void RCC_Configuration(void)
{
/* Setup the microcontroller system. Initialize the Embedded Flash Interface,
   initialize the PLL and update the SystemFrequency variable. */
SystemInit();

/* PCLK1 = HCLK/4 */
RCC_PCLK1Config(RCC_HCLK_Div4);

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

/* GPIOC clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
}

#define RCC_HCLK_Div4                  ((uint32_t)0x00000500)

/**
* @briefConfigures the Low Speed APB clock (PCLK1).
* @paramRCC_HCLK: defines the APB1 clock divider. This clock is derived from
*   the AHB clock (HCLK).
*   This parameter can be one of the following values:
*   @arg RCC_HCLK_Div1: APB1 clock = HCLK
*   @arg RCC_HCLK_Div2: APB1 clock = HCLK/2
*   @arg RCC_HCLK_Div4: APB1 clock = HCLK/4
*   @arg RCC_HCLK_Div8: APB1 clock = HCLK/8
*   @arg RCC_HCLK_Div16: APB1 clock = HCLK/16
* @retval None
*/
void RCC_PCLK1Config(uint32_t RCC_HCLK)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_RCC_PCLK(RCC_HCLK));
tmpreg = RCC->CFGR;
/* Clear PPRE1 bits */
tmpreg &= CFGR_PPRE1_Reset_Mask;
/* Set PPRE1 bits according to RCC_HCLK value */
tmpreg |= RCC_HCLK;
/* Store the new value */
RCC->CFGR = tmpreg;
}


张亚飞 发表于 2017-7-14 11:26:38

工程的压缩包问题挺多的,TIM时钟不对,外部中断触发不了。

张亚飞 发表于 2017-7-14 11:27:20

toofree 发表于 2017-7-14 11:14
看看RCC_CFGR寄存器什么情况?
用的哪个版本的库?要不发个程序过来

工程发了
页: [1] 2 3
查看完整版本: STM32F103的定时器时钟频率的问题,困扰了我5年,至今搞不透