Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

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:

VCO = (giriş / M) × N    SYSCLK = VCO / P    USB = VCO / Q

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.

HSE8 MHz/M 8VCO giriş1 MHz×N 336VCO336 MHz/P 2/Q 7USB48 MHzSYSCLK168 MHz/AHB 1HCLK168 MHz/4/2APB1 (PCLK1)42 MHzTIM2-584 MHzAPB2 (PCLK2)84 MHzTIM1168 MHz
OK Tüm sınırlar içinde. USB 48 MHz: evet · Flash bekleme: 5

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

SystemClock_Config: HSE 8 MHz → 84 MHz (F401)
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

  1. HSE 8 MHz, M = 8, N = 336, P = 2. SYSCLK kaçtır?

  2. APB1 = 42 MHz ve APB1 bölücüsü 4 ise TIM2 hangi saatle sayar?

  3. USB için hangi koşul gerekir?

  4. Saati 30 MHz'ten 168 MHz'e çıkarmadan önce ne yapılmalı?

Gerçek parçalar (Hyvex, 3B modelli)

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç