STM32F407 Cortex M4 şamataları

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

hyperalika

Telefona usart3 ile veri gönderebildim. Ama bi türlü telefondan örneğin A verisini gönderdiğimda D portundaki 0x0000F000 Ledlerinin hepsi yansın dediğimde birşey olmuyor.

muhittin_kaplan


muhittin_kaplan

WD u biliriz. Ama analog WD nedir ?

JKramer

Eğer okuduğunuz analog değerler, belirlediğiniz alt ve üst sınırların dışında olursa bu arkadaş size haber veriyor.

fryrmnd

sürekli olarak adc verisini okumanız gerekemiyor.

muhittin_kaplan

CM4 için capture örneğine ihtiyacım var. deneme yapan oldumu acaba ?

-Hasan-

#771
Merhabalar; ben de şu anda Timer çalışmaları yapıyorum. (biraz geri kaldım ama  :D) Timer2 ile ledleri 1 sn boyunca yakan 1 sn boyunca söndüren bir uygulama yaptım. İstediğim gibi de oluyor ancak program bir süre (1 dk falan) durduktan (ledler sönük vaziyette) sonra çalışmaya başlıyor, bunun sebebi nedir acaba?

Herkese kolay gelsin.

#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 = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  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 = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    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
}

int main()
{	
	RCC->APB1ENR|=0x00000001;
	TIM2->CR1=0x0080;
	TIM2->PSC=41999;
	TIM2->ARR=2000;
	TIM2->CR1|=0x0001;

	while(1)
	{
	if(TIM2->CNT < 1000)
	GPIOD->ODR=0x0000F000;
	else
	GPIOD->ODR=0x00000000;
	}
}


Edit:
Programı Timer2 yerine Timer7 ile çalışacak biçimde düzenlediğimde (2 ' leri 7 yaparak ve clock ayarını değiştirerek) sıkıntı olmuyor

GreeN

Alıntı yapılan: -Hasan- - 17 Ocak 2012, 16:59:49

Programı Timer2 yerine Timer7 ile çalışacak biçimde düzenlediğimde (2 ' leri 7 yaparak ve clock ayarını değiştirerek) sıkıntı olmuyor

RCC->APB1ENR|=0x00000001;

Bu satırıda değiştiriyorsun değil mi? Timer7 clock  aktik etmek için RCC->APB1ENR|=0x20; (6.bit)

Terörü Lanetliyoruz.

-Hasan-

#773
Evet; aynen o şekilde yapıyorum.

Edit:
Şimdi Timer8 ile bir uygulama yaptım. Bu gayet düzgün çalışıyor. Ancak Timer2 neden öyle yaptı anlamadım.

#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 = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  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 = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    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
}

int main()
{
	RCC->APB2ENR|=0x00000002;
	TIM8->CR1=0x0080;
	TIM8->PSC=41999;
	TIM8->ARR=8000;
	TIM8->CR1|=0x0001;

	while(1)
	{
	if(TIM8->CNT < 4000)
	GPIOD->ODR=0x0000F000;
	else
	GPIOD->ODR=0x00000000;
	}
}

muhittin_kaplan

bunalmış hocam HARD 49 da verilen tabloda pinlere vereceğimiz alternatif fonksiyonlar var. TIM3_CH1, TIM3_CH2, TIM3_CH3, TIM3_CH4 ler ve TIM 4 lerde de aynısı var. bu kanallar nedir ?

z

#775
Timerlari harici pindeki bir clk ile saydirabiliyorsun. Hatta bazi timerlari up/down modda saydirabiliyorsun.
Timer cikislarini da pinlerle iliskilendirebiliyorsun. (Compare cikisi gibi)
Rehber 294 de bak.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#776
Alıntı yapılan: -Hasan- - 17 Ocak 2012, 17:32:20
Şimdi Timer8 ile bir uygulama yaptım. Bu gayet düzgün çalışıyor. Ancak Timer2 neden öyle yaptı anlamadım.

Hasan

ARM cipimiz icin verilmis programlarda bazi register indislerini degistirerek yeni programlar uretirken cok dikkatli ol.

Ornegin TIM7->XXX gibi satirlari TIM2->XXX yapmaya kalkarsan sorun yasarsin. Cunku Timer 2 ozelligi olan ve diger timerlardan farkli bir timer.

Verdigin programi denedigimde sorunlu oldugunu gordum. Autoreload islemini ilk sayimda cok gec yapiyor cunku 32 bit bir timerin tasmasi zaman aliyor. Bende hemen reload yapmasi icin counter registerine -1 degerini yukledim. Shadow regleri derhal yuklemesi icin belki bir reg vardir.

Rehber 361 e bak.

Verdigin programda main satirini asagidaki gibi degistirirsen Timer2 de duzgun calisir. Aslinda senin programinda calisiyor. Sadece ledlerin flash etmesi icin beklemen gerekiyor. (TIMER2 16 değil 32 bitlik bir  timer)

int main()
{ 
    RCC->APB1ENR|=0x00000001;        // TIMER2 CLK Enable edildi
    TIM2->CR1=0x0080;
    TIM2->PSC=41999;
    TIM2->CNT=0xFFFFFFFF;
    TIM2->ARR=2000;
    TIM2->CR1|=0x0001;
    while(1)
    {
      if(TIM2->CNT < 1000) GPIOD->ODR=0x0000F000;
      else GPIOD->ODR=0x00000000;
    }
}


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

ErsinErce

ayrıca interrupt rutinlerinde, startup dosyasındaki interrupt handler ismini yazdığınız programdaki isimle karşılaştırın

TIM6, TIM7 ile benzer diye onu kullanmaya karar verdim, isme dikkat etmediğimden 1 saati boşu boşuna harcadım

programınız B . diye bir yerde dönüyorsa bu noktaya mutlaka göz gezdirin

-Hasan-

Bülent Hocam o uygulamayı satırları değiştirerek yapmamıştım. Onu main kısmını komple silip Rehber ' den bakarak, diğer Timer uygulamalarında yaptığımız ayarları yaparak yazmaya çalıştım. Timer2 düzgün çalışmayınca o şekilde satırları değiştirdim.

Alıntı yapılan: bunalmisAutoreload islemini ilk sayimda cok gec yapiyor cunku 32 bit bir timerin tasmasi zaman aliyor. Bende hemen reload yapmasi icin counter registerine -1 degerini yukledim. Shadow regleri derhal yuklemesi icin belki bir reg vardir.

Yani hocam Timer2 ' nin Autoreload yapması için ilk başta bir kere taşana kadar sayması mı gerekiyor?

JKramer

TIMx->CR1 deki ARPE bit'ini 0 yaparsanız, yüklediğiniz değer bir sonraki update'i beklemeden doğrudan shadow register'a yüklenir.