STM32F407 Cortex M4 şamataları

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

sayment

Hocam derslerde söyle bir ifade var:
Alıntı Yap
1) ARM işlemci Reset ardından sırayla önce, Startup_stm32f4xxx.s dosyasındaki kodları koşturur.
2) SystemInit adındaki fonksiyonu koşturur.
3) main() fonksiyonunu koşturur.

Bu da ikinci led yakıp söndürme uygulamasından bir bölüm:
Alıntı Yap
void Delay()
{
unsigned int i;

     for(i=0;i<0x800000;i++);
}

int main()
{
    while(1)
   {
     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     Delay();
     GPIOD->ODR= 0x00000000;     // Ledler sonsun
     Delay();
   }
}

İkinci led yakıp söndürme uygulamasında "main()" fonksiyonundan önce "delay()" fonksiyonu tanımlamışsınız. Yukarıda yazılanlardan yola çıkarak, yazılımsal olarak "main()" fonksiyonundan önce yada sonra herhangi bir fonksiyon tanımlamanın hiç bir önemi yok, önce "main()" fonksiyonu koşturulur diyebilir miyiz?

M_B

C:\Keil\ARM\INC\ST\STM32F10x\STM32F10x.h(80): error:  #35: #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
Target not created


Hatasını arastırdıgımda sunu buldum

#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
 #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
#endif

Bunun acılımı nedir ?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

önce cihazı (mikrodenetleyiciyi) seçin diyor

gambit1244

sayment

main fonksiyonundan onceki kullanılan fonksiyonlar

main içinde yer alan fonksiyonlardır

bunları sonada yazabilirsin fakat busefer tanıtmanız gerekir
karışıklık olmasın diye hocam boyle yazmış

dikkat etmen gereken şu

delay fonksiyonu aslında main içinde kullanılmak üzere yazılmıştır

ben iyi anlatamadım sanırıım


/////////////////

muhittin hocam f100RB yi seçmedinmi sende neden boyle hata veriyor bizde?
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

sayment

Peki bu fonksiyonları "main" fonksiyonundan sonra yazdığımızda tanıtma dediğiniz işlemi nasıl yapacağız ?

muhittin_kaplan

evet 32f100RB seçtim
Yanlız kendi örneğinde
system_stm32f10x.c ile nirlikte altında
stm32f10x.h
core_cm3.h
core_cmInstr.h
core_cmFunc.h
system_stm32f10x.h
stdint.h

da ekli. hangi kütüphaneler ki bunlar

gambit1244

bende anlamadım orasını işte :S
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

gambit1244

#157
Alıntı yapılan: sayment - 22 Ekim 2011, 21:26:46
Peki bu fonksiyonları "main" fonksiyonundan sonra yazdığımızda tanıtma dediğiniz işlemi nasıl yapacağız ?

main fonksiyonu her c programında bulunması gereken özel bir fonksiyondur
main fonksiyonu bir c programının calışmaya başladıgı ana fonksiyondur

programınız derlenirken
mantıken yukarıdan aşağıya doğru derlenir
yukarıdan aşagıya doğru derlenirken
ilk başta karşısına

void Delay()
fonksiyonu cıkar
ve bunu derler
sonra bunu hafızasında tutar

daha sonra delay fonksiyonu kullanıldıgında
bu fonksiyonun yukarıda derlendigini hatırlar ve işleme devam eder

fakat siz delay fonksiyonunu tanımlamadan
delay fonksiyonunu kullanmak isterseniz;
derleyiciniz delay ın nereden geldigini bilemez ve derleme sırasında hata verir yada program çalışmaz(derleyiciye gore degişebilir)
(halbuki siz aşagıda yazdınız belki ama o daha aşagıya gelmediki)
oyüzden fonksiyonlar main den once yazılır
yada şoyle yapılır

mainden once fonksiyonun ismi belirlenip yazılır
daha sonra ise main in altına fonksiyonun içerigi yazılır şu şekilde bi ornek verebiliriz

int Delay();    /////////burada onceden int olarak fonksiyonun ismini tanımlıyoruz ki derleyicimizin aşagıda bunu gordügünde kafası karışmasın artık tanımlanmış bir delay fonksiyonumuz var

int main()
{
    while(1)
   {
     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     Delay();
     GPIOD->ODR= 0x00000000;     // Ledler sonsun
     Delay();
   } 
}



void Delay()    // ve şimdi fonksiyonumuzu yukarıda tanımladıgımız için mainden sonrada istedigimiz gibi yazabiliriz
{
unsigned int i;
 
     for(i=0;i<0x800000;i++); 
}

[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

sayment

@gambit1244
Açık ve net anlatımınız için teşekkür ederim. Anladım.

gambit1244

Alıntı yapılan: sayment - 22 Ekim 2011, 21:49:34
@gambit1244
Açık ve net anlatımınız için teşekkür ederim. Anladım.

nedemek .. biraz anlatım ozrlü oldugum için 4 5 kez editledim ama sonunda bişeye benzedi :D
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

sayment

Alıntı yapılan: gambit1244 - 22 Ekim 2011, 21:55:40
nedemek .. biraz anlatım ozrlü oldugum için 4 5 kez editledim ama sonunda bişeye benzedi :D
Estağfirullah gayet açık anlatmışsınız :)

M_B

muhittin_kaplan Hocam;

Program basında ki
"STM32F10x.h" kodu yerine

"stm32f10x_lib.h"
ekleyince normal şekilde derleme yapıyor.

Build target 'Target 1'
compiling main.c...
linking...
Program Size: Code=412 RO-data=304 RW-data=0 ZI-data=1632  
"Deneme.axf" - 0 Error(s), 0 Warning(s).





İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

ST32F100RB için (stm32 discovery kit) blinky.
Sanırım kütüphaneleri eklemeyince oluyor. Kendi Bilinky aldım üstüne yukarda geçen kodu yapıştırdım.


http://www.4shared.com/file/Fr3BmpqM/Blinky.html

gambit1244

rar dosyasında main.c yok muhittin hocam
siz calıştırdınızmı?
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

taneryilmaz

Alıntı yapılan: bunalmis - 21 Ekim 2011, 15:14:25
Aşağıdaki örnek programı Keil ders başlığında son konuda vermiştim.

#include "STM32F4xx.h"

void SystemInit()
{
    RCC->AHB1ENR |= 0x00000008;    // GPIOD donanımının clock sinyalini uygulayalım
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislarinı en yuksek hizda kullanacagiz
}

int main()
{
    while(1)
   {
     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     GPIOD->ODR= 0x00000000;     // Ledler sonsun
   }
}


C dersleri başladığında göreceğiz fakat şimdiden RCC->AHB1ENR  şeklinde satır görürsek bunun, RCC register grubunun bir üyesi olan AHB1ENR registeri anlamına geleceğini bilelim. Yanı sonuçta bu bir register. Bu registeri Rehberde RCC_AHB1ENR olarak bulabilirsiniz.

Deneme kitindeki ledler  D portunun 15, 14, 13 ve 12 nolu bitleriyle kontrol ediliyor.

     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     GPIOD->ODR= 0x00000000;     // Ledler sonsun

Yukarıdaki kodlar 32 bitlik D portuna 0x0000F000 ardından da 0x00000000 yazıyor.

Yani ilk satır 4 ledin hepsini birden yakıyor, sonraki satırda hepsini birden söndürüyor.

Şimdi SystemInit fonksiyonundaki

    RCC->AHB1ENR |= 0x00000008;    // GPIOD donanımının clock sinyalini uygulayalım
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislarinı en yuksek hizda kullanacagiz

satırlarına bakın.

Rehber dokumanda  RCC_AHB1ENR, GPIOD_MODER ve GPIOD_OSPEEDR registerlerin anlatıldıkları sayfaları bulun.
Neden bu registerlerin içine yukarıdaki sayıları yüklediğimin cevabını bulmaya çalışın.

Bu çok önemli bir çalışma. Muhakkak uğraşın.


@bunalmış hocam moder ve oseedr komutları çok sade ve güzel bir şekilde anlattınız RCC->AHB1ENR komutu hakkında tam bir açıklama bulamadım yada görmedim aceba bu komut;
clock verip- keserek
seçilen portları aktif-deaktif
seçilen ethernet Rx-Tx aktif- deaktif
seçilen USB girişlerini aktif - deaktif  mi ediyor?