如何理解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。看了手册才理解原因。
扩展阅读 >>>>>>>>>>stm32学习之rcc时钟配置

安森美半导体与Stegia共推超小型智能电机方案
为什么触摸一体机越来越多?
从A股2019年年报看国产MCU 上市公司的市场表现
华为发布首款旗舰Sound X智能音箱 设计理念来自维也纳音乐大厅的穹顶
LN809内置延时高精度低功耗电压检测
如何理解STM32系统时钟和分频
华为发布业界首个固网微波解决方案 推动Gigaband产业迈入新时代
PCB面板化能为制造过程带来什么样的帮助
iPhone 11S有望成为苹果首款“重新设计”的四摄机型
!销售/回收R6441A數字萬用表R6441A小兵/孟S13
语音识别新方向:仿生蝙蝠耳能用声纳精准“聆听”
无线运动耳机什么牌子好,运动无线蓝牙耳机推荐
最新安卓7.0和iOS10.2,你更喜欢哪个?
恩智浦推出用于NFC天线的ESD保护二极管
工业4.0时代制造工厂企业如何利用机器视觉检测实现智慧工厂
经常戴耳机的注意了你的耳机该换了!不要等听力下降才引起重视!
新松打造智慧工厂系统解决方案
助推锂电智造升级,新视智科荣获高工金球奖“2021年度创新技术”
Marvell新加坡新设卓越运营中心 致力于IC设计的重要工作
SensiML与Direct Insight达成合作