找回密码
 注册
关于网站域名变更的通知
查看: 444|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-25 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
高手带你理解STM32系统时钟和分频
) T. O- X; A  f+ h& m4 L5 S. b! [5 o( }, Y: X( V9 D- [

首先来手册里的一段话。

三种不同的时钟源可被用来驱动系统时钟 (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。看了手册才理解原因。

6 f, x  E" @5 u4 m1 k/ @( u: ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-18 09:51 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表