对STM32系统时钟和分频的一点理解

 系统时钟和分频
首先来手册里的一段话。
三种不同的时钟源可被用来驱动系统时钟 (SYSCLK)
  • HSI振荡器时钟
  • HSE振荡器时钟
  • PLL时钟
一般用的是PLL时钟,后面有证据。

我们可以通过库函数获取各时钟值
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
在我的系统里,把时钟值打印 信息如下:
SYSCLK:0x44aa200          //72000000, 72MHz
HCLK:0x44aa200               //72000000, 72MHz
PCLK1:0x2255100            //36000000, 36MHz
PCLK2:0x44aa200            //72000000, 72MHz
ADCCLK:0x2255100        //36000000,36MHz
RCC->CFGR:0x001D040A
             //PLL输出作为系统时钟
可推测几个预分频值为
AHB prescaler = 1
APB1 prescaler = 2
APB2 prescaler = 1
ADC prescaler = 2
根据读取RCC->CFGR寄存器值为:0x001D040A,上面推测完全正确。
CFGR寄存器的SWS段也说明:PLL输出作为系统时钟。

TIM2使用PCLK1,但注意时钟树里有这一段
见附图

已知APB1 prescaler=2,故TIM2CLK = PCLK1*2 = 72MHz.
所以被TIM2分频的时钟大小是72MHz。

我的程序也证明了这点
TIM_TimeBaseInitTypeDef tim2_InitStruct;

TIM_DeInit(TIM2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//Enable Timer2 clock.
NVIC_ConfigurationForTimer2();

// PCLK1=36MHz, PSC=36000-1, CK_CNT=36MHz/(PSC+1)=1000
// ARR=2000,  1s/1000 * 2000 = 2s.
tim2_InitStruct.TIM_Prescaler = 36000-1;
tim2_InitStruct.TIM_Period = 2000-1;
tim2_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
tim2_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
tim2_InitStruct.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &tim2_InitStruct);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//Enables the specified TIM interrupts.

这段配置原本以为定时时间是2s,实际只有1s。看了手册才理解原因。
  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值