STM32F407 Cortex M4 şamataları

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

pisayisi

Register ları öğrenirsin ezberlersin buna itirazım yok, ancak hızlı bir kod geliştirme amacında isen st firmasının firmware tabanlı orjinal örneklerinden hareketle kod geliştirmeye başlamanı register larla tek tek uğraşmamanı öneririm.
Murat

sseedat

merhaba arkadaşlar stm le 2*16 lık lcd yi  bi türlü çalıştıramadım kütüphaneler aşağıdaki gibi bakarsanız çok iyi olur:)
hd44780.c
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//		  LCD data Portu GPIOD
//        RS. GPIOB.4
//        E.  GPIOB.5  olarak kullanılmıştır.
//
//	      Kullanılışı;
//		  Lcd_init();         // 2x16 LCD yi kullanıma hazır hale getirir.
//		  Lcd_Veri();         // Lcd ye KOmut göndermek için kullanılır.
//		  Lcd_Git(1,2);       // Lcd nin 1. satırının 2. sütununa imleci konumlandırır.
//		  Lcd_Yaz("Merhaba"); // Lcd ye Merhaba Stringini gönderir.
//                Yaz();              // Bu kullanılmayacak.
//                Lcd_Sil();          // Lcd yi silmek için kullanılır.
//		  Lcd_Imlec_Var();	  // İmleç YanSön Moduna sokar.
//		  Lcd_Imlec_Yok();	  // İmleç i yok eder.
//
//
#include "hd44780.h"

void lcd_busy(void)
{
Delay_us(250);
Delay_us(250);
}

void Lcd_init(void)
{

    GPIOD->MODER = 0x55000055;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
    GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.

    GPIOA->OSPEEDR= 0x00000000;   // GPIOD nin tum cikislarinı Max. 2 Mhz de kullanacağız.
    GPIOB->OSPEEDR= 0x00000000;	  // AYnı şey GPIOB içinde geçerli

    rs=0;
	e=0;  //	 Genel
    GPIOD->ODR= 0x00000000;		  //	 Temizlik

    Delay_ms(20);
	e=1;
    Lcd_Veri(0x02); // Lcd Reset
    Lcd_Sil();
    Lcd_Veri(40);   
    Lcd_Veri(15);   // Display i aç
    Lcd_Veri(0x06); // Kursör 1 artan modda.
    Lcd_Sil();	    // Lcd yi temizle

}

void Lcd_Veri(unsigned char veri) //komut
{
 rs=0;
 e=1;
 GPIOD->ODR=(veri & 0xF0);
 e=0;
 lcd_busy();
 e=1;
 GPIOD->ODR=((veri & 0x0F)<<4);
 e=0;
 lcd_busy();
}

void Lcd_Git(unsigned char p1,unsigned char p2)
{
    if (p1==1) Lcd_Veri(0x80+(p2-1));
    else      Lcd_Veri(0xC0+(p2-1));
}

void Lcd_Yaz(unsigned char *lcd_data)
{
    lcd_busy();
    while(*lcd_data)  Yaz(*lcd_data++);
}

void Yaz(unsigned dat)
{
 	 rs=1;
 e=1;
 GPIOD->ODR=(dat &0xF0);
 e=0;
 lcd_busy();
 e=1;
 GPIOD->ODR=((dat & 0x0F)<<4);
 e=0;
 lcd_busy();
}
    
void Lcd_Sil(void)
{
    Lcd_Veri(1);
    Delay_ms(10);
}

void Lcd_Imlec_Yok(void)
{
    Lcd_Veri(0x0C);
    Delay_ms(10);
}

void Lcd_Imlec_Var(void)
{
 	Lcd_Veri(0x0F);
    Delay_ms(10);
}


hd44780.h
#define GPIO_A(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOA->ODR) << 5) + ((b) << 2)))
#define GPIO_B(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOB->ODR) << 5) + ((b) << 2)))
#define GPIO_C(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOC->ODR) << 5) + ((b) << 2)))
#define GPIO_D(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOD->ODR) << 5) + ((b) << 2)))
#define GPIO_E(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOE->ODR) << 5) + ((b) << 2)))
#define GPIO_F(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOF->ODR) << 5) + ((b) << 2)))
#define GPIO_G(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOG->ODR) << 5) + ((b) << 2)))
#define GPIO_I(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOI->ODR) << 5) + ((b) << 2)))
#define rs GPIO_B(4)
#define e GPIO_B(5) 


extern void Lcd_Veri(unsigned char veri);
extern void Lcd_Git(unsigned char p1,unsigned char p2);
extern void Yaz(unsigned dat);
extern void Lcd_Yaz(unsigned char *lcd_data);
extern void Lcd_Sil(void);
extern void Lcd_Imlec_Var(void);
extern void Lcd_Imlec_Yok(void);


Görünmez bir mezarlıktır Zaman...

muhittin_kaplan

Yeni Tur,
Kart ile alakalı olarak USB üzerinden ivmeölçer bilgilerini göndermem gerekiyor. Nasıl Yapabilirim ?

Klein

#933
Aynı bilgisayarda 2 adet STM32f4 kiti ile aynı anda çalışmayı deneyen oldu mu?

Bir proje üzerinde çalışıyorum.  Kartın biri alıcı diğeri verici olarak çalışıyor. Programı 2 ayrı keil açarak yazıyorum. Ancak debug ederken sadece kartın birini debug ediyor. Hangi projeden debug edersem edeyim hep aynı kartı debug edebiliyorum. Dğer karta ulaşamıyorum.

Aygıtların içinde 2 adet STLink Dongle aygıtı görüyorum. Ama biri bu karta diğeri şu karta bağlansın diyemiyorum.

serhat1990

Hocam ben 2 tane kullanmayı denemedim fakat

Burada söylediğiniz "Ancak debug ederken sadece kartın birini debug ediyor. Hangi projeden debug edersem edeyim hep aynı kartı debug edebiliyorum"
Kartın birin arızalı olduğunu göstermezmi . Hep aynı karta ulaşıyorum diğerine ulaşamıyorum diyorsunuz . Yer değiştirip denedinizmi. Yine ilk başta ulaşabildiğiniz kartamı ulaşıyorsunuz...

Klein

Kart arızalı değil.  Biraz yanlış ifade var.

2 tane USB var.
1. USB de kart 1
2. USB de kart 2 takılı.

Debug etmek istediğimde hep 1. Usb'ye bağlı olan kartı debug ediyor.
1.USB'yi sökersem 2. USB 'ye bağlı olan debug ediliyor.

Biraz daha basitleştirirsek:

Bilgisayara 2 adet kit bağladığınızda, USB aygıtların altında 2 adet ST Link Dongle görünüyor. Ama bunları Dongle 1,Dongle 2 gibi isimlendirmiyor.

Projenin Debugger ayarlarını yaparken de  sadece ST-Link seçebiliyorsunuz. Ama hangisini istediğinizi seçemiyorsunuz.

mcan

#936
Karta(forumdan aldığımız Cortexm4 discovery kartı) yazdığım programı sadece ram üzerinden çalışacak çekilde ayarladığımda, flash ve ram üzerinde çalışmasına göre nerdeyse yarı yarıya yavaş çalışıyor.
Ram üzerinde daha hızlı çalışmasını beklerken daha yavaş çalıştı. Bunun sebebi nedir daralan band genişliği sebebiyle harvard mimarisi mi? Ayrıca Cortex m3 için ICODE FLITF üzerinden sadece flah a bağlı gibi. Peki  ben programı sadece rama yükleyip ram dan çalıştırınca ICODE nasıl sram a bağlanıyor? FLITF ve bus matrix üzerinden mi?

muhittin_kaplan


EMP_Otto

Merhaba arkadaslar   sorunumu https://www.picproje.org/index.php/topic,35780.180.html bölümüde dile getirdim fakat yardımcı olan olmadı.Acaba bunalmış hocamın yazmıs oldugu herhangi bir programı proj ayarları tam olarak foruma yükleyecek bir arkadasımız var mı acaba?
Karta yüklediğim programlar bir türlü çalışmıyor.Bu durum grcekten canımı sıkmaya basladı:( yardım edin lütfen
Bu işler zordur,özveri ister...

EMP_Otto

Her ne kadar yazdığım ve denediğim programları calıştıramasamda yılmak yok :)
Bunalmıs hocamın yazmış olduğu https://www.picproje.org/index.php/topic,35896.0.html linkindeki timer 7 örneginde
Prescaler değerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 42E6 / (42000) = 1000 Hz  burasını anlamadım ben hocam.Bu bilgiyi nerden  buldunuz ben dökümanlarda bulamadımda.Birde farklı frekanslar için (100 Hz,500Hz )
bir kaçtane daha örnek verirseniz cok iyi olur diye düşünüyorum.
Bu işler zordur,özveri ister...

muuzoo

Alıntı yapılan: EMP_Otto - 29 Temmuz 2012, 11:28:26
Her ne kadar yazdığım ve denediğim programları calıştıramasamda yılmak yok :)
Bunalmıs hocamın yazmış olduğu https://www.picproje.org/index.php/topic,35896.0.html linkindeki timer 7 örneginde
Prescaler değerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 42E6 / (42000) = 1000 Hz  burasını anlamadım ben hocam.Bu bilgiyi nerden  buldunuz ben dökümanlarda bulamadımda.Birde farklı frekanslar için (100 Hz,500Hz )
bir kaçtane daha örnek verirseniz cok iyi olur diye düşünüyorum.

https://www.picproje.org/index.php/topic,41659.0.html
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

LukeSkywalker

Arkadaşlar bu ADC ile ilgili detaylı bir açıklama yapılsa çok yararlı olur kanaatindeyim. Forumda bir iki örnek var ama yeterli değil. Mesela 3 adet kanal var. Fakat bu kanallr hangi pinler tarafından besleniyor çözemedim. Ayrıca ard arda 10 pinden veri nasıl okunabilir mesela?

fryrmnd

arda arda okuma scan mode ile yapılabiliyor yanılmıyorsam.

Alıntı YapScan mode for automatic conversion of channel 0 to channel 'n'

LukeSkywalker

Hocam şimdi bu çipin içerisinde 3 adet ADC modülü var. Peki her bir modül kaçar tane analog girişe sahip? Hangi modülün hangi kanala sahip olduğunu nasıl anlıyoruz? Bu nereden ayarlanıyor? PIC serilerinde 1 adet modül vardı ve analog pinler belliydi. Bu çipte öyle birşey yok. Hangi pin analogtur hangi modüle bağlıdır belli değil. Bütün pinler analog olarak ayarlanabiliyor yanılmıyorsam.

fryrmnd

#944
hocam bizim kartta yanlış anlamadıysam 2 adet ADC modül var. ADC12 diye geçiyor. 16 external giriş için kanal 3 tane de dahili adc kanalı.
şimdi bunalmış hocanın hard diye adlandırdığı doküman

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/DM00037051.pdf

sayfa 43 de başlıyor. pin an ball definitions diye bir kısım. hangi pin kaç nolu kanal gösteriyor. benim anladığım ADC12_0 dan ADC12_15 e kadar bizim karttaki mcu nun donanımı. ADC yi kullandın mı diye sorarsanız henüz maalesef. 

hatta düzelteyim 16 kanaladan bir kısmı(8 adet) ADC123 diye geçiyor. bu durumda 3 modül gibi.