SystemInit时钟系统初始化

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;

3.初始化时钟系统总括

3.1启动时钟系统
3.2 使能
3.3 选择时钟源,配置参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。✧* ꧁流痕꧂✧*。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值