STM32F4 Discovery - Vizeler

Başlatan bunalmis, 24 Aralık 2011, 15:13:13

fryrmnd

#75
bunalmış hocam şöyle bir kod yazdıydım. klasik registerları oku sırayla ayarla. çok hakim olmadığımdan gene bir gariplik var gibi.anlayamadığım yerler var.




toggle kısmını değiştirdim. bu şekilde olması gerekir diye düşünüyorum. butona basışımda karasızlık var mı var. baze çekerken de ledler durum değiştiriyor.  biraz da debug ile uğraşayım.


kod hatalı ve koda benzemediği için sildim  :(

z

#76
Keilde derleyin calistirin. Calismiyorsa sorunu kendiniz bulacaksiniz.

Debug etmeyi deneyeceksiniz. Mesela butona basilinca bir yerlerde bir bit set ediliyormu? Bu tip calismalari yapmazsaniz bu isi yurutemezsiniz.

Isin puf noktasi DEBUG.

Bu arada bir pini Toggle etmek, eger bu pin 1 ise 0 yapmak, 0 ise 1 yapmak demektir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

#77
anladım hocam. bitlere hakim olmam gerek. ama birkaç register ın fonksiyonunu tam anlayamadım. program çalıştı. basıp çekince yanıp sönüyor. biraz basılı tutup çekersem çekerken de yanıp sönüyor.

  evet toggle ı da yanlıi yapmışım.


z

#78
Cevap 5
#include "STM32F4xx.h"

// FCPU =168Mhz
// FAHB =FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4

void SystemInit()
{
unsigned int i;

    for (i=0;i<0x00100000;i++);     // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;        // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;          // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07402A04;      // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;          // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;     // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;      // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 

void EXTI0_IRQHandler ()
{
    EXTI->PR|=0x00000001;           // EXTIO INT flagimizi silelim
    GPIOD->ODR^=0x00001000;     
} 

int main()
{
//  Butona basinca pinimiz H oluyor

    GPIOA->MODER&=~0x00000003;      // GPIO pin ancak inp modunda interrupt uretebilir (Rehber 143)
    SYSCFG->EXTICR[0]&=~0x0000000F; // GPIO A0 interrupt uretecek
    EXTI->RTSR=1;                   // Yukselen kenar tetiklemesi yapacagiz. (EXTI0)
    EXTI->FTSR=0;                   // Dusen kenar tetiklemesi istemiyoruz.  (EXTI0)
    EXTI->IMR=1;                    // EXTI0 Int enable (Rehber 202-203)
    EXTI->EMR=0;                    // Event istemiyoruz
    NVIC->ISER[0] = 0x00000040;     // NVIC EXTI0_IRQ interrupti acalim
    while(1);      
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

hocam
RCC->CFGR |= 0x00009400;        // AHB ve APB hizlarini max degerlere set edelim
ataması ile SSW ve SW ayarlamaları nedir ? (PLL, HS seçimi yapıyorda sizin verdiğiniz Clock block diyagramında nereler ? )

z

RCC_CFGR registerine 9400 Hex sayisini yuklersen SSW ve SW bitleri ne deger alir?

Sorun bu mu? Eger oyle ise dersleri atlaya atlaya izliyorsun hocam.

Calc.exe diye bir programimiz var.  Bunu kullaniyormusun?

9400 yukledigimizde SW bitleri 00 olur. SSW bitlerini yazarak biz degistiremeyiz. O bitlerle  sadece switch statusunu ogrenebiliriz.

SW bitleri 00 ise HSI yani 16Mhz lik dahili RC osc calisacak demektir.

Blok diyagram Rehber 85 de. Benim renkli resim olarak koydugum blokdan bahsediyorsan  orjinal blogun konumuzla alakasi olmayan kisimlari kesip attim sadelestirdim. Sayfa 85 de SW bitleri tam olarak gosterilmiyor.   Blokdan sadece  clock kaynaklarinin secildigi anlasiliyor.

Zaten bu tip diyagramlar semboluk olurlar,  fikir vermesi acisindan konuyor.



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

fryrmnd

bunalmış hocam yazmış zaten. sildim.

madpic

#82
.....

muhittin_kaplan

Alıntı yapılan: bunalmis - 25 Aralık 2011, 23:02:05
RCC_CFGR registerine 9400 Hex sayisini yuklersen SSW ve SW bitleri ne deger alir?

Sorun bu mu? Eger oyle ise dersleri atlaya atlaya izliyorsun hocam.

Calc.exe diye bir programimiz var.  Bunu kullaniyormusun?

9400 yukledigimizde SW bitleri 00 olur. SSW bitlerini yazarak biz degistiremeyiz. O bitlerle  sadece switch statusunu ogrenebiliriz.

SW bitleri 00 ise HSI yani 16Mhz lik dahili RC osc calisacak demektir.

Blok diyagram Rehber 85 de. Benim renkli resim olarak koydugum blokdan bahsediyorsan  orjinal blogun konumuzla alakasi olmayan kisimlari kesip attim sadelestirdim. Sayfa 85 de SW bitleri tam olarak gosterilmiyor.   Blokdan sadece  clock kaynaklarinin secildigi anlasiliyor.

Zaten bu tip diyagramlar semboluk olurlar,  fikir vermesi acisindan konuyor.
Tamam Hocam RCC_CR registerinden yapılıyormuş.

İnt Osc ile Xtal Seçimini Nasıl Yaptığımız aklıma takılmıştı. Blok da iki adet swich görünüyor ben yukardaki (Biri PLL girişi Diğeri System Clock Girişi) SSW ve SW bitleri ile hangisinin kontrol edildiğini sormak istemiştim.

muhittin_kaplan

#include "STM32F4xx.h"
 
void SystemInit()
{
unsigned int i;
 for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07431008;      // PLL katsayilarini M=8, N=64, P=8 ve Q=7 yapalim =8Mhz
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xAAAAAAAA;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 	 (25Mhz)
}
 
int main()											  
{
   
    while(1)
   {
		     
   
     	GPIOD->ODR=0x00001000;
		GPIOD->ODR=0x00000000;

   } 
}
				 

Hocam Yukarıdaki gibi bir ayarlamada CPU um 8mhz de çalışması gerekiyor.
Portlar 25Mhz e ayarlı.
24Mhz lik Lojik analizere bağladığım PortD nin 12 sinde nedense bu hızı göremiyorum
Sebebi nedir ?

z

#85
PORTD12 de hangi frekansi gormeyi bekliyorsun? Neden?

RCC->PLLCFGR = 0x07431008;  satirinda

Yanlisim yoksa;

P=3 den dolayi bolme oranini 8,
N=0x40 dan dolayi Carpma oranini 64 secmissin.
M=8

Bu durumda secilen bu degerlere gore (8/8)*(64)/8 den CPU 8 Mhz de kosamasi lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

hocam be artık boş kağıt veriyorum.  :). hocam buton interrupt uygulamsında debug işleminde register içeriklerini nasıl izleyebilicem. ne yazıkki beceremedim.  flag set edildimi. o register ı nasıl izleyebilirim. o satıra geldiğinde kartta butona mı basmam gerekicek.

z

Boyle durumlarda Debug yaparken Keil yada bir baska programa guvenemem. Kendi yontemimi uygularim. (Bu kendi tercihim)

Deneme yaptigim cevre biriminin int uretmesine izin verir fakat NVIC dan izin vermem.

Her cevre biriminin kendi int flagi olur.

Bir while dongusu icinde bu flagin set olmasini beklerim.

while dongusunun hemen altina break point koyarim.

Programi isletirim. Ornek soruda butona basarim. Butona bastigimda int uretilir fakat yanitlanmaz. Ancak while dongum durumdan haberdar olur ve donguden cikar ve bir alt satirdaki breakpointte sistem durur. Bu, butona basmamla ayni anda gerceklenir.

Bu da bana int uretildigini soyler.

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

muhittin_kaplan

Hocam Cpu nun ayarladığım frekansta çalışıp çalışmadığını nasıl ölçerim ?
Soru Bu aslında..
Yazdığım Kodun Ledleri yakma kısmında birer satırlık asm oluşturmuş. buna bağlı olarak (mov komutuna bakmadım kaç saykılda çalışıyor.) işlemcinin hızını görebilmeliyim sanırım.

fryrmnd

hocam farkındayım ama çok soruyoz ama. daha önce debugla felan çok uğraşmayınca. peki dışardan buton ve interrupt kısmında bir nevi test noktası koyarak gözlemliyorsunuz. başka bir register mesela bir çevre birimin konfigürasyon registerı. değer atadık. bunun içeriğini kartı debug ederken peripherals menüsünden mi görebilirim.