Ynt: STM32F103 - Multi clock speed

Başlatan SpeedyX, 05 Haziran 2014, 20:52:04

SpeedyX

Merhabalar,

İşlemci hızını dinamik olarak değiştirmek istiyorum.

Seriden gönderdiğim sayıya göre 1,2,4,8,12,16,24,36,48,56,72 Mhz hızlarında çalışmasını istiyorum.

Ayrıca HSE ve HSI desteği de eklemek istiyorum.

Haliyle bir çok seçenek olduğundan hepsi için tek tek fonksiyon yazmak gerekebilir.

Bunları yapan kütüphaneler var mı?

mesaj birleştirme:: 05 Haziran 2014, 21:35:28

Farklı şekilde sorayım;

Parametre olarak n000000 gibi bir değer verilerek hızı n Mhz e ayarlayan bir fonksiyon yazılabilir mi?

muhittin_kaplan


SpeedyX

Evet, aslında o önemli değil. Başlangıçta 1 kere kurulacak diye de düşünebilirsiniz.
Sabit bir değere göre bir frekansa kurulacak...

muhittin_kaplan

Hocam SystemInıt değerini Belli bir Hafıza Adresinden Alarak yapsa(eeprom emulator), Çalışma Esnasında Değişiklik Yaptığınızda o Hafıza ya Değeri (değerleri) Yazsa ve soft reset atsa. Tekrar başladığında RCC dolayısıyla SystemInıt den belirli freq la başlar sanki

SpeedyX

#4
Evet aynen öyle olacaktır zaten ama SystemInit deki fonksiyonların hepsini açmadan yapılamaz mı, onu sesli düşünüyorum. Aslında bir tek ben düşünmüyorumdur, illa yapan olmuştur diye düşünüyorum...

mho

Ben şuan stm32f4 discover PLL  ayarlamasına bakıyorum

Datasheet ten anladığım kadarıyla işlemci clock unu işlemci çalışırken değiştiremiyoruz.Ancak reset atıp ardından farklı bir hızda çalışan SystemInit devreye sokulabiliriz gibisinden düşündüm tabi sizler daha iyi bilirsiniz bu konularda yeniyim :)

Gökhan BEKEN

system_init_1mhz();
system_init_4mhz();
system_init_8mhz();
.
.
system_init_Xmhz();
şeklinde birden fazla system_init olsa duruma göre program içinden çağırılsa nasıl olur?
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

http://www.coskunergan.com/stm32l152-dfu-ve-low-power-run-modlarinin-testi/

Hocam yukarıdaki linkde buna benzer bir test programı yapmıştım ancak STM32F serisi için değil.

Yine bu seride olmayan system_stm32L1xx içinde SystemCoreClockUpdate (); ve SetSysClock(); fonksiyonları var onları inceleyebilirsiniz.

Gözünüzden kaçmamıştır ama clcok hızını değiştirmek systick değerinide etkiler onuda tekrar yüklemeniz gerekecek.

STM32F içlemci için bu değişimi en sağlıklısı HardFault_Handler ve BusFault_Handler kesmelerini kontrol altında tutup başlangıçda yapmak olacaktır. 

Kayıt için rtc backup registerlarıda kullanılabilir.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

SpeedyX

@meftun, öyle de olabilir ama X-Fi nin yöntemi gibi yapmak daha sağlıklı, fazla kod tekrarı olmaz en azından.

Herkes 72 Mhz de çalışıyor galiba :) Cevaplar için teşekkürler.

mistek

Hocam ben stm32f100 için bu şekilde sürekli hız değişikliği ile programımı çalıştırıyorum. Pilli bir uygulama olduğu için yoğun olmadığı zamanlarda hızı 500kHZ kadar düşürüyor aynı zamanda HSI-HSE arasında geçiş yapıyorum.

Bu hız değişikliklerinde clock bağımlı bütün kaynakları yeniden ayarlamanız gerekiyor tabii. Systemtick de dahil.

void SaatFreq500KHz(void)
{
    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_OFF);
    RCC_HSICmd(ENABLE);
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_0);
    RCC_HCLKConfig(RCC_SYSCLK_Div16);
    RCC_PCLK1Config(RCC_HCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
    while (RCC_GetSYSCLKSource() != 0x00);
}

Buradan  RCC_HCLKConfig(RCC_SYSCLK_Div16); Div16 değiştirilerek istenen frekans ayarlanır. 
			

SaatFreq500KHz(); // Saat frekansı 500kHz ayarlandı.
SystemCoreClockUpdate();
SystemTick_init(SystemCoreClock / 1000);

///---------------

SystemInit(); //Saat frekansı 24MHz ayarlandı.
SystemCoreClockUpdate();
SystemTick_init(SystemCoreClock / 1000);


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

SpeedyX

Bu çok yardımcı oldu teşekkürler, stm32 ye uzak kalmışım...