当前位置:文档之家› 高手带你理解STM32系统时钟和分频

高手带你理解STM32系统时钟和分频


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,但注意时钟树里有这一段 见附图
高手带你理解 STM32 系统时钟和分频
首先来手册里的一段话。 三种不同的时钟源可被用来驱动系统时钟 (SYSCLK) - HSI 振荡器时钟 - HSE 振荡器时钟 - PLL 时钟 一般用的是 PLL 时钟,后面有证据。 我们可以通过库函数获取各时钟值 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) 在我的系统里,把时钟值打印信息如下: SYSCLK:0x44aa200 //72000000, 72MHz HCLK:0x44aa200 //72000000, 72MHz
已知 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。看了手册才理解原因。

相关主题