STM32F407 Cortex M4 şamataları

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

LukeSkywalker

Ben de az önce farkettim o  dökümandaki açıklamayı. Çok karışık bu çipin dökümanları. ADC12'den kastı zannedersem hem ADC2'de hem de ADC1'de kullanılabiliyor olması aynı pinin.

fryrmnd

evet o anlamda sanırım. dediğiniz gibi microchip datasheetlerinden sonra baya bir karışık geldi bana da. git bi pdf den registerlara bak diğerinden pin açıklamaları.  :(
Klein hocamın örnek açıklayıcı tek kanal da olsa açıklayıcı ama.

LukeSkywalker

#947
Şimdi MikroC ile deniyorum baya basitleştirmişler kütüphane ile ADC okuma işini.

mesaj birleştirme:: 30 Temmuz 2012, 10:59:21

Arkadaşlar kitimizin pinlerinden nasıl bir kablo ile breadboard veya harici devrelere bağlantı yapabiliriz kolayca?
Alıntı yapılan: cenkun - 20 Aralık 2011, 18:31:42
Pin header sistemin çok kullanışlı olmadığını düşünerek kit üzerinde modifikasyon yaptım.
Erkek pinleri sökerek dişi kulandım. Kartın alt tarafında kısadevre oluşmasın diye yükseltmek için kartın alt tarafındaki  Jp2 ve Jp3 jumperlerını sökmedim.  Micro ubs soketi altındaki gnd bağlantısına 90 derecelik erkek pin header  lehim yaparak bir destek oluşturdum.




bu güzel olmuş...

LukeSkywalker

Şurada da karta altlık yapmak isteyenler için örnek bir çalışma var;
http://atomsoft.wordpress.com/2011/11/06/stm32f4-male-to-female/

yamak

Eski floppy kablolarını da kullanabilirsiniz.

LukeSkywalker

Bulent hoca bıraktı mı bu işleri?
Şu çevre birimlere birer örnek yazsaydı iyi olacaktı. Özellikle ADC  registerları için detaylı bir anlatım yapılsa iyi olacak. Ard arda scan modu ile yapılacak bir uygulama güzel olurdu.

GreeN

Alıntı yapılan: maytere - 01 Ağustos 2012, 14:01:28
Bulent hoca bıraktı mı bu işleri?
Şu çevre birimlere birer örnek yazsaydı iyi olacaktı. Özellikle ADC  registerları için detaylı bir anlatım yapılsa iyi olacak. Ard arda scan modu ile yapılacak bir uygulama güzel olurdu.

Ard arda n adet örnek almaktan mı bahsediyorsun ?
böyle bir uygulamada scan mode register disable olmalı.
Terörü Lanetliyoruz.

LukeSkywalker

Ardarda farklı kanallardan okuma yapmak istiyorum. Bu durumda scan mode aktif olmayacak mı? Hangi registerların kurulacağından emin olamadım birtürlü.

Klein

Bir kaç gün yoğunum. Yoğunluğu atlatınca çok kanallı ADC örneği yazacağım. 

LukeSkywalker

Süper olur. Registerların fonksiyonlarını öğrenmek adına...

EMP_Otto

 https://www.picproje.org/index.php/topic,35780.180.html

Arkadaslar sorunumu bicok kez dile getirdim fakat yardım eden cıkmadı lütfen yardım edin  :'(
Sorunum bunalmış hocamın veya internetten buldugum yada kendi yazdıgım kodların calısmaması.Derlemede falan hata yok kodları kite yüklüyorum fakat calısmıyor.Keil im kendi kendi içinde gelen kodlar sorunsuz çalışıyor.Proje ayarlarınında Keil ile gelen projeyle aynı yapıyorum ama bir türlü çalıştıramadım.Acaba bir arkadasımız bunalmış hocamın yazdıgı (ledleri flaş  eden yada user butonu ile ledleri yakan ) projelerden birini proje proje ayarlarını yapıp kendi kitinizde denedikten sonra siteye yükleyebilecek bi arkadasımız yok mu acaba?
Lütfen yardım edin  :'(
Bu işler zordur,özveri ister...


sseedat

mrb 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()
{
    while(1)
      {
         if (GPIOA->IDR & 0x000000001) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;     // Ledler sonsun
      }
}
program hatasız kitte çalışıyor.
şunlar bende tamam ve problemsiz kit üzerinden programı çalıştırıyorum
-->kitin driverini kurma
-->st-link utility kurma
-->keilin options for targetten utilities kısmından use external tool for flash p. kısmına
command:C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe
arguments:-c SWD -p "$H@H.hex" -Rst -Run bunları yazınca çaışması lazım

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

LukeSkywalker

void Write(char Adr,unsigned char Data)
{
      GPIOE->BSRRH=0x0008;            // LIS302DL CS=0
      SPI1->DR=((Adr&0x3F)<<8)|Data;
      while(!(SPI1->SR&2));
      GPIOE->BSRRL=0x0008;            // LIS302DL CS=1
}   
 
char Read(char Adr)
{
 
      GPIOE->BSRRH=0x0008;            // LIS302DL CS=0
      SPI1->DR=((Adr&0x3F)|0x80)<<8;
      while(!(SPI1->SR&1));
      GPIOE->BSRRL=0x0008;            // LIS302DL CS=1
      return(SPI1->DR);
}   
 
int main()
{
char who;   
 
   if(Read(0x0F)==0x3B)   // Who are you ?


Arkadaşlar yukarıdaki program parçacığı @z'nin accelerometer okuma örneğinden.
Burada write ve read fonksiyonlarında okunacak ve yazılacak register adrslerini 0x3f ile çarpmış. Neden?
Bir de 16 bit iletişim seçilmesinin nedeni nedir? 8 bit yetmez mi?

Klein

#959
0x3F ile AND işlemine sokmanın sebebi
ilk 6 bitin içeriğine dokunmadan geri kalan son 2 biti 0 yapmak.

örn:
adr içeriği   0xAC  = 1010 1100 binary.

bu sayıyı 0x3F ile AND yaparsak

1010 1100
0011 1111
------------
0010 1100

görüldüğü gibi  adr değişkenimizin ilk 6 biti değişmedi. son 2 biti 0 oldu.

Neden 16 bit?
8 bit de yapılabilirdi.  bu durumda adres bilgisi ve komut bilgisini 2 seferde göndermek ve geleni de aynı şekilde almak gerekirdi.
Burada kullanılan accelerometer çipi adres ve komut olmak üzere 2 baytlık veri kabul ediyor. Bu yüzden tek seferde 16 bit göndermek uygun olur. Eğer karşıdaki cihazdan tek tek veri okumak yerine  eepromlarda olduğu gibi peşpeşe çok sayıda veri okumak veya yazmak isteseydik, 8 bit daha kullanışlı olabilirdi.