| 代號 | 全名 | 頻率範圍 | 特點 |
|---|---|---|---|
| HSI | High-Speed Internal | 8 MHz 固定 | 內部 RC 振盪器,精度較低 (±1%),無外部元件 |
| HSE | High-Speed External | 4~16 MHz | 外部晶體/陶瓷諧振器或時鐘源,精度高 |
| LSI | Low-Speed Internal | ~40 kHz | 低功耗,供獨立看門狗 (IWDG) 或 RTC |
| LSE | Low-Speed External | 32.768 kHz | 外部 32.768kHz 晶體,供 RTC 精準計時 |
| PLL | Phase-Locked Loop | 輸出 ≤ 72 MHz | 輸入可選 HSI/2、HSE、HSE/2;倍頻 2~16x |
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);
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
所有外設驅動前必須確認其掛載總線 (APB1/APB2) 並呼叫對應
RCC_*PeriphClockCmd()使能。時鐘配置錯誤是外設不工作的首要原因。