STM32 时钟

为什么要配置时钟

  • 单片机的寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。
    51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以用了,但是一直在耗能。
  • stm32之所以是低功耗,他将所有的门都默认设置为disable,在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是disable,这样耗能就会减少。

时钟配置

1. 开启高速时钟 HSE

// 设置时钟控制寄存器 RCC_CR 位 16 置 1 使能

    RCC->CR|= 0x00010000;
  • 位 16 : HSEON:外部高速时钟使能 当进入待机和停止模式时,该位由硬件清零,关闭 4-16MHz 外部振荡器。当外部4-16MHz 振荡器被用作或被选择将要作为系统时钟时,该位不能被清零。
2. 等待高速时钟就绪

// 读取时钟控制寄存器 RCC_CR位 17 为 1 就位

while(!(RCC-> CR>>17)); 
  • 位 17: HSERDY:外部高速时钟就绪标志 由硬件置’1’来指示外部 4-16MHz 振荡器已经稳定。在 HSEON 位清零后,该位需要 6 个外部 4-25MHz 振荡器周期清零。
3. 设置 APB1,APB2,AHB 分频系数

// 设置时钟配置寄存器

   RCC_CFGR RCC_CFGR=0x00000400;

(AHB :位 4-7, (低速)APB1 :位 8-10, (高速)APB2 :位 11-13)

  • 位 7:4: HPRE[3:0]:AHB 预分频 (AHB Prescaler) 0xxx: SYSCLK 不分频
  • 位 10:8: PPRE1[2:0]:低速 APB预分频(APB1) 100: HCLK 2 分频
  • 位 13:11: PPRE2[2:0]:高速 APB 预分频(APB2) 0xx:HCLK 不分频
4. 设置 PLL 倍频 // 配置时钟配置寄存器 RCC_CFGR 位 18-21
    RCC_CFGR|=7<<18;
  • 位 21:18: PLLMUL: PLL 倍频系数 0111: PLL 9 倍频输出
5. PLL 输入时钟源选择

//配置时钟配置寄存器 RCC_CFGR 位 16

RCC_CFGR|=1<<16; 
  • 位 16: PLLSRC: PLL 输入时钟源
    (PLL entry clock source) 1: HSE 时钟作为 PLL 输入时钟。 由软件置’ 1’或清’ 0’来选择 PLL
    输入时钟源。只能在关闭 PLL 时才能写入此位
6. 设置 FLASH 延时周期

// 48

    FLASH->ACR|=0x32; 
7. PLL 使能

// 设置时钟控制寄存器 RCC_CR 位 24

    RCC_CR|=0X01000000; 
  • 位 24: PLLON: PLL 使能 1: PLL 使能 当进入待机和停止模式时,该位由硬件
    清零。当 PLL 时钟被用作或被选择将要作为系统时钟时,该位不能被清零。
8. 等待 PLL 就绪

// 设置时钟控制寄存器RCC_CR 位 25置 1 锁 定

while(!(RCC_CR>>24)); 
  • 位 25: PLLRDY: PLL 时钟就绪标志 1:PLL 锁定 PLL 锁定后由硬件置’ 1’。
19. 设置 PLL作为 system时钟

// 配置时钟配置寄存器 RCC_CFGR 位0-1 :10

RCC_CFGR|=0X00000002; 
  • 位 1:0 SW[1:0]:系统时钟切换 10: PLL 输出作为系统时钟
    在从停止或待机模式中返回时或直接或间接作为系统时钟的 HSE 出现故障时,由硬件强制 选择 HSI
    作为系统时钟(如果时钟安全系统已经启动)
10. 等待 system时钟稳定

// 查看时钟配置寄存器 RCC_CFGR位 2-3:10

while((RCC->CFGR & (uint32_t)0x0c) != (uint32_t)0x08)
  • 位 3:2:SWS[1:0]:系统时钟切换状态 10: PLL 输出作为系统时钟; 由硬件置’ 1’或清’ 0’来指示哪一个时钟源被作为系统时钟

猜你喜欢

转载自blog.csdn.net/u011559046/article/details/80152936