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.
Arkadaşlar nerede hata yaptım? Yanlış yerde mi konu açtım? Neden kimse tek satır cevap yazmıyor?
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..
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!
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
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.
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..
@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...
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.
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);