STM32F4 Kartta HSE Sorunu

Başlatan camby, 11 Haziran 2013, 14:59:44

camby

Yaptığım kartta 8 MHz kristal var.

Discovery üzerinde kullandığım yazılımı kullanıyorum. system_stm32f4xx.c içerisindenki system_init fonksiyonu çalışıyor. HSE üzerinden 168 MHz sysclock üretiliyor.

İlk enerji verdiğimde , bazen HSE üzerinden besleniyor 168Mhz çalışıyor , bazen HSE'yi görmüyor 16MHz HSI ile çalışıyor.

Bu durumla karşılaşan oldu mu ? Neden HSE'yi atlıyor olabilir ?

system_init'i modifiye edicem ama beklemiyorum böyle bir durumu..

muhittin_kaplan

olmadı ama HSE oturtma rutini (for döngüsü) ni kontrol et.

camby

Şu an yaptığım yeni kartta da , HSE clock'u bazen yakalıyor bazen yakalamıyor. DC voltajın kalitesi , yükselme zamanı ,oturması vs gibi durumlar burada etkili olduğunu gözlemledim. DC voltajı yapabildiğim kadar stabil hale getireceğim. Ancak yine de bu durum kabul edilemez , her koşulu göz önünde bulundurup baştan bir system_init() yazacağım.

MC_Skywalker

NXP nin Coretex M MCU larında chip içindeki power domain kontrol birimi güç uygulandıktan 60ns sonra voltajın 2.8V ye yükselmiş, geçmiş ve stabil olmuş olmasını beklemekte. ST mcu larda da böyle birdurum vardır mutlaka.

NXP  MCUlarda yanlış hatırlamıyorsam user code (yani SystemInit) içinde xtal tanımlaması ve PLL beslemesi yapılmadıysa iç IRC osilatörü ile doğrudan PLL'i sürmekte. bu durum göz önüne alınabilir.

Alıntı YapUpon power-up or any chip reset, the LPC17xx use the IRC as the clock source. Software may later switch to one of the other available clock sources


camby

evet aslında st lerın ıcınde de power modulu var ancak hıc goz gezdırmedım , sımdı de aklıma gelmemıstı , neler sunuyor ona bakacagım.

Stde de aslında hsı ıle pll suruluyor ancak ayarlarını yapmak lazım. Kutuphaneden gelen systemınıt de o kısmı bos bırakmıslar, hsı 8mhz ıle calısmaya baslıyor 8/168 hız farkı oluyor bazen:). Acılısta hse bulunamaz ıse hsı ıle calısma kodu hemen orjınal kodun altına eklenebılır. Zaten ılk orneklerde bunların hepsını yapmıstık zaten de ben daha cok bazen bulup bazen bulmaması olayına odaklanacagım. Dıscovery ıle calısırken hıc yasamamıstım boyle bır sey.

muhittin_kaplan

Hocam ben ilk başlarda işlemcinin beslemesini vs nikendim ayarladığımda HSE osc pinlerinine arıza oluştuğunu keşfetmiştim. Güç kaynağı önemli.

camby

#6
Denediklerim :

1 - BOR level 3 yaptım yani voltaj 2,7V-3,6V seviyesi dışında işlemci reset konumunda kalacak. Ancak sonuç değişmedi , bazen HSE buldu bazen bulamadı.

2 - ( Sorun düzeldi ) : 

Library'den gelen system_init içerisinde şu şekilde bir başlangıç kodu var :

  /* Enable HSE */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));


Burada HSE aktif hale getirip , stabil hale gelip gelmediğine bakıyor sürekli olarak. Time dolduğunda ise bulunamadı diyip çıkıyor.

HSE_STARTUP_TIMEOUT


değeri ise header dosyası içersinde tanımlanmış :

/**
 * @brief In the following line adjust the External High Speed oscillator (HSE) Startup 
   Timeout value 
   */
#if !defined  (HSE_STARTUP_TIMEOUT) 
  #define HSE_STARTUP_TIMEOUT    ((uint16_t)0x0600)   /*!< Time out for HSE start up */
#endif /* HSE_STARTUP_TIMEOUT */ 


Buradaki 0x0600 değerini , 0x0A00 yapıp denedim. Şimdi tamamen düzeldi.

Yani kullandığınız kristale yada çevre etmenlere göre bu değer yetmeyebilir. Bilginiz olsun..

Ek olarak BOR de sürekli olarak artık aktif.