首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

STM32 系統時鐘架構全解析:五大時鐘源、PLL 倍頻、總線分頻與外設掛載

     編輯:關於C語言

五大時鐘源概覽

代號全名頻率範圍特點
HSIHigh-Speed Internal8 MHz 固定內部 RC 振盪器,精度較低 (±1%),無外部元件
HSEHigh-Speed External4~16 MHz外部晶體/陶瓷諧振器或時鐘源,精度高
LSILow-Speed Internal~40 kHz低功耗,供獨立看門狗 (IWDG) 或 RTC
LSELow-Speed External32.768 kHz外部 32.768kHz 晶體,供 RTC 精準計時
PLLPhase-Locked Loop輸出 ≤ 72 MHz輸入可選 HSI/2、HSE、HSE/2;倍頻 2~16x

系統時鐘樹 (SYSCLK 為核心)

SYSCLK (72 MHz max)
├── AHB 總線 (72 MHz)  → 核心、DMA、Flash、SRAM、GPIO
├── APB2 (高速, 72 MHz) → UART1, SPI1, TIM1, ADC1/2, GPIO, AFIO
└── APB1 (低速, 36 MHz) → UART2/3, SPI2/3, I2C1/2, CAN, USB, TIM2/3/4, PWR, BKP
    └── TIM2/3/4 專用倍頻器 (×2) → 最高 72 MHz

APB1 最大 36 MHz,但定時器 2/3/4 可經倍頻器達 72 MHz,實現高解析度 PWM/輸入捕獲。

時鐘使能控制

每個外設時鐘獨立控制,使用前必須使能:

// 使能 GPIOD 和 GPIOG 時鐘 (掛載於 APB2)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG, ENABLE);

系統時鐘初始化流程 (SystemInit)

static void SetSysClock(void) {
    #ifdef SYSCLK_FREQ_HSE
        SetSysClockToHSE();
    #elif defined SYSCLK_FREQ_24MHz
        SetSysClockTo24();
    #elif defined SYSCLK_FREQ_36MHz
        SetSysClockTo36();
    #elif defined SYSCLK_FREQ_48MHz
        SetSysClockTo48();
    #elif defined SYSCLK_FREQ_56MHz
        SetSysClockTo56();
    #elif defined SYSCLK_FREQ_72MHz
        SetSysClockTo72();  // 預設 72 MHz
    #endif
}

修改系統頻率

在 stm32f10x_rcc.c 第 115 行附近,註解掉預設 72 MHz 宏,定義所需頻率宏即可:

// #define SYSCLK_FREQ_72MHz 72000000
#define SYSCLK_FREQ_48MHz 48000000

預設 72 MHz 時鐘樹數值

  • SYSCLK = 72 MHz
  • AHB (HCLK) = 72 MHz
  • APB2 (PCLK2) = 72 MHz
  • APB1 (PCLK1) = 36 MHz

所有外設驅動前必須確認其掛載總線 (APB1/APB2) 並呼叫對應 RCC_*PeriphClockCmd() 使能。時鐘配置錯誤是外設不工作的首要原因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved