看懂时钟树——掌握系统时钟配置

发布者:一直333最新更新时间:2021-10-18 来源: eefocus关键字:时钟树  系统时钟  配置 手机看文章 扫描二维码
随时随地手机看文章

——基于STM32F107VCT6的理解

1、HIS(内部高速时钟:8MHZ)

内部高速时钟是芯片自带的时钟,芯片自带时钟有两个HIS和LSI(内部低速时钟:40kHZ),内部时钟是RC振荡器产生的,不够稳定。一般不长时间作为系统时钟使用,一般做备用,或在切换时使用。


2、HSE(外部高速时钟:3-25MHZ)

STM32提供两组外部时钟接口,HSE和LSE(外部低速时钟)。外部时钟的大小由外部所接晶振确定(本文HSE=25MHZ,LSE=32.768kHZ),所以较为准确。


3、时钟树看图引导

从图中可知SYSCLK(系统时钟)的来源可以是SHE、SHI和PLLCLK(分频器1),这里通过SW(两位二进制数00、01、10、11)来选择,具体可参考《STM32F10xxx参考手册》第88页,CSS的作用是用来检测HSE是否正常的。HSE和SHI都是固定不变的(硬件不变的情况下),所以想要设置不同的时钟频率出来一般选择PLLCLK作为系统时钟。PLLCKL的时钟源有3中不同的情况:(1)SHI经过2分频,经过PLLSCR选择(一位二进制数:0选择图中上面的路线,1选择下面路线);(2)SHE经过PREDIV1SCR选择(0选择上面路线,1选择下面路线),在经过PREDIV1(分频器1),再经过PLLSCR选择;(3)SHE经过PREDIV2分频,进入PLL2MUL倍频,经过PREDIV1SCR选择(0选择上面路线,1选择下面路线),在经过PREDIV1(分频器1),再经过PLLSCR选择。三种情况如下:

对于情况(1)和(2)产生的的时钟频率相对较少,有多种的情况都不能产生,而情况(3)则有多种选择,不能产生的频率,也可以产生一个误差小于0.1MZH与目标频率相近的评率。本文采用(3)这条路线。


4、设计步骤

(1)、切换内部时钟:SHI使能(SHION写1)、等待SHI稳定(SHIDRY被硬件置1)、系统时钟切换为内部时钟(SW写00)、等待切换成功(SWS被硬件置00);


说明:若某条线路被作为了SYSCLK,则改线路的所有的配置都不能被更改,只能暂时切换到其他路线。SHI只有被使能了才能切换成功。


(2)、配置相关分频、倍频系数。关闭PLL2,PLL使能(PLLON、PLL2ON写0)选择PREDIV2、PREDIV1的分频系数,选着PLLMUL2、PLLMUL的倍频系数,PREDIV1SCR、PLLSCR的时钟源;打开SHE(SHEON写1),等待SHE稳定(SHERDY被硬件写1),打开PLL2,PLL使能(PLLON、PLL2ON写1),等待准备就绪(PLLRDY、PLL2RDY被硬件写1);


(3)、SYSCLK切换成PLLCLK。SYSCLK由SHI切换成PLLCLK(SW写10),等待切换成功(SWS被置为10)


5、程序设计(系统时钟设置子函数)

方案一:通过运算得到与目标频率最相近的分频、倍频方案,并进行设置。


优点:只要改变带入参数的类型,可计算产生小数的频率;


缺点:每次都要进行计算,运算量大,要时间计算;


//1、寄存器的声明定义(只声明用到的)

#define RCC_CR       *(uint32_t *)0x40021000

#define RCC_CFGR     *(uint32_t *)0x40021004

#define RCC_CFGR2    *(uint32_t *)0x4002102c

 

/**********************************

//重设系统时钟函数

//可设置范围:4-72MHZ

//带入参数:  需要设置的系统时钟频率

//带入参数类型:int

//返回值:实际设置的成的系统时钟频率

//注意事项:

//1、低于4MHZ的不能设置,程序在

// while((RCC_CR & 0x0a000000) != 0x0a000000 );死循环

//2、高于72MHZ系统时钟设置为72MHZ

***********************************/

double ResetSysClK(int Sysclk_Value)

{

unsigned char PLLMUL,PLLMUL2,M1,M2,D1,D2;

unsigned int DIV1,DIV2;

double clk_set,clk_temp,abs_clk_temp,abs_clk_min = 72.0;

float    MUL[7]       = {4,5,6,7,8,9,6.5};

float    MUL2[9]      = {8,9,10,11,12,13,14,16,20};

unsigned int MUL_Code[7]  = {2,3,4,5,6,7,13};

unsigned int MUL2_code[9] = {6,7,8,9,10,11,12,14,15};

for(M1 = 0;M1 < 7;M1++) //PLLMUL[8]

for(M2 = 0;M2 < 9;M2++)//PLL2MUL

for(D1 = 1; D1 < 17;D1++)//PREDIV1[16]

for(D2 = 1;D2 < 17 ;D2++)//PREDIV1[16]

{

//计算当前组合的时钟频率

clk_temp = (25.0*MUL[M1]*MUL2[M2]) / ((double)D1*(double)D2);

//时钟频率在1-72MZH的组合计进入判断

if(  clk_temp<=72.0 && clk_temp >=1.0 )

{

//计算当前组合与想要得到的时钟频率差

abs_clk_temp = Sysclk_Value - clk_temp;

//若当前组合产生的时钟频率就是想要的时钟频率

//则不用继续遍历后面的组合,跳出所有循环

if(abs_clk_temp == 0.0)

{

clk_set = clk_temp;

PLLMUL  = M1;

PLLMUL2 = M2;

DIV1    = D1;

DIV2 = D2;

M1 = M2 = 10;

D1 = 20;

break;//只能跳出最小的循环

}

if(abs_clk_temp < 0.0)

abs_clk_temp = (-abs_clk_temp);

//遍历所有组合找出时钟频率组合与目标时钟频率相差最小的组合

if(abs_clk_temp < abs_clk_min)

{

//保留当前更合适的组合

abs_clk_min = abs_clk_temp;

clk_set = clk_temp;

PLLMUL  = M1;

PLLMUL2 = M2;

DIV1    = D1;

DIV2 = D2;

}

}

}

//HSI时钟使能

RCC_CR = ((RCC_CR | 0x00000001));

//延时直到HSI准备就绪

  while((RCC_CR & 0x00000002) == 0);

//切换内部时钟HSI

RCC_CFGR = (RCC_CFGR & 0xfffffffc);

while((RCC_CFGR & 0x0000000c) != 0);

//HSE使能(打开)

RCC_CR = (RCC_CR & 0xfffeffff)|0x00010000;

while((RCC_CR & 0x00020000) != 0x00020000);

//关闭PLLON和PLL2ON

RCC_CR = (RCC_CR & 0xf0ffffff);

//设置MUL的倍率、PLLSRC(选择PREDIV1输出作为PLL输入时钟)

RCC_CFGR = (RCC_CFGR&0xffc1ffff)|0x00010000|(MUL_Code[PLLMUL]<<18);

//设置MUL2、DIV2、DIV1、PREDIV1SRC(PLL2作为PREDIV1的时钟源)

RCC_CFGR2 = (RCC_CFGR2 & 0xfffef000)|0x00010000|( MUL2_code[PLLMUL2]<<8)|( (DIV2-1)<<4 )|(DIV1-1);

//PLL、PLL2使能

RCC_CR |= 0x05000000;

/* Wait till PLL2 and PLL is ready */

  while((RCC_CR & 0x0a000000) != 0x0a000000 );

/* Select PLL as system clock source */

  RCC_CFGR |= 0x00000002;    

  /* Wait till PLL is used as system clock source */

  while ((RCC_CFGR & 0x00000008) != (uint32_t)0x08);  

return clk_set;

}

 


方案二:预先将能4-72MHZ的整数频率的最佳方案计算出来,放入数组。


优点:可以直接通过查表得到分频倍频信息,不用计算运行时间短;


缺点:只能输入只能是4-72的整数。代码量较多。


#define *RCC_CR       (uint32_t *)0x40021000

#define *RCC_CFGR     (uint32_t *)0x40021004

#define *RCC_CFGR2    (uint32_t *)0x4002102c

 

//对应位的编码数组

//其二进制码经过位移合并到相应位就可以了

//顺序:MUL_Code、MUL2_Code、DIV1_Code、DIV2_Code

int data[69][4] = {

{2,      7,      14,     14,},

{2,      6,      9,      15,},

{2,      7,      9,      14,},

{5,      7,      14,     14,},

{2,      6,      9,      9,},

{2,      7,      9,      9,},

{2,      6,      4,      15,},

{2,      9,      9,      9,},

{2,      7,      4,      14,},

{2,      11,     9,      9,},

{2,      12,     9,      9,},

{2,      7,      3,      14,},

{2,      6,      4,      9,},

{5,      12,     8,      15,},

{2,      7,      4,      9,},

{7,      11,     10,     13,},

{2,      6,      3,      9,},

{4,      12,     9,      9,},

{2,      9,      4,      9,},

{7,      7,      7,      10,},

{2,      10,     4,      9,},

{2,      6,      1,      15,},

{2,      11,     4,      9,},

{4,      7,      4,      9,},

{2,      12,     4,      9,},

{3,      11,     3,      13,},

{2,      7,      1,      14,},

{2,      11,     2,      13,},

{2,      6,      4,      4,},

{4,      9,      4,      9,},

{5,      12,     5,      11,},

{2,      12,     3,      9,},

{2,      7,      4,      4,},

{5,      9,      3,      12,},

{7,      11,     6,      10,},

{4,      11,     4,      9,},

{2,      6,      1,      9,},

{2,      14,     2,      12,},

{4,      12,     4,      9,},

{3,      9,      1,      15,},

{2,      9,      4,      4,},

{2,      7,      1,      9,},

{7,      7,      3,      10,},

{13,     11,     2,      14,},

{2,      10,     4,      4,},

{5,      12,     4,      9,},

{2,      6,      0,      15,},

{3,      15,     6,      6,},

{2,      11,     4,      4,},

{3,      12,     2,      10,},

{4,      7,      4,      4,},

{2,      9,      1,      9,},

{2,      12,     4,      4,},

{5,      11,     3,      9,},

{3,      11,     1,      13,},

{4,      9,      1,      13,},

{2,      7,      0,      14,},

{4,      11,     1,      15,},

{2,      11,     2,      6,},

{5,      7,      4,      4,},

{2,      14,     4,      4,},

{2,      11,     1,      9,},

{4,      9,      4,      4,},

{3,      12,     1,      12,},

{5,      12,     2,      11,},

{5,      11,     2,      10,},

{2,      12,     1,      9,},

{5,      11,     1,      15,},

{4,      10,     4,      4,},

};

//实际设置成功的频率数组

//与上面一一对应

float set_clk[69]={

4.000000,       5.000000,       6.000000,       7.000000,       

8.000000,       9.000000,       10.000000,      11.000000,      

[1] [2]
关键字:时钟树  系统时钟  配置 引用地址:看懂时钟树——掌握系统时钟配置

上一篇:STM32时钟树分析
下一篇:STM32时钟树详解

推荐阅读最新更新时间:2024-11-12 12:49

尽管M1 iPad Pro配置强劲:但RAM使用量被限制在5GB内
尽管苹果提供了 8GB 和 16GB RAM 的 M1 iPad Pro 配置,但开发者现在表示,无论应用运行在什么配置上,RAM 使用量都被限制在 5GB 以内。 ‌M1 ‌‌iPad Pro ‌有两种 RAM 配置:128GB、256GB 和 512GB 型号的 RAM 为 8 GB,而 1TB 和 2TB 型号的 RAM 为 16GB,是 iPad 有史以来最高的配置。尽管 iPad 上的 RAM 数量空前庞大,但据报道,开发者实际使用的内存量受到严重限制。 图形和设计应用 ArtStudio Pro 的开发者在 ProCreate 论坛上透露,在新的 ‌M1 ‌‌iPad ‌Pro 上,应用只能使用 5GB 的 R
[手机便携]
STM3210X的外部时钟配置以及倍频的选择
系统默认的用8MHZ的时钟进行倍频得来72MHZ 注:外部时钟为8MHZ就无需改动 第一步: 改变外部时钟在 假设外部时钟为12MHZ 那么就改为 #define HSI_VALUE ((uint32_t)12000000) /*! Value of the Internal oscillator in Hz*/ 第二步: 改变倍频参数 假设外部时钟为12MHZ 那么就改为 /* PLL configuration: PLLCLK = HSE * 6 = 72 MHz */ RCC- CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFG
[单片机]
华为nova 5i配置信息: 麒麟710/2400万像素四摄
6月10日上午,@华为终端官方微博 正式官宣了华为nova 5,同时公布了nova品牌的新logo,似乎在暗示这次nova 5新机将会为我们带来很大的惊喜。据悉,华为nova 5也将成为系列产品,至少有华为nova 5i、华为nova 5、华为nova 5 Pro三款手机。目前华为nova 5i已登录工信部,代号GLK-AL00,相关配置也一同公布。   华为nova 5i正面搭载6.4英寸IPS屏幕,分辨率为2310*1080,另外根据之前曝光的信息,这款手机正面搭载LCD钻孔屏,而IPS屏幕作为LCD屏幕的一种,在一定程度上佐证了这一点。如果华为nova 5i真的搭载nova 4同款极点全面屏,真机正面颜值相当可期。另外,
[手机便携]
华为nova 5i<font color='red'>配置</font>信息: 麒麟710/2400万像素四摄
STM32F0xx_GPIO配置详细过程
前言 对于初学STM32的人来说,很多基础的知识没有掌握,这些基础知识就成为阻挡他们入门的门槛。因此,今天也把基础的知识分享出来,带领那些还没有迈过这个门槛的人入门。 今天总结“GPIO配置详细”,以F0标准外设库初始化结构体来重点讲解。接着昨天“新建软件工程详细过程”来进行讲解,今天分两大部分内容总结。工程描述、IO配置源代码详细讲解。 下载 ST标准外设库和参考手册、数据手册等都可以在ST官网下载的到(请自行下载)。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议使用这个,以后如果你换用一种型号芯片也方便了解。 今天提供下载的软
[单片机]
STM32F0xx_GPIO<font color='red'>配置</font>详细过程
STM32F1系列的DEBUG调试功能需要配置吗?
1写在前面 STM32CubeMX的好处相信大部分朋友都知道,那就是帮你快速生成初始化代码工程。 虽然方便了开发,但也给一些初学者,或者不怎么懂底层的朋友带来了不少困扰。 特别是使用该工具生成代码,出现问题的时候,如果你不懂一些底层的知识,可能你会很头疼。 本文关于DEBUG配置的问题,针对初学者,我也把前因后果简单说一下。 2起因 STM32CubeMX配置STM32F1系列MCU时,第一次能下载成功,但第二次,会出现如下错误: 这是什么错误? 没有连接到目标,也就是你的下载器(ST-LInk)是正常的,只是没有识别到你MCU。 这里推荐阅读专栏文章: ST-Link资料 3分析原因
[单片机]
STM32F1系列的DEBUG调试功能需要<font color='red'>配置</font>吗?
汽车上这项安全配置看似黑科技,其实就是个坑钱的货
随着汽车技术的不断进步,越来越多的高科技配置应用到了汽车当中,就拿安全配置来说,几乎没有一项安全配置是没有用的。无论是主动安全还是被动安全系统,要么就是防止事故的发生,要么就是在事故发生时将车辆和乘客的损失尽可能降低,总之都是对车主有益的。可能很多人不知道,还有一项安全配置叫做主动引擎盖行人保护系统,这项功能是为了在车辆与行人发生碰撞时保护行人的一种装置。 这种装置在本田雅阁、捷豹XF、奔驰马自达MX-5等很多车型上都有搭载,首先来跟大家说说这项功能具体是干什么用的。当车辆检测到即将与行人发生碰撞的时候,这套系统会控制引擎盖向上弹升,这样行人在受到撞击的时候并不会直接撞到坚硬的发动机盖上,而像是被弹起的发动机盖接住一样,
[汽车电子]
汽车上这项安全<font color='red'>配置</font>看似黑科技,其实就是个坑钱的货
STM32F0的BOOT配置以及相关话题
关于STM32F0系列的启动配置,有人说有点看不太懂,貌似有两套启动方式,又是脚又是选项位的。其实,它跟其它STM32 系列一样也是有三种启动模式,只是配置方式上有其特色。 它有两种配置方式,第一种是利用BOOT0物理脚和Nboot1、Boot_Sel选项位来确定启动模式;第二种只使用Boot_Sel、Nboot1 、Nboot0 三个选项位来确定启动模式,完全省却了物理脚,多出一根脚给用户应用。 对于第一种配置方式,所有STM32F0系列的芯片都适用。第二种配置方式仅适用于STM32F04X和STM32F09X系列的器件。 下图是STM32F0系列启动模式配置表。 红色方框内就是上面所指的第一种配置方式,对所有STM32
[单片机]
STM32F0的BOOT<font color='red'>配置</font>以及相关话题
三星将提前发布Galaxy S5 搭载惊人硬件配置
    最新一波有关三星旗舰Galaxy S4的升级版,Galaxy S5的传闻包括了无比强大的硬件配置,柔性材料的使用,此外三星最为疯狂的举动:在上代旗舰Galaxy S4发布后仅10个月后便将发布其继任者. 据韩国本土的业界消息显示,三星或将于1月份便将开始大规模生产Galaxy S5,它将搭载最新的安卓4.4 KitKat操作系统.与此同时,三星还将在3月份之前更新其Galaxy Gear产品线,推出Galaxy Gear 2.若三星将按该计划更新Galaxy S产品线,这意味着Galaxy S4的产品周期仅为10个月,第一批入手Galaxy S4的用户将在入手一周年的2个月前就将发觉自己的手机又落伍了. 有报道表示它将拥
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved