文章目录
1.时钟系统回顾
1.1时钟源分类
1.1.1HSI
芯片内部时钟信号
HSI时钟信号由内部8MHz的RC振荡器产生,可直接最作为时钟信号或在2分频后作为PLL输入。HSIRC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率仍较差。
1.1.2HSE
HSE是高速外部时钟,RC振荡器,频率为4MHZ~26MHz。
它主要有两种时钟源产生:
1.1.2.1 HSE 外部晶体/陶瓷谐振器
1.1.2.2 HSE用户外部时钟
1.1.3主PLL(PLL)时钟
PLL为锁相环倍频输出。
STM32F4有两个PLL:
主PLL由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。
①第一个输出PLLP用于生成高速的时钟系统(最高168MHz)
②第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟。
专用PLL(PLL2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。
1.1.4 LSI低速内部时钟
使用RC振荡器,频率为32kHz,提供低功耗时钟。主要供独立看门狗和自动唤醒单元使用。
1.1.5 LSE低速外部时钟
接频率为32.768kHz 的石英晶体。
1.2次级时钟源
指 前级的时钟源(时钟源可理解为频率信号,形象化为一定频率的方波,比如12MHz)进经过分频(降频)/倍频后得到的下一级时序输出。
比如二分频变成6MHz或者二分频后变成24MHz。
1.3
2.系统初始化函数
启动时钟
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
/* Reset the RCC clock configuration to the default reset state ------------*/
/注:PLLON:主PLL(PLL)使能
由软件置1和清零,用于使能PLL。
当进入停机或待机模式时由硬件清零。如果PLL时钟用作系统时钟,则此位不可清零。
0:PLL关闭
1:PLL开启
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Disable all interrupts */
RCC->CIR = 0x00000000;
/注:PLLSRC:主PLL和音频PLL输入时钟源和 audio PLL entry clock source
由软件置1和清零,用于选择PLL和PLLI2S时钟源。此位只有在PLL和PLL2S已禁止时才可写入。
0:选择HSI时钟作为PLL和PLLI2S时钟输入。
1:选择HSE振荡器时钟作为PLL和PLLI2S时钟输入。
#if defined (STM32F401xx)
/* PCLK2 = HCLK / 2*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
#endif /* STM32F401xx */
/* Configure the main PLL */
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
/* Enable the main PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till the main PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
设置PLLCFGR寄存器:
/* Configure the main PLL */
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
设置PLL_M、PLL_P、PLL_Q、PLL_N(设置时钟源),可通过这些参数计算频率。
位1:0 SW:系统时钟切换
10:选择PLL作为系统时钟
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;