精华内容
下载资源
问答
  • STM32F4系统时钟树

    2020-11-14 11:27:03
    STM32F4系统时钟树配置笔记


    Keil中的配置

    时钟配置在system_stm32f4xx.cstm32f4xx.h中,如PLL_MPLL_NPLL_PPLL_QHSE_VALUE
    时钟配置函数:SystemInit()

    • m: VCO 输入时钟 分频因子,取值2~63
    • n: VCO 输出时钟 倍频因子,取值192~432
    • p: SYSCLK 时钟 分频因子,取值2,4,6,8 。
    • q: OTG FS,SDIO,RNG 时钟 分频因子,取值4~15
    • PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
    • SB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ
    • SYSCLK = PLL_VCO / PLL_P
      在这里插入图片描述
      在这里插入图片描述
    • 一般情况下,我们都是使用HSEHSE经过PLL倍频之后作为系统时钟
    • 如果开启了CSS功能的话,那么可以当HSE故障时,在CSS中断里面采取补救措施,使用HSI,重新设置系统频率为180M,让系统恢复正常使用。

    时钟树详解

    • 对于SYSCLK、HCLK、PCLK2、PCLK1 这四个时钟的配置一般是:HCLK =SYSCLK=PLLCLK = 180M,PCLK2=HCLK/2 = 90M,PCLK1=HCLK/4 = 45M。

    在这里插入图片描述

    ①HSE 高速外部时钟信号

    • 当使用有源晶振时,时钟从OSC_IN 引脚进入OSC_OUT 引脚悬空;当选用无源晶振时,时钟从OSC_INOSC_OUT 进入,并且要配谐振电容。
    • HSE 故障时,高速的内部时钟信号HSI会作为备用的系统时钟,直到HSE恢复正常,HSI=16M

    ②锁相环PLL

    • HSE 或者HSI 经过PLL 时钟输入分频因子M(2~63)分频后,成为VCO 的时钟输入,VCO 的时钟必须在1~2M 之间,我们选择HSE=25M作为PLL 的时钟输入,M 设置为25,那么VCO输入时钟就等于1M
    • PLLCLK_OUTMAX = VCOCLK_OUTMAX / P_MIN = 432/2=216M,即F429 最高可超频216M
    • PLL 的时钟配置经过,稍微整理下可由如下公式表达:
      • VCOCLK_IN = PLLCLK_IN / M = HSE / 25 = 1M
      • VCOCLK_OUT = VCOCLK_IN * N = 1M * 360 = 360M
      • PLLCLK_OUT=VCOCLK_OUT/P=360/2=180M
      • USBCLK = VCOCLK_OUT/Q=360/7=51.7。暂时这样配置,到真正使用USB 的时候会重新配置。

    ③系统时钟SYSCLK

    系统时钟来源可以是:HSIPLLCLKHSEHSE,具体的由时钟配置寄存器RCC_CFGRSW位配置。

    ④AHB 总线时钟HCLK

    • 系统时钟SYSCLK经过AHB预分频器分频之后得到时钟叫APB总线时钟,即HCLK
    • 片上大部分外设的时钟都是经过HCLK分频得到。

    ⑤APB2 总线时钟HCLK2

    • APB2 总线时钟PCLK2HCLK经过高速APB2 预分频器得到。
    • HCLK2属于高速的总线时钟,片上高速的外设就挂载到这条总线上,比如全部GPIOUSART1SPI1等。

    ⑥APB1 总线时钟HCLK1

    • APB1总线时钟PCLK1HCLK经过低速APB1 预分频器得到。
    • HCLK1属于低速的总线时钟,最高为45M片上低速的外设就挂载到这条总线上,比如USART2/3/4/5SPI2/3I2C1/2等。

    A、RTC 时钟

    • RTCCLK 时钟源可以是 HSE 1 MHzLSE 或者 LSI时钟。
    • 通常的做法是由LSERTC 提供时钟,大小为32.768KHZ
    • LSE由外接的晶体谐振器产生,所配的谐振电容精度要求高,不然很容易不起震。

    B、独立看门狗时钟

    由内部的低速时钟LSI提供,大小为32KHZ

    C、I2S 时钟

    I2S时钟可由外部的时钟引脚I2S_CKIN输入,也可由专用PLLI2SCLK提供。

    D、PHY以太网时钟

    • F429要想实现以太网功能,除了有本身内置MAC之外,还需要外接一个PHY芯片。
    • 当使用RMII接口时,PHY芯片只需输出一路时钟MCU即可。
    • 如果是MII接口,PHY芯片则需要提供两路时钟MCU

    E、USB PHY 时钟

    • F429 的USB没有集成PHY,必须外置 USB PHY 芯片。
    • 当外接USB PHY芯片时,PHY芯片需要给MCU提供一个时钟

    F、MCO 时钟输出

    MCOmicrocontroller clock output的缩写,是微控制器时钟输出引脚,主要作用是可以对外提供时钟,相当于一个有源晶振
    在这里插入图片描述


    CubeMX可视化时钟树

    在这里插入图片描述|


    展开全文
  • STM32系统时钟树分析

    千次阅读 2017-05-07 15:07:23
    下面是一个STM32芯片的时钟树图 1、LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用。 2、LSE是低速外部时钟,接频率为32.768kHz的石英...HSE也可以直接作为系统时钟或者PLL输入

    下面是一个STM32芯片的时钟树图
    这里写图片描述
    1、LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用。
    2、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。
    3、HSE是高速外部时钟,课接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。我们开发板接的是8M的晶振。HSE也可以直接作为系统时钟或者PLL输入。
    4、HSI是高速内部时钟,RC振荡器,频率为16MHz。可以直接作为系统时钟或者用作PLL输入。
    5、PLL为锁相环倍频输出。STM32F4有两个PLL:
    (1)主PLL由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。
    第一个输出PLLP用于生成高速的系统时钟(最高168MHz)
    第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟。
    (2)专用PLL(PLLI2S)用于生成精确时钟,从而在I2S借口实现高品质音频性能。
    这里写图片描述 这里写图片描述
    大家在图中可以看到一些梯形,这些梯形为选择器。左边为选择器,右边为分频器

    LSI,低速内部时钟

    LSI低速内部时钟,频率为32kHz。RC振荡器产生,因为是RC振荡器产生,所以频率不是很稳定。主要对右边的独立看门狗做时钟。因为独立看门狗对时钟的精度要求不是很高,所以可以使用LSI。LSI比较简单,简单的理解就是一个电阻一个电容。
    LSI还可以作为RTC模块的时钟来源。在RTC模块左边有一个选择器,那么它不仅可以选择LSI作为时钟来源,还可以选择LSE作为时钟来源。

    LSE,低速外部时钟

    LSE一般是由外接的一个精确的32.768k的晶振产生,比较稳定,一般情况下RTC选择LSE作为时钟源。RTC的时钟来源还可以来自HSE(图上有线连着,顺着线找)。

    MCO1/MCO2

    在LSE下面有MCO1和MCO2两个引脚,这两个引脚就是把芯片内部的时钟输出到引脚。MCO1对应的是PA8,MCO2对应的是PC9(笔者这里使用的STM32F407芯片),MCO1和MCO2都有一个选择器,可以选择四个时钟来源,选择好时钟来源后经过一个分频器,分频就是对时钟进行除法运算,然后再输出到对应的引脚。

    HSE,高速外部时钟

    HSE是由外接的晶振产生的,是4MHz~26MHz。HSE产生时钟后会先经过一个分频器,这个分频系数是2~31,分频后的时钟才可以作为RTC时钟的一个选择。

    HSI,高速内部时钟

    这里写图片描述
    由RC振荡器产生,精度不高。首先,可以作为MCO1的一个时钟来源,其次可以作为系统时钟的一个来源。向下会将时钟信号送给一个选择器,这个选择器可以选择来自HSE和HSI的信号。左边一个“/M”的分频器,会把选择的时钟/M之后产生一个频率,产生一个频率后就到了PLL。

    PLL,锁相环倍频输出

    这里写图片描述
    上面的叫主PLL,下面的叫专用PLL。主PLL产生两种时钟,一种作为系统时钟;一种叫作PLL48CK的时钟,用于USB OTG的时钟。专用PLL时钟主要是给I2S模块使用,因为I2S主要处理音频问题,对于频率的要求比较高,所以就有一个专用PLL。时钟信号从“/M”分频器出来后,进入“xN”的倍频器,然后在“/P”、“/Q”或者“/R”,“/P”出来后作为系统时钟;“/Q”出来后作为PLL48CK时钟;“/Q”出来后作为I2S时钟。从这里我们就能计算出从PLL出来的时钟频率,假设从选择器进去的时钟频率为f,PLL=(f/M)(N/P)或者PLL=(f/M)(N/Q)或者PLL=(f/M)*(N/R)。

    图中A~G表示的地方:
    A: 这里是看门狗时钟输入。从图中可以看出,看门狗时钟源之恩给你是低速的LSI时钟。
    B: 这里是RTC时钟源,从图上可以看出,RTC的时钟源可以选择LSI,LSE,以及HSE分频后的时钟,HSE分频系数为2~31。
    C: 这里是STM32F4输出时钟MCO1和MCO2。MCO1是芯片的。PA8引脚输出时钟。它有四个时钟来源分别为:HSI,LSE,HSE和PLL时钟。MCO2是向芯片的PC9输出时钟,它同样有四个时钟来源分别为:HSE,PLL,SYSCLK以及PLLI2S时钟MCO输出时钟频率最大不超过100MHz。
    D: 这里我们值得是以太网PTP时钟,AHB时钟,APB2高速时钟,APB1低速时钟。这些时钟都是来源与SYSCLK系统时钟。其中以太网PTP时钟是使用系统时钟。最大时钟为168MHz,APB2高速时钟最大频率为84MHz,而APB1低速时钟最大频率为42MHz。
    F: 这里是指I2S时钟源。从图可以看出,I2S的时钟源来源于PLLI2S或者映射到I2S_CKIN引脚的外部时钟。I2S出于音质的考虑,对时钟精度要求很高。
    G: 这是STM32F4内部以太网MAC时钟的来源。对于MII接口来说,必须向外部PHY芯片提供25MHz的时钟,这个时钟,可以由PHY芯片外接晶振,或者使用STM32F4的MCO输出来提供。然后,PHY芯片再给STM32F4提供ETH_MII_TX_CLK和ETH_MII_RX_CLK时钟。对于RMII接口来说,外部必须提供50MHz的时钟驱动PHY和STM32F4的ETH_RMII_REF_CLK,这个50MHz时钟可以来自PHY、有源晶振或者STM32F4的MCO。我们的开发板使用的是RMII接口,使用PHY芯片提供50MHz时钟驱动STM32F4的ETH_RMII_REF_CLK.
    H: 这里是指外部PHY提供的USB OTG HS (60MHz)时钟。

    本文图片来STM32F4开发指南,部分内容参考STM32F4开发指南。如有不妥,还请各位多多指出。

    展开全文
  • 可作为系统时钟或 PLL 锁相环的输入。 ②HSE 是外部高速时钟。 可通过外接一个频率范围是 4-16MHz 的时钟或者晶振。 HSE 可以作为系统时钟和 PLL 锁相环输入, 还可以经过 128 分频后输入给 RTC。 ③LSI 是内部低速...

    在这里插入图片描述
    HSI 是内部高速时钟, RC 振荡器, 频率为 8MHz。 可作为系统时钟或 PLL 锁相环的输入。
    HSE 是外部高速时钟。 可通过外接一个频率范围是 4-16MHz 的时钟或者晶振。 HSE 可以作为系统时钟和 PLL 锁相环输入, 还可以经过 128 分频后输入给 RTC。
    LSI 是内部低速时钟, RC 振荡器, 频率大约为 40K, 可供独立看门狗和 RTC 使用, 并且独立看门狗只能使用 LSI 时钟。
    LSE 是外部低速时钟,芯片上有相应的外部低速时钟管脚。 通常在此管脚上外接一个 32.768KHz 的晶振, 供 RTC使用。
    PLL 是锁相环, 用于倍频输出。

    展开全文
  • 看懂时钟树——掌握系统时钟配置

    千次阅读 2019-09-01 12:27:37
    ——基于STM32F107VCT6的理解 ...一般不长时间作为系统时钟使用,一般做备用,或在切换时使用。 2、HSE(外部高速时钟:3-25MHZ) STM32提供两组外部时钟接口,HSE和LSE(外部低速时钟)。外部...

    ——基于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,      
    	12.000000,      13.000000,      14.000000,      15.000000,      
    	16.000000,      17.013889,      18.000000,		18.993506,      
    	20.000000,      21.000000,      22.000000,      23.011364,      
    	24.000000,      25.000000,      26.000000,      27.000000,      
    	28.000000,      29.017857,      30.000000,      30.952381,      
    	32.000000,      33.000000,		34.027778,      35.000000,      
    	36.000000,      37.019231,      37.987013,      39.000000,      
    	40.000000,      41.025641,      42.000000,      42.968750,      
    	44.000000,      45.000000,      46.022727,      46.944444,      
    	48.000000,		49.000000,      50.000000,      51.020408,      
    	52.000000,      53.030303,      54.000000,      55.000000,      
    	56.000000,      56.875000,      58.035714,      58.928571,      
    	60.000000,      60.937500,      61.904762,      63.000000,
    	64.000000,      65.000000,      66.000000,      67.307692,      
    	68.055556,      68.939394,      70.000000,      71.093750,      
    	72.000000 };
    	/*重设系统时钟函数*/
    float ResetSysClK1(int Sysclk_Value)
    {
    		//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|(data[Sysclk_Value-4][0]<<18);
    	//设置MUL2、DIV2、DIV1、PREDIV1SRC(PLL2作为PREDIV1的时钟源)
    	*RCC_CFGR2 = (*RCC_CFGR2 & 0xfffef000)|0x00010000|( data[Sysclk_Value-4][1]<<8)|( data[Sysclk_Value-4][3]<<4 )|data[Sysclk_Value-4][2];
    	//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 set_clk[Sysclk_Value-4];
    	
    }
    

     

    展开全文
  • STM32—时钟树(结合系统时钟函数理解)

    千次阅读 多人点赞 2019-07-22 23:53:14
    时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这...
  • STM32系统时钟配置及时钟树

    千次阅读 2018-11-05 20:47:38
    STM32时钟可大致分为系统时钟和其它时钟两大类,总共包含5个时钟源 HSI(High Speed Internal Clock)、HSE(High Speed External Clock)、LSI(low Speed Internal Clock)、LSE(Low Speed External Clock )、PLL(Phas....
  • M031时钟树.zip

    2020-06-19 11:12:01
    本资源是新唐单片机的系统时钟树,时钟控制器为整个芯片生成时钟,包括系统时钟和所有外设时钟。有助于开发者快速阅读查看芯片的时钟来龙去脉。
  • STM32F4xx时钟树 STM32F407时钟树 ...HSI 时钟信号由内部 16 MHz RC 振荡器生成,可直接用作系统时钟,或者用作 PLL 输入。 3、LSE:低速外部时钟 LSE 晶振是 32.768 kHz 低速外部 (LSE) 晶振或陶瓷谐振器,可
  • stm32时钟树以及修改系统时钟频率

    千次阅读 2017-11-14 17:35:25
    前言:在学51的时候我们知道单片机想要工作必须要有时钟,在stm32中,外部时钟源不是必须的,因为内部就有时钟源,因此我们需要了解stm32的时钟树以方便以后我们设置自己所需要的时钟频率时钟树解读1.首先我们找到最...
  • HSE:High Speed External Clock signal,即高速的外部时钟。 来源:无源晶振(4-16M),通常使用8M。 控制:RCC_CR时钟控制寄存器的位16:HSEON控制
  • 复位与时钟控制器(Reset Clock Controller)缩写 转自:http://hi.baidu.com/acmbuguake/item/28561e0342303fc31ef04677
  • 百万门系统级芯片的时钟树设计.pdf
  • 【STM32】系统时钟RCC详解(超详细,超全面)

    万次阅读 多人点赞 2019-08-08 15:42:35
    时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。 为什么 STM32 ...
  • SMT32时钟树

    2014-01-20 11:04:44
    SMT32时钟树 时钟系统框图及说明
  • 认识STM32的时钟管理方式后就要对其时钟树系统有一个大体的掌握,时钟树系统的结构如下,从图中可以知晓有多少时钟、时钟速度为多少、时钟如何分配等。图看起来很复杂,但我们只需要大体了解其运作流程即可。 各类...
  • 先看一张STM32时钟系统框图    在STM32中,有五个时钟源,分别是为HSI、HSE、LSI、LSE、PLL。  HSI内部高速RC振荡时钟,8MHz;HSE,外部高速时钟,4M__16MHZ;LSI,内部低速RC 时钟,40KHZ;LSE外部低速时钟...
  • STM32 F103 时钟树详解

    万次阅读 多人点赞 2018-09-20 14:48:50
    STM32为了实现低功耗,而设计的功能完善构成复杂的时钟系统,称之时钟树。使外设功能的时钟可自配置。因为STM32外设众多,而不同的项目用到的外设参差不齐,所以可控的时钟可以实现降低产品功耗。 ...
  • STM32时钟树分析

    万次阅读 多人点赞 2017-06-18 16:32:58
    对于刚接触STM32的时钟树,对时钟树的理解,可以重点先思考两个问题: 1、时钟从哪里来:时钟源。 2、时钟怎么供给STM32的系统工作:时钟的流向(输入——>处理——>输出) 下面以STM32F4系列的时钟树为例,分析...
  • STM32F10x 时钟系统初学总结 一、时钟系统 1、概述    用通俗的话来说,时钟是单片机的“脉搏”,是单片机的驱动源,使用单片机中的任何一个外设都必须打开此外设相应的时钟。这样的好处是,在不使用某个...
  • STM32时钟系统导读时钟系统的构成总结 导读 我在刚开始接触STM32/单片机的时候看到它的时钟系统/时钟树,都会感觉懵懵的,这是个啥?它想要告诉我哪方面的数据?特此一文记录一下学习...系统时钟 分/倍频器 外设 F7
  • 时钟树详解

    千次阅读 2020-03-08 17:42:06
    在STM32的启动文件中会调用调用固件库函数中的SystemInit(在文件system_stm32f10x.c)来初始化时钟,把时钟初始化为72Mhz,先来看下时钟树的整体图 先看锁相环时钟的设置 我们先看到HSE,什么是HSE,HSE就是High Speed ...
  •  正如上一单元所提及,跟随时钟信号从时钟树组件到接收器或目的地,将被视为处理相位噪声 的系统。 也就是说,如果我们知道每个时钟树组件的相位噪声特性,我们就应该能够在特定的抖动带宽上估计结束时钟相位噪声...
  • STM32 时钟树

    千次阅读 2016-11-16 20:17:41
    在我之前的文章中讲到了时钟的使能,我们通过查看系统的框架图,找到了AHB系统总线,在图中可以知道其为...时钟的问题是一个很基础的问题,是学习一款单片机的核心,我们可以通过参考手册看看STM32的时钟树是怎样的。
  • STM32 时钟树配置快速入门

    千次阅读 2019-11-05 21:53:48
    layout: post tags: [STM32] comments: true 文章目录layout: post tags: [STM32] comments: true为什么要了解时钟树?...最近项目开发的时候,外部时钟源是16MHz,结果配置错了系统时钟,STM32F103的系统时钟...
  • STM32时钟树

    2018-08-11 13:02:10
    对于刚接触STM32的时钟树,对时钟树的理解,可以重点先思考两个问题: 1、时钟从哪里来:时钟源。 2、时钟怎么供给STM32的系统工作:时钟的流向(输入——&gt;处理——&gt;输出) 下面以STM32F4系列...
  • STM32时钟树学习笔记

    2017-07-27 15:32:22
    直接上时钟树 在学习STM32的时候时钟的配置是一直必不可少的过程,也许你用别人的代码很爽,但是真正的做项目还是使用自己建立的工程最靠谱。 上图为用的原子哥的一张时钟树的图片。 下面是经常用到的全局宏...
  • STM32F10X的时钟树及时钟初始化

    千次阅读 2016-03-24 17:27:45
    对于初学者而言,时钟是一个很重要很深的概念,对于STM32芯片来讲,为了实现低功耗,设计了一个功能完善但是却很复杂的时钟系统,使得外围功能的时钟可配置,...STM32的时钟树,如下图所示: STM32有一下4个时钟源:
  • AHB : ...AHB:Advanced High-performance Bus ...AHB和和和和APB这两种总线所连的外设是有区别的这两种总线所连的外设是有区别的这两种总线所连的外设是有区别的这两种总线所连的外设是有...STM32时钟树
  • STM32F4时钟树

    千次阅读 2019-01-22 17:18:15
    时钟是单片机的心脏,重要性不言而喻,STM32F4的时钟树是比较复杂的,所以不是一言两语能写清楚的,我只简单的描述下时钟来源,详细知识需要去看正点原子的视频讲解。 整个时钟来源有五个: 1.LSI(Low Speed ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,737
精华内容 9,894
关键字:

系统时钟树