高手帶你理解STM32系統(tǒng)時鐘和分頻
首先來手冊里的一段話。
三種不同的時鐘源可被用來驅(qū)動系統(tǒng)時鐘 (SYSCLK)
· HSI振蕩器時鐘
· HSE振蕩器時鐘
· PLL時鐘
一般用的是PLL時鐘,后面有證據(jù)。
我們可以通過庫函數(shù)獲取各時鐘值
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
在我的系統(tǒng)里,把時鐘值打印信息如下:
SYSCLK:0x44aa200 //72000000, 72MHz
HCLK:0x44aa200 //72000000, 72MHz
PCLK1:0x2255100 //36000000, 36MHz
PCLK2:0x44aa200 //72000000, 72MHz
ADCCLK:0x2255100 //36000000,36MHz
RCC->CFGR:0x001D040A //PLL輸出作為系統(tǒng)時鐘
可推測幾個預(yù)分頻值為
AHB prescaler = 1
APB1 prescaler = 2
APB2 prescaler = 1
ADC prescaler = 2
根據(jù)讀取RCC->CFGR寄存器值為:0x001D040A,上面推測完全正確。
CFGR寄存器的SWS段也說明:PLL輸出作為系統(tǒng)時鐘。
TIM2使用PCLK1,但注意時鐘樹里有這一段
見附圖
已知APB1 prescaler=2,故TIM2CLK = PCLK1*2 = 72MHz.
所以被TIM2分頻的時鐘大小是72MHz。
我的程序也證明了這點(diǎn)
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,實(shí)際只有1s。看了手冊才理解原因。
編輯:admin 最后修改時間:2018-05-18