微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32时钟初始化函数SystemInit()详解

STM32时钟初始化函数SystemInit()详解

时间:09-28 来源:互联网 点击:

)

{

}

}

else

{ /* If HSE fails to start-up, the application will have wrong clock

configuration. User can add here some code to deal with this error */

}

}

1:AHB, APB1,APB2时钟确定

//HCLK = SYSCLK ,从下面的分析可以得出SYSCLK是使用PLLCLK时钟的,也就是72MHZ(至于72MHZ如何得来,请看下面分析)

//那么就是HCLK(AHB总线时钟)=PLLCLK = 72MHZ

//AHB总线时钟等于系统时钟SYSCLK,也就是 AHB时钟 = HCLK = SYSCLK = 72MHZ

/* HCLK = SYSCLK */

RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_div1;

//PLCK2等于HCLK一分频, 所以PCLK2 = HCLK,HCLK = 72MHZ, 那么PLCK2(APB2总线时钟) = 72MHZ

//APB2总线时钟等于HCLK的一分频,也就是不分频;APB2 时钟 = HCLK = SYSCLK = 72MHZ

/* PCLK2 = HCLK */

RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_div1;

//PCLK1 = HCLK / 2;PCLK1 等于HCLK时钟的二分频,那么PCLK1(APB1) = 72MHZ / 2 = 36MHZ

//APB1总线时钟等于HCLK的二分频,也就是 APB1时钟= HCLK / 2 = 36MHZ

/* PCLK1 = HCLK */

RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_div2;

2:如何得出SYSCLK(系统时钟)为72MHZ(外部晶振25MHZ)

//记得参考英文芯片资料的时钟树P115页和RCC时钟寄存器进行理解

RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREdiv2_div5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREdiv1SRC_PLL2 | RCC_CFGR2_PREdiv1_div5);

RCC_CFGR2_PREdiv2_div5: PREdiv2 = 5; 5分频

也就是PREdiv2对输入的外部时钟 5分频,那么PLL2和PLL3没有倍频前是25 /5 = 5MHZ

RCC_CFGR2_PLL2MUL8 : PLL2MUL = 8; 8倍频

8倍频后,PLL2时钟 = 5 * 8 = 40MHZ; 因此 PLL2CLK = 40MHZ

RCC_CFGR2_PREdiv1SRC_PLL2 : RCC_CFGR2的第16位为1, 选择PLL2CLK 作为PREdiv1的时钟源

RCC_CFGR2_PREdiv1_div5:PREdiv1 = 5;PREdiv1对输入时钟5分频 PREdiv1CLK = PLL2CLK / 5 = 8MHZ

以上是对RCC_CFGR2进行的配置

--------------------------------------------------------------------------------------

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREdiv1 | RCC_CFGR_PLLSRC_PREdiv1 |

RCC_CFGR_PLLMULL9);

RCC_CFGR_PLLXTPRE_PREdiv1 :操作的是RCC_CFGR的第17位PLLXTPRE,操作这一位和操作RCC_CFGR2寄存器的 位[3:0]中的最低位是相同的效果

RCC_CFGR_PLLSRC_PREdiv1 :选择PREdiv1输出作为PLL输入时钟;PREdiv1CLK = 8MHZ,所以输入给PLL倍频的 时钟源是8MHZ

RCC_CFGR_PLLMULL9 :PLLMUL = 9;PLL倍频系数为9,也就是对 PLLCLK = PREdiv1CLK * 8 = 72MHZ

以上是对RCC_CFGR进行的配置

---------------------------------------------------------------------------------------------------

RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; //选择PLLCLK作为系统时钟源

--------------------------------------------------------------------------------------------------

至此基本配置已经完成,配置的时钟如下所述:

SYSCLK(系统时钟) = 72MHZ

AHB总线时钟 = 72MHZ

APB1总线时钟 = 36MHZ

APB2总线时钟 = 72MHZ

PLL时钟 = 72MHZ

PLL2时钟 = 40MHZ

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top