STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

fryrmnd

hocam bentimer 7 ye giden clock frekansını demiştim. hocam prescaler e 2100 vermişsiniz. burdan counter frekansı = 84E6/(2100+1) yapar
o da yaklaşık 40kHz yapar. da ARR yi "0" yapmışsınız. tam olarak ne ayarlamak istemiştiniz?

muhittin_kaplan

Bunalmış Hocam Şu Timerların Kurulması ile alakalı bir ders tekrarı yapmamız gerek sanırım.
Örneğin
TIMx_ARR ne yapıyor ?

muhittin_kaplan

Yapmak İstediğim 100us lik bir kesme oluşturmak. oluşturdum ama hesaplamada sıkıntı var.

fryrmnd

hocam ARR değeri timer ın sayacağı ve o değere ulaşınca kesme oluşacağı değer. şimdi sizin 2100(2099 yapalım. +1 ile 2100 olucak) ve ARR ye yükleyceğiniz değer ile ne kadar sürede kesme oluşacağı belirleniyor.

2100 için 40Khz hesapladık.

ARR ye 40000 değeri verirseniz 1 sn de bir kesme oluşur. yani timer 1sn de 40000 sayım yapar ve ARR değerine ulaştım der kesme oluşur. benim anladığım bu.

muhittin_kaplan

Anlamadığım Nokta Şu, Sayıcıyı Başlattğımızda ve esme luştuğunda Auto Reload değeri ARR reg atıyor. Bunalmış Hoca Buna
Alıntı YapCounter, Decimal ...... olunca basa donsun ..... demek
Demiş.
ARR reg Ulaşılacak Değer mi ki Böyle bir  cümle kurmuş ?

muhittin_kaplan

int main()
{
    RCC->APB1ENR|=0x00000020;      // Timer7 CLK'u aktif edelim (84 Mhz)
    TIM7->CR1=0x0080;             // Otomatik Reload
    TIM7->PSC =42000;             // Prescaler değerimiz 8000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) = 84000000 / (8000) = 2000 Hz
  [b]  TIM7->ARR =1;  [/b]              // Counter, Decimal 0 olunca basa donsun 10khz demek
    TIM7->DIER=0x0001;            // Update Int enable
    NVIC->ISER[1] = 0X00800000;    // NVIC de Timer 7 interrupta izin verelim
    TIM7->CR1|=0x0001;             // Counter Enable
    
   while(1)

ile 1khz

int main()
{
    RCC->APB1ENR|=0x00000020;      // Timer7 CLK'u aktif edelim (84 Mhz)
    TIM7->CR1=0x0080;             // Otomatik Reload
    TIM7->PSC =42000;             // Prescaler değerimiz 8000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) = 84000000 / (8000) = 2000 Hz
   [b] TIM7->ARR =1000;  [/b]              // Counter, Decimal 0 olunca basa donsun 10khz demek
    TIM7->DIER=0x0001;            // Update Int enable
    NVIC->ISER[1] = 0X00800000;    // NVIC de Timer 7 interrupta izin verelim
    TIM7->CR1|=0x0001;             // Counter Enable
    
   while(1)
      {
      } 
}

1Hz

fryrmnd

#711
hocam galiba ARR ye timer ı başlatmadan değer yazıyoruz.

Alıntı YapCounting mode

                                           The counter counts from 0 to the auto-reload value (contents of the TIMx_ARR register),
                                           then restarts from 0 and generates a counter overflow event.

                                           An update event can be generate at each counter overflow or by setting the UG bit in the
                                           TIMx_EGR register (by software or by using the slave mode controller).

                                           The UEV event can be disabled by software by setting the UDIS bit in the TIMx_CR1
 

rehber 458. timer buna ulaşınca taşma oluyor.

edit: değer atamalarınız doğru hocam 1Hz ve 1KHz için. birde (42000-1) yapın.

muhittin_kaplan

Lojik Analizörle kontrol ediyorum.

muhittin_kaplan

#713
int main()
{
    RCC->APB1ENR|=0x00000020;      // Timer7 CLK'u aktif edelim (84 Mhz)
    TIM7->CR1=0x0080;             // Otomatik Reload
    TIM7->PSC =4200;             // Prescaler değerimiz 4200, Count frekansimiz = (42000000 / 4200) / Arr =10Khz (100us)
    TIM7->ARR =1;                // Counter, Decimal 0 olunca basa donsun 10khz demek
    TIM7->DIER=0x0001;            // Update Int enable
    NVIC->ISER[1] = 0X00800000;    // NVIC de Timer 7 interrupta izin verelim
    TIM7->CR1|=0x0001;             // Counter Enable
    
   while(1)
      {
      } 
}

10khz

muhittin_kaplan

Bunalmis hocam bu apbh1 hatti 84 mhz olmayacakmi

z

#715
Eğer APB prescaler 1 değilse Timerlar bağlı oluğu APB BUS frekansından 2 kat yüksek frekansla saydırılır.

Daha önce kullandığımız bir kod örneği aşağıda.

int main()
{
    RCC->APB1ENR|=0x00000020;         // Timer7 CLK'u aktif edelim (84 Mhz)
    TIM7->CR1=0x0080;                      // Otomatik Reload
    TIM7->PSC =42000-1;                   // Count frekansimiz = fCK_PSC / (Yuklenen Deger - 1) 84E6 / (42000-1) = 2000 Hz
    TIM7->ARR =1000;                        // Counter, Decimal 1000 olunca basa donsun 0.5 sn demek
    TIM7->DIER=0x0001;                     // Update Int enable
    NVIC->ISER[1] = 0X00800000;        // NVIC de Timer 7 interrupta izin verelim
    TIM7->CR1|=0x0001;                    // Counter Enable
   
   while(1)
      {
      }
}

Bir eksiği konusuna dikkat etmek lazım. Bizim yaptığımız uygulamalarda bir ekiğine bölmemekle çok büyük bir hata yapmış olmuyoruz.

84E6 / (42000-1) yaklaşık olarak 84E6 / (42000) e eşit.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

#716
hocam yukarda verdiğim kodlarda nedense 42mhz çalıştırıyor.
10khz lik örnekte 4200 e bölüyorum. 10 000 e eşit ve automatik reload registerine 1 yüklüyorum. sonuçta 10khz lik bir sinyal oluşuyor. eğer bu bus hattı 84mhz olsaydı 20khz olmazmıydı ?

hoca kelimesi yanlış yazıldığından hocam kelimesiyle değiştirildi

z

Autoreload degerin n olursa n'e mi bölüyor?  n+1 e mi?


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

muhittin_kaplan

hesaplarıma göre N e bölüyor.
ama bus hızı neden ikiye katlanmıyor ?

muhittin_kaplan

Kafam Allak Bullak Oldu n+1 e bölme ihtimali de var.