4. ünite / 11 · yaklaşık 3 saat
RCC ve saat ağacı
HSI, HSE ve PLL; SYSCLK, AHB ve APB bölücüleri; zamanlayıcı saatinin iki katına çıkması; Flash bekleme durumları.
Bu ünitenin sonunda
- Saat kaynaklarını (HSI, HSE, LSE, PLL) ve kullanım yerlerini ayırt etmek
- PLL M, N, P, Q değerleriyle SYSCLK ve USB 48 MHz'i hesaplamak
- APB sınırlarını ve "APB bölücüsü 1 değilse zamanlayıcı saati ×2" kuralını uygulamak
- Saat yükselince Flash bekleme durumunun neden artması gerektiğini açıklamak
Ders notları
Bir mikrodenetleyicide her şey bir saatle ilerler; STM32'de saatleri RCC (Reset and Clock Control) dağıtır. Sıfırlamadan sonra çekirdek dahili 16 MHz HSI osilatörüyle çalışır: hemen hazırdır ama sıcaklıkla %1 kayabilir. Harici kristal HSE (Nucleo'da ST-LINK'ten gelen 8 MHz) çok daha kararlıdır; UART ve USB için tercih edilir. 32,768 kHz LSE gerçek zaman saatini (RTC) besler.
PLL
PLL, giriş saatini çarpıp bölerek yüksek frekans üretir:
Kurallar: VCO girişi 1–2 MHz (2 MHz önerilir), VCO çıkışı 100–432 MHz, USB tam 48 MHz. F407 için klasik ayar HSE 8 MHz, M = 8, N = 336, P = 2, Q = 7: 168 MHz SYSCLK ve 48 MHz USB.
Veri yolu bölücüleri
SYSCLK, AHB bölücüsünden HCLK olur; HCLK de APB1 (yavaş, F407'de ≤ 42 MHz) ve APB2 (hızlı, ≤ 84 MHz) bölücülerinden geçer. Önemli tuzak: APB bölücüsü 1 değilse, o veri yolundaki zamanlayıcıların saati çevre biriminin iki katıdır. APB1 42 MHz ise TIM2–TIM5 84 MHz ile sayar. 5. ünitedeki PSC/ARR hesabı bu sayıyla yapılır.
Flash bekleme durumu
Flash, 168 MHz'te bir çevrimde okunamaz; işlemci beklemelidir. 3,3 V'ta her 30 MHz için bir bekleme durumu eklenir (168 MHz: 5). Saati yükseltmeden önce bekleme durumunu artırmak gerekir; tersi sırada kod rastgele çöker.
Simülasyon
RCC saat ağacı ve PLL hesaplayıcı
HSI ya da HSE, PLLM/N/P/Q ve AHB/APB bölücülerini seç. SYSCLK, APB1/APB2, zamanlayıcı saatleri, USB 48 MHz ve Flash bekleme durumu hesaplanır; sınır aşımları kırmızı yanar.
Kendin dene
Saat hesaplayıcıda F407 için 168 MHz'i kur ve USB'nin 48 MHz olduğunu doğrula. APB1 bölücüsünü 2 yap: hangi sınır aşıldı? Sonra F411 (100 MHz) seçip HSE 25 MHz ile 100 MHz ve 48 MHz USB'yi aynı anda veren M, N, P, Q değerlerini bul. Her ayarda TIM2 saatini not et.
Kod
void SystemClock_Config(void) {
RCC_OscInitTypeDef osc = {0};
RCC_ClkInitTypeDef clk = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;
osc.HSEState = RCC_HSE_BYPASS; /* Nucleo: ST-LINK'ten 8 MHz saat */
osc.PLL.PLLState = RCC_PLL_ON;
osc.PLL.PLLSource = RCC_PLLSOURCE_HSE;
osc.PLL.PLLM = 4; /* 8/4 = 2 MHz VCO girişi */
osc.PLL.PLLN = 168; /* 2 × 168 = 336 MHz VCO */
osc.PLL.PLLP = RCC_PLLP_DIV4; /* 336/4 = 84 MHz SYSCLK */
osc.PLL.PLLQ = 7; /* 336/7 = 48 MHz USB */
if (HAL_RCC_OscConfig(&osc) != HAL_OK) Error_Handler();
clk.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clk.AHBCLKDivider = RCC_SYSCLK_DIV1;
clk.APB1CLKDivider = RCC_HCLK_DIV2; /* APB1 ≤ 42 MHz; zamanlayıcıları 84 MHz */
clk.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_2) != HAL_OK) Error_Handler(); /* 84 MHz: 2 bekleme */
}Sık yapılan hatalar
- Zamanlayıcı saatini APB saatiyle aynı sanmak: bölücü 1 değilse iki katıdır, PWM frekansı yarı çıkar.
- Saati yükseltip Flash bekleme durumunu güncellememek.
- Nucleo'da HSE'yi kristal sanmak: ST-LINK'ten gelen harici saattir, BYPASS kipi seçilmelidir.
- HSI ile hassas UART ya da USB kullanmak: sıcaklıkla kayma iletişim hatasına yol açabilir.
Yazılım mühendisliği bağlantısı
Saat ayarı tüm sistemin varsayımıdır: UART baud, PWM frekansı, gecikmeler ona bağlıdır.
- Frekansları tek bir başlık dosyasında sabit olarak tut ve diğer hesapları ondan türet.
- Açılışta
HAL_RCC_GetSysClockFreq()değerini günlüğe yaz ve beklenenle karşılaştıran bir öz-test ekle.
Kendini sına
HSE 8 MHz, M = 8, N = 336, P = 2. SYSCLK kaçtır?
APB1 = 42 MHz ve APB1 bölücüsü 4 ise TIM2 hangi saatle sayar?
USB için hangi koşul gerekir?
Saati 30 MHz'ten 168 MHz'e çıkarmadan önce ne yapılmalı?