STM32 için Timer ayarını sonradan değiştirmek mümkün mü?

Başlatan argelojik, 11 Eylül 2019, 12:51:20

argelojik

Herkese merhaba. Bir süredir Stm32 serisi MCU'larda HAL kütüphanesi kullanarak kod yazıyorum. Yaşadığım bir sorun için sizlerden yardım bekliyorum. Mesela Cubemx ile Timer'ı 5000 ms ayarlıyoruz. Bu değeri program içerisinde 1000 ms olarak  değiştirmemiz mümkün değil mi?  Örneğin  Cubemx ile htim1.Init.Period = 9999;  olarak ayarladık. Ben bu değeri program içerisinde  htim1.Init.Period = 1999; yaparak Timer'ın değerini değiştirmek istiyorum. Bunu denedim ama başaramadım. Nerede hata yapıyorum? Ya da Timer, sadece başlangıçta mı ayarlanıyor, sonradan değiştirilemez mi? Teşekkkür ederim.

argelojik

Arkadaşlar nerede hata yaptım? Yanlış yerde mi konu açtım? Neden kimse tek satır cevap yazmıyor?

MrDarK

Tabiki değiştirilebilir. Timer'ın init fonksiyonunu değiştirdiğin parametrelerle tekrar çağırmalısın. O değişmesini düşündüğün değerler RAM'de bulunan bir değişken sadece. Init fonksiyonuna gönderirken Timer'ın registerlarına kayıtlanıyor.

Ayrıca son mesajınızdaki gibi sitem etmek yerine yardımcı olabilir misiniz ? Hala sorunum aktif güncel vb bir mesaj yazsanız daha ılımlı olmaz mıydı ? Sonuçta buradaki hiçkimse bir firmanın temsilcisi değil hesap sormak gibi bir mesaj yazmışsınız. Şahsen mesajınıza alındım..
Picproje Eğitim Gönüllüleri ~ MrDarK

apsis

Ayrıca size yardımcı olabilmemiz için kodlarının bir bölümünü ya da tümünü paylaşman çözüm kavuşmasında daha iyi olacaktır.
Biz senin nerede hata yaptığını nereden bilelim!
"Makineye Beyin" MEKATRONİK

OptimusPrime

Olur oyle vakalar  :)

@argelojik
htim1.Init.Period deki htim1 in turune bakarsan bunun aslinda bir yapi oldugunu goreceksin. Bu arkadas sadece donanimla ilgili ayarlari icerisinde barindiriyor. Bu yapi icerinde degistirdigin herhangi bir deger dogrudan donanim uzerinde etkili olmuyor. Bunun icin baska bir fonksiyon var init..() gibi. Bu fonksiyona icerigini  degistirdigin yapiyi parametre olarak gectiginde donanimsal ayarlar yapiliyor.

Dolayisi ile yapacagin degisiklikten sonra init..() i tekrar cagirirsan istedigin guncellemeyi yapmis olursun. Veya init i takip edip ilgili register i hangi fonksiyonun degistirdiginede bakabilir dogrudan onuda cagirabilirsin. Veya guncelleyecegin register adresini biliyorsan dogrudan tepesinede cokebilirsin.  :D
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

argelojik

Cevaplar için çok teşekkür ederim.
 @apsis arkadaş kodları paylaşmam gerektiğini söylemiş ama ben zaten kodu ve fonksiyonu paylaştım. Sadece code bölümünde yazmadım. Tek satır olduğu için... Derdimi yani sorunumu iyi anlattığımı düşünüyorum. Bu yüzden en azından bir kişi cevap yazmalı diye düşünmüştüm. Neyse Olur oyle vakalar  :)
@MrDarK usta bu isyan biraz birikmişlik ben çok az konu açıp soru soruyorum. Sadece 1 yıldır daha fazla kod yazıyorum. Ve birçok şeyi Youtube'dan öğrendim. Kimsenin zamanını almamak için. Lütfen alınmayın. Cevabınız için teşekkür ederim. Güzel anlatmışsınız. 
Hatamı anladım değişiklik yaptıktan sonra fonksiyonu çağırmam gerekiyormuş. Ben çağırmıyordum. Yardımınız için çok sağolun. 
 @OptimusPrime usta bana cevap yazmış, bu benim için bir gurur. Tekrar teşekkür ederim herkese.

devrecii

Timer modulü registerleri var

mesela timer1 modulu için 

TIM1->ARR=1000;  // sayma periodu 
TIM1->CCR1=500;  // kanal1 için kıyaslama 

TIM1->CNT ///direkt sayac registeri   

Program içinde bu registerlere çok hızlı bir şekilde ulaşıp değiştirme yapabilirsin.

Hal library vs. iyi güzel de register seviyesinde mimariyi öğrenmek işleri çok kolaylaştıracaktır, tabii hemen bir şeyler yapayım derdinde değilsen. Bu librarylerle bir yere kadar..

argelojik

@iboibo kardeş, yardımın için teşekkür ederim. Aslında benim datasheeti tek tek, sayfa sayfa okumam gerekiyor.Bunu anladım.  Aslında timer'ın registerini değiştirmek daha hızlı ve mantıklı. Sağol... Herkese çok teşekkürler...

MrDarK

Alıntı yapılan: argelojik - 23 Eylül 2019, 08:38:49@iboibo kardeş, yardımın için teşekkür ederim. Aslında benim datasheeti tek tek, sayfa sayfa okumam gerekiyor.Bunu anladım.  Aslında timer'ın registerini değiştirmek daha hızlı ve mantıklı. Sağol... Herkese çok teşekkürler...

Yeni çıkan işlemcilerde STL(Standart peripheral library) desteklemediğinden bu tarz işlemleri Low Level Library (LL) ile kullanabilirsin, veya register seviyesinde direkt register isimlerine data yükleyerek işlem yapılabilir. Fakat işlemin taşınabilir olmasını istiyorsan library katmanları ile taşımakta fayda var.
Picproje Eğitim Gönüllüleri ~ MrDarK

crazy

Hal kütüphanesinde bu fonksiyonlar hazır olarak var.
__HAL_TIM_SET_AUTORELOAD(&htim1,1999);
Yada  basit bir fonksiyon sende yazabilirsin.
void timer_freq(uint16_t value)
{
    TIMx->ARR = value;
}
timer_freq(1999);