STM32F1 Kristalden çalışmıyor.

Başlatan mistek, 16 Ocak 2014, 18:41:54

mistek

STM32f100 mininum devre şeması kurulu ve 8MHz kristal bağlı. Kodu SWD ile atıyorum kendisi resetlemesi gerekiyor ama yapmıyor, işlemciyi manuel resetliyorum Systeminit() fonksiyonunu çağırıyorum normalde 24Mhz'e ayarlaması gerekirken kristali hiç önemsemeyip direk iç osilatörden başlıyor.

Kodu atıp debug moduna girersem ve kodları adım adım işletirsem sonra debugtan çıktığımda kristalden çalışmış oluyor yani hızı 24MHz. Reset atarsam yine kristalden başlamıyor.

Sebebi ne olabilir?

Led yak söndür yapıyorum. Gerekirse kod eklerim
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

muhendisbey

Alıntı yapılan: mistek - 16 Ocak 2014, 18:41:54
STM32f100 mininum devre şeması kurulu ve 8MHz kristal bağlı. Kodu SWD ile atıyorum kendisi resetlemesi gerekiyor ama yapmıyor, işlemciyi manuel resetliyorum Systeminit() fonksiyonunu çağırıyorum normalde 24Mhz'e ayarlaması gerekirken kristali hiç önemsemeyip direk iç osilatörden başlıyor.

Kodu atıp debug moduna girersem ve kodları adım adım işletirsem sonra debugtan çıktığımda kristalden çalışmış oluyor yani hızı 24MHz. Reset atarsam yine kristalden başlamıyor.

Sebebi ne olabilir?

Led yak söndür yapıyorum. Gerekirse kod eklerim
Kristal bağlantısını ekleyebilir misin?
Bazen osilasyonun başlaması için kristalin bir bacağına (kristalle işlemci arasına) direnç bağlamak gerekebilir. Veya kristal bacakları arasındaki uzunluk farkı bazen osilasyon problemlerine neden olabiliyor.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

z

Bence systeminit fonskiyonunuzda sorun var.

İşlemci resetlendiğinde internal osc ile yola koyulur. System initde yazılım, ext osc yi devreye alır ve osilatorun stabil hale gelmesini bekler ardından PLL ayarlamalarını vs yapar.

System init düzgün yazılmamış olabilir mi?


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

Z hocam Systeminit fonksiyonunu ben yazmadım keilin kendi fonksiyonunu kullanıyorum hep. Stm32f107 de sıkıntısız çalışıyorum ama bütün stm32f100 işlemcilerimde aynı problem oluyor. Debugta adım adım işletiyorum systeminit içerisinde gerekli işleri düzgünce yapıyor ama debugtan çıkıp reset attığımda yapmıyor demekki düzgün çalışmıyor.

@muhendisbey kristal bacağına direnç bağlı değildi direnç bağlayarakta denedim yine olmadı. Sadece debugtayken çalışması başka biyerde sıkıntı var diye gösteriyor gibi.

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

z

Yanlış hatırlamıyorsam işlemcinin low density, medium density, high density durumuna göre bazı registerlerde çok ufak farklılıklar var.
Dosyalardan birisinde (adını hatırlamıyorum) kullandığınız işlemcinin hangi tip işlemci olduğunu tanımlamanız gerekiyor.

Bu duruma dikkat ettiniz mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

Evet stm32f100c8 kullanıyorum Medium Density olarak belirttim debugtada zaten özellikle oralara dikkat ediyorum. Stm32f10x.h dosyası içerisinde tanımlama isteniyor.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

Tamam sorunu buldum. Yine en doğru kod kendi yazdığın koddur.

Systeminit fonksiyonu tanımlamalara göre aşağıdaki fonksiyonu çağırıyor bu fonksiyonda kristalden gelecek yanıtı beklerken araya birde sayaç koymuşlar olurda cevap alamazsak çakılı kalmayalım diye. HSE_STARTUP_TIMEOUT değerini çok küçük girmişler kristal hazırım diyene kadar sayaç taşıyor ve direk iç osilatörü kuruyor. İster StartUpCounter++;  kısmını silin isterseniz stm32f10x.h dosyasından HSE_SARTUP_TIMEOUT değerini yükseltin. Ben 0xFFFF olarak ayarladım ne olur olmaz diye.

Debugda çalışmasının nedenide adım adım işlettiğim için kristal o arada geçen sürede hazırlanıyor ve cevap veriyordu.

Şimdi sorun yok çalışıyor.
static void SetSysClockTo24(void)
{
  /* 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));


Buradaki SartUpCounter sadece 24 36 48 ve 56 Mhz e kuran fonksiyonlar için kullanılmış. Stm32f107 (CL) gibi çiplerde yok.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R