Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: Klein - 26 Ekim 2012, 16:10:47

Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 26 Ekim 2012, 16:10:47
Uzun zamandır forumda bu konuda sorular var.  Ama genelde cevapsız kalmış. Ya kimse bilmiyor, ya da benim gibi zaman bulup ilgilenemiyor.  HAzır bayram arası fırsat bulmuşken biraz ilgilenebildim.

ST kütüphanesinin projeye dahil edilip derlenmesini adım adım anlatmaya çalışacağım. Bir ledi yakıp söndüren (toggle) kod yazacağız. İşi karmaşıklaştırmama adına, sistemi başlatmak için gerekli clock ayarlamaları gibi kodlar için kütüphane fonksiyonlarını kullanmadım.  Başlatma kodlarımız yine @bunalmıs hocanın standart başlatma kodları.

Öncelikle yeni bir proje oluşturup , standart ayarlamalarımızı  yapıyoruz. main.c dosyasını registerleri kullanarak kart üzerindeki ledlereden birini yakıp söndürecekmişiz gibi düzenliyoruz.  Ledimizin yanıp söndüğünü gördükten sonra  kütüphaneyi dahil etmeye başlayabiliriz.

1. adım.
proje yönetiminden  projemize aşağıdaki dosyaları ekliyoruz.
(http://b1210.hizliresim.com/12/u/f9pr2.png)
Kütüphane klasörü\STM32F4xx_DSP_StdPeriph_Lib_V1.0.1\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c
Kütüphane klasörü\Utilities\STM32F4-Discovery\stm32f4_discovery.c
Kütüphane klasörü\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c
Kütüphane klasörü\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_exti.c
Kütüphane klasörü\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c
Kütüphane klasörü\Libraries\STM32F4xx_StdPeriph_Driver\src\misc.c

Bu dosyaları ekledikten sonra, proje ağacımız aşağıdaki gibi görünecek.
(http://b1210.hizliresim.com/12/u/f9prs.png)

mesaj birleştirme:: 26 Ekim 2012, 16:19:08

2. adım
Projemizin ayarlarını yapacağız. 
Proje opsiyonlarında C/C++ sekmesine gidiyoruz.
"PreprocessorSymbols" gurubunun aldındaki "Defines:" kutusuna USE_STDPERIPH_DRIVER,STM32F4XX   yazıyoruz.
(http://b1210.hizliresim.com/12/u/f9pup.png)

3. adım.
Kütüphaneni yolunu bildiriyoruz.
yine C/C++ sekmesinden "Include Paths" kutusunun yanındaki butona basıp açılan pencereden kütüphane klasörlerinin yollarını ekliyoruz.
(http://g1210.hizliresim.com/12/u/f9pzl.png)

mesaj birleştirme:: 26 Ekim 2012, 16:21:30

4. adım.  "main.c" dosyasının içeriğini aşağıdaki kodlarla değiştiriyoruz.  Derleyip çalıştırıyoruz.

main.c
#include "stm32f4_discovery.h"

/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/
uint32_t ledtime=0;
uint8_t timer_update=0;


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   168 Mhz
      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 |= 0x00000017;     // GPIO A,B,C,D,E clock'u aktif edelim

RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =4199;                 // Prescaler degerimiz 839, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (840) = 100 KHz
     TIM7->ARR =1;                   // Counter, Decimal 1 olunca basa donsun. Her 20 mikrosaniye de bir timer int olusacak.
     TIM7->DIER=0x0001;              // Update Int enable
     TIM7->CR1|=0x0001;              // Counter Enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
}



void TIM7_IRQHandler(void)
{
TIM7->SR=0;   
timer_update=1;
}




int main(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  while (1)
  {

    if(timer_update){
timer_update=0;

if(++ledtime > 5000){
  ledtime =0;
GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
GPIOD->ODR ^= 0x0000008000;
}
}

  }
}



mesaj birleştirme:: 26 Ekim 2012, 16:47:04

Gelelim kodların açıklamasına.

SystemInit() kodları , eski örneklerde kullandığımız init kodları. Buradaki tek değişiklik aşağıdaki bölümde.
RCC->AHB1ENR |= 0x00000017;     // GPIO A,B,C,D,E clock'u aktif edelim
Port D'nin clok iznini iptal ettim ki , kütüphane kodları ile nasıl açacağımızı görelim.

GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitTypeDef  tipi kütüphanede daha önceden tanımlanmış bir tip. Biz bu tipten yeni bir değişken oluşturuyoruz.

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
Bilidiği üzere  donanımlarınregisterleri üzerinde herhangi bir işlem yapmadan önce, o dananıma saat sinyali sağlamamız gerekiyor. Bunun için RCC registerinden ilgili donanımın saat kaynağını aktif ediyoruz.

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;

Burada GPIO nun hangi pinlerini init edeceğimizi bildiriyoruz.  Dikkat edin hangi port olduğunun şimdilik bir önemi yok. Sadece hangi pinler olduğu önemli.  Sıralamanın da bir önemi yok.  biz aynı kodu
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_12;

şeklinde de yazabilirdik.  daha fazla sayıda pini init edeceksek aralarına '|' or işareti koyarak pinlerimizi ekliyoruz.
Burada dikkat edilmesi gereken şey, init ederken yapacağımız ayarlamaların burada seçtiğimiz tüm pinler üzerinde etkili olacağıdır.
Yani  buraya girdiğimiz pinlerin bir kısmını input bir kısmını output yapamayız. Ya da bir kısmını push-pull bir kısmını open drain yapamayız.


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

Bu kodla  seçtiğimiz pinlerin özelliklerini ayarlıyoruz.  Seçtiğimiz pinler Output olacak , PushPull olacak, 100Mhz hızında olacak, Pullup veya Pulldown olmayacak.

Artık protumuzu init edebiliriz.
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIOD portunun seçtiğimiz pinlerinin başlangıç ayarlarını yaptık.

Şimdi de portu toggle edelim.
               
GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
GPIOD->ODR ^= 0x0000008000;

Üstteki satırda D portunun 12. pinini Kütüphane fonksiyonu kullanarak toggle ediyoruz.
Alttaki satırda ise D portunun 15. pinini kütüphane kullanmadan eski yöntemlerle toggle ediyoruz. 
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: SpeedyX - 26 Ekim 2012, 16:58:25
Hocam teşekkürler, basit ve kullanışlı. TI CCS kodlamasına benzettim.
Bu kütüphaneler STM32F103-107 de de kullanılabiliyor mu? Örneğin bu kütüphaneyle F407 için yazılmış bir kodu F103 için derleyebilir miyiz?
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: muhittin_kaplan - 26 Ekim 2012, 17:02:09
Hayır Olmuyor. Her Serinin Kütüphanesi Farklı.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 26 Ekim 2012, 17:08:31
Kütüphenyi öğrenmeye bu gün başladım. Bu yüzden kesin cevaplar veremem.
Daha önce SDM32F103 için yazılmış bir koda göz atmıştım.  Port init aynı şekilde yapılıyordu. 
Muhtemelen sadece ütüphane değiştirilerek
örn: stm32f4xx_gpio.c yerine stm32f1xx_gpio.c kullanılarak , uyumlu fonksiyonlar derlenebilir. Bu şimdilik sadece tahmin.
Birazdan bir STM32F1 kodu bulup inceleyeceğim.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: muhittin_kaplan - 26 Ekim 2012, 17:14:44
Hocam Teşekkür ederim.
Ama lütfen Hiç Bilmeyen birine anlatıyor gibi anlatınız. Keza Atladığımız Noktalar var.
1. Keil de Project Tree ye neden dosya ekleriz neden eklemeyiz ?
2. Kullandığımız Dosyalar neler yapar (örnek system_stm32f10x.)
3. Eklediğimiz Dosyalarla alakalı olarak Fonksiyon lara gidecek parametreler nelerdir, nereden öğrenilir ?

Savaşım devam edecek bu lib lerle

mesaj birleştirme:: 26 Ekim 2012, 17:20:28

http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip (http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip)
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 26 Ekim 2012, 17:28:56
Şimdi bir kod buldum.
Port init şu şekilde yapılmış

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
/**
*  LED1 -> PB15 , LED2 -> PB14 , LED3 -> PB13 , LED4 -> PB12
*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

Yöntem aynı.  Bazı parametrelerde farklılık var.  F4 te moder Otype registerleri ayrı olduğu için buları ayrı ayrı ayarlıyoruz.
 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;


F1 de tek registerden ayarlanıyor.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

mesaj birleştirme:: 26 Ekim 2012, 17:57:17

Alıntı yapılan: muhittin_kaplan - 26 Ekim 2012, 17:14:44
Hocam Teşekkür ederim.
Ama lütfen Hiç Bilmeyen birine anlatıyor gibi anlatınız. Keza Atladığımız Noktalar var.
1. Keil de Project Tree ye neden dosya ekleriz neden eklemeyiz ?
2. Kullandığımız Dosyalar neler yapar (örnek system_stm32f10x.)
3. Eklediğimiz Dosyalarla alakalı olarak Fonksiyon lara gidecek parametreler nelerdir, nereden öğrenilir ?

Savaşım devam edecek bu lib lerle

mesaj birleştirme:: 26 Ekim 2012, 17:20:28

http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip (http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip)

1. Detaylara girdiğimizde konu çok dallanıyor. Bu yüzden soru gelmedikçeçoğumuzun bildiğini varsaydığım konuları atlıyorum. soru gelirse cevaplamaya çalışırım.
2. Bu dosyalar ne yapar  ben de bilmiyorum. İnceleme aşamasındayım. Öğrendikçe buradan anlatmaya çalışacağım.
3. Genellikle örnek kodları ve kütüphane dosyalarını inceleyerek çıkarmaya çalışıyorum. Çıkardıkça burada paylaşırım. Eğer zaman bulabilirsem derli toplu hale getirmeye çalışacağım.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: X-Fi - 26 Ekim 2012, 19:15:46
Bende geçen haftalarda buna benzer bir döküman hazırlamıştım kendime unutmayayım diye yeni başlayanlara faydalı olabilir anlaşılmıyan biyer varsa yardımcı olurum.

http://www.coskunergan.com/wp-content/uploads/2012/10/Keil_Proje.pdf (http://www.coskunergan.com/wp-content/uploads/2012/10/Keil_Proje.pdf)
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: memo333 - 26 Ekim 2012, 22:57:21
Alıntı yapılan: muhittin_kaplan - 26 Ekim 2012, 17:14:44
Hocam Teşekkür ederim.
Ama lütfen Hiç Bilmeyen birine anlatıyor gibi anlatınız. Keza Atladığımız Noktalar var.
1. Keil de Project Tree ye neden dosya ekleriz neden eklemeyiz ?
2. Kullandığımız Dosyalar neler yapar (örnek system_stm32f10x.)
3. Eklediğimiz Dosyalarla alakalı olarak Fonksiyon lara gidecek parametreler nelerdir, nereden öğrenilir ?


1. Dosya eklemezseniz derlemeyi hangi dosyalarla yapacak?
2. Belirttiğiniz dosya ilk kurulum için gerekli olan SystemInit fonkisyonu var istediğiniz hızda clocku otomatik olarak set eder. Siz sadece fonksiyonu çağırırsınız. Bunun dışında clock yönetimi ile ilgili bi-iki fonk. içerir.

(http://d1210.hizliresim.com/12/u/fb1h8.jpg) (http://bit.ly/c25MCx)

3. parametreler Kütüphaneyi indirdiğiniz zip dosyasının içindeki *.chm dosyasında...


---------------------------------

Klein hocam;

Clock kurulumunu ben genelde system_stm32fxxx .c dosyasındaki SystemInit fonksiyonu ile hallediyorum. Keza sizde *.s dosyasını eklediğinizde keil otomatik olarak o fonksiyonu çağıracak şekilde derliyor.

Clock değişimi yapmak istersem stm32xxx_rcc.c dosyasındaki kütüphane fonksiyonlarını da kullanabilirsiniz.

Önemli: ilgili kütüphaneyi kullanabilmek için stm32f10x_conf.h dosyasından *.h dosyasını uncomment yapmanız gerek...

(http://d1210.hizliresim.com/12/u/fb1s0.jpg) (http://bit.ly/c25MCx)
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: muhittin_kaplan - 26 Ekim 2012, 23:00:36
hocam bu cocox u bende inceliyorum. bir bilinky örneği verebilmeniz mümkün mü

mesaj birleştirme:: 26 Ekim 2012, 23:05:09

Ayrıca 1. Soruya verdiğiniz Soruya Ek Olarak

Alıntı Yap"1. Dosya eklemezseniz derlemeyi hangi dosyalarla yapacak?"
demişsiniz ama bazen oraya eklemediğimiz ama include deyimi ile main.c ye import ettiğimiz dosya da derleniyor. Ve hatta ne Project tree de nede include ile eklemeden dosya işe dahil oluyor. örneğin stm32f10x_conf.h

yani bazı olaylar havada kalıyor.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: memo333 - 26 Ekim 2012, 23:47:37
Alıntı yapılan: muhittin_kaplan - 26 Ekim 2012, 23:00:36
hocam bu cocox u bende inceliyorum. bir bilinky örneği verebilmeniz mümkün mü

mesaj birleştirme:: 26 Ekim 2012, 23:05:09

Ayrıca 1. Soruya verdiğiniz Soruya Ek Olarak
demişsiniz ama bazen oraya eklemediğimiz ama include deyimi ile main.c ye import ettiğimiz dosya da derleniyor. Ve hatta ne Project tree de nede include ile eklemeden dosya işe dahil oluyor. örneğin stm32f10x_conf.h

yani bazı olaylar havada kalıyor.

coocox'u picprojeye yaymak lazım. 2-3 aydır kullanıyorum sorunsuz... kurulumunda bir iki nokta var onları gösteren birşeyler hazırlamam lazım...

"stm32f10x_conf.h" dosyası bir yerden include ediliyordur. örneğin

(http://d1210.hizliresim.com/12/u/fb3mk.jpg) (http://bit.ly/c25MCx)

diğer dosyalarda include ettiğiniz birşeylerin içinden geliyordur...
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: muhittin_kaplan - 27 Ekim 2012, 00:04:36
Hocam bence Buradaki Konu dağılmadan Coocox la alakalı başlık açınız. bedava Olunca Hoş Oluyor..
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 27 Ekim 2012, 12:50:56
@muhittin.
Dosyayı #include ile eklemekle  ayrıca derlemek , yani proje yöneticisinden aklemek arasında biraz fark var.
bir dosya #include doğrudan koda bağlanırsa, tüm dosyalar include edilme sırasıyla tek bir dosya gibi derlenir.

Temsili bir anlatımla şöyle diyebiliriz: Derleme komutu verdiğimizde derleyici bir tane yeni dosya  oluşturuyor. bu dosyaya  include edilmiş tüm dosyaların kodunu yazıyor.  böylece elimizde tüm kodları hiç başka header file veya kaynak dosya kullanmadan yazmışız gibi bir kaynak kod oluyor. Derleyici bu dosyayı derleyip  hex kod oluşturuyor.

Bu dosyaları #include yerine  linker ile birleştirirsek , yani proje yönetiminden projeye eklersek, önce tüm kaynak kodlar ayrı ayrı derleniyor çıktı olarak hex yerine obje dosyası üretiliyor. Sonra link esnasında bu obje dosyaları birbirlerine bağlanarak hex dosya üretiliyor.

Peki neden #include etmek yerine link esnasında birleştiriyoruz?
Eğer proje küçükse, birkaç modülden oluşuyorsa ,  #include etmek çok sorun olmaz.  Çünkü kim kimin içinde include edilmiş, hangi sırada include edilmiş takip etmek çok zor değildir. Ama projede çok sayıda kaynak kod ve bunların arasında grift bir ilişki varsa o zaman takip zorlaşır.  Aynı dosyadaki kodları birkaç modül birden kullanması gerekir , üst satırda  #include ettiğiniz dosyadaki fonksiyonlar,alt satırda #include edilen dosyadaki fonksiyon ya da değişkenleri görmez , bunların sırasını değiştirirsiniz başkasıyla sorun yaşarsınız, bir dosyanınaynı anda birkaç modül içinde include edilmesi gerekir o zaman derlemede sıkıntı olur  vs.. vs..

Bu gibi sorunlarla uğraşmamak için proje küçük de olsa , büyük de olsa dosyaları link esnasında bağlamayı alışkanlık haline getirmekte fayda var. Hatta kullanacağınız kütüphaneleri seçip onları library haline getirip derlerseniz, kodunuzu başka makinalara veya platformlara taşımak daha da kolaylaşır.

Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 28 Ekim 2012, 15:29:36
UART KULLANIMI

#include "stm32f4_discovery.h"

/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/
uint32_t ledtime=0;
uint8_t timer_update=0;


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   168 Mhz
      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 |= 0x00000017;     // GPIO A,B,C,D,E clock'u aktif edelim

RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =4199;                 // Prescaler degerimiz 839, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (840) = 100 KHz
     TIM7->ARR =1;                   // Counter, Decimal 1 olunca basa donsun. Her 20 mikrosaniye de bir timer int olusacak.
     TIM7->DIER=0x0001;              // Update Int enable
     TIM7->CR1|=0x0001;              // Counter Enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
}



void TIM7_IRQHandler(void)
{
TIM7->SR=0;   
timer_update=1;
}



void init_gpio(void){
GPIO_InitTypeDef  GPIO_InitStructure;
/*  Ledlerin bağlı olduğu port ve pinlerin başlatma işlemi */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

/*  USATT3 pinlerinin başlatma işlemi */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  GPIO_PinAFConfig(GPIOB,10,GPIO_AF_USART3);
  GPIO_PinAFConfig(GPIOB,11,GPIO_AF_USART3);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void init_usart(void){
USART_InitTypeDef USART_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

  USART_InitStructure.USART_BaudRate = 19200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART3, &USART_InitStructure);

}

void SendChar(char Tx)
{
      while(!(USART3->SR&0x80));  // TX Buffer dolu ise bekle (Rehber Sayfa 646)
      USART3->DR=Tx;
}

void SendTxt(char *Adr)
{
      while(*Adr)
        {
          SendChar(*Adr);
          Adr++;
        } 
}

int main(void)
{
  init_gpio();
  init_usart();
  USART_Cmd(USART3,ENABLE);
  while (1)
  {

    if(timer_update){
timer_update=0;

if(++ledtime > 5000){
  ledtime =0;
GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
GPIOD->ODR ^= 0x0000008000;
SendTxt("USART Test\r\0");
}
}

  }
}



Kütüphane ile uart init etme. kodları.
Baud hızı seçtiğim hızın iki katı çıkıyor. Sebebini daha sonra araştırırım.
Kod açıklamaları:
/*  USATT3 pinlerinin başlatma işlemi */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  GPIO_PinAFConfig(GPIOB,10,GPIO_AF_USART3);
  GPIO_PinAFConfig(GPIOB,11,GPIO_AF_USART3);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

Önce "RCC_AHB1PeriphClockCmd()" fonksiyonu ile, kullanacağımız seri portların bulınduğu portun veya portların saat kaynaklarını aktif ediyoruz.
"GPIO_PinAFConfig()"  fonksiyonu ile, ilgili pinleri , ilgili USART ile ilişkilendiriyoruz. Daha sonrasında işletilen komutlar , yukarıdaki port init kodları ile aynı. Tek fark modu AF seçmemiz.

Daha sonra USART ayarlamalarını yapıyoruz.
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

  USART_InitStructure.USART_BaudRate = 19200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART3, &USART_InitStructure);


Öncelikle Kullanacağımız USART için saat kaynağını aktif ediyoruz. Daha sonra koddan da anlaşılacağı üzere, baud, bit sayısı, Flow kontrol vs... özellikleri ayarlıyoruz.

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
Bu kod RX ve TX enable kodu. Eğer Sadece TX yapacak RX yapmayacaksak buraya sadece USART_Mode_Tx yazıyoruz.

Son olarak da
USART_Cmd(USART3,ENABLE); ile USART'ı aktif ediyoruz. Eğer kapatmak istersek USART_Cmd(USART3,DISABLE);  yapıyoruz.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: SpeedyX - 28 Ekim 2012, 17:49:47
Sıradaki örnek ADC ve DAC ile alakalı olursa seviniriz :)
Bu lib lerle çalışmak işi çok kolaylaştırıyor anlaşılan...
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 31 Ekim 2012, 21:55:07
Usart örneğinde baud hızı istediğimizin iki katı çıkıyordu.
Sorun "stm32f4xx.h" dosyasındaki bir satırdan kaynaklanıyor. Baud hızı hesaplayan rutin , bu değeri kullanıyor. Bu değer devreye takılı kristalimizin frekansı. Stm32f4Discovery örneklerinde default 4000000 geliyor. Bazı kütüphanelerde 25000000 geliyor.  Biz bu değeri kendi kristal frekansımız ile değiştiriyoruz. Stm32F4 kitinin kristal frekansı 8MHz. Bu değeri 8000000 yapıyoruz.

#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)4000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */


#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: sseedat - 29 Kasım 2012, 22:00:11
mrb hocam

Kütüphane klasörü\Utilities\STM32F4-Discovery\stm32f4_discovery.c   klasörde boyle dosya bulamadım.bendeki
utilities klasöründe STM32_EVAL klasörü var (burdada stm32f4_discovery.c dosyası yok)

STM32F4xx_DSP_StdPeriph_Lib_V1.0.1  ve  LİB.stm32f10x_stdperiph_lib kütüphane kalsörlerine bakıyorum. acaba biyerlerde hata mı yapıyorum.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 30 Kasım 2012, 13:14:42
stm32f4_discovery.c dosyası çok gerekli bir dosya değil.  İçinde Ledlerin bağlı olduğu portlar için tanımlamalar var. Standart kütüphaneye dahil değil. Discovery kit için kullanılmış bir dosya. Örnekte bu dosyadaki tanımları hiç kullanmamışım zaten.  Projeden kaldırırsanız sorun olmaz.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Kaanx - 12 Mart 2013, 03:25:34
Merhabalar arkadaşlar benimde çorbada bir tuzum olması dileğiyle bu kodu paylaşayım dedim.Forum üyelerine ve bulent hocam aynı zamanda murat hocama cok tesekkurlerimi sunarım.Kod Atollic te derlenmiştir daha ayrıntılı bilgi için kişisel blogumdaki yazıyı inceleyebilirsiniz.
http://kaankandemir.wordpress.com/2013/03/12/stm32f4-discovery-std_periph_driver-gpio-kullanimi/ (http://kaankandemir.wordpress.com/2013/03/12/stm32f4-discovery-std_periph_driver-gpio-kullanimi/)
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

GPIO_InitTypeDef  GPIO_InitStructure;

void Delay(__IO uint32_t nCount); //gecikme fonksiyonu atadık

void Pin_Init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);


}

void main(void)
{
Pin_Init();
Delay(0x3FFFF);
while(1)
{
GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
Delay(0x0053FFFF);
GPIO_ToggleBits(GPIOD,GPIO_Pin_13);
Delay(0x0053FFFF);
GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
Delay(0x0053FFFF);
GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
Delay(0x0053FFFF);

}
}
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}

uint16_t EVAL_AUDIO_GetSampleCallBack(void)
{
    return 0; // ses çipini kullanıyorsanız tek sample veriyi burada return ile döndürün.
}
void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size)
{
    return; // ses çipini kullanıyorsanız  burada çipe veri aktarımı DMA sona ermiş
}
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Erhan YILMAZ - 12 Mart 2013, 07:03:15
Hocam çok teşekkürler anlatım için. Bende keil'e çok hakim olamadığımdan standart libraryleri dahil etmede sorun yaşadığım için pek ilgilenmiyordum. En kısa sürede anlatılanları denemeyi düşünüyorum. Sormak istediğim discovery.h dosyası mecburi bir dosya mı? Bir proje açmak için minimum hangi dosyaları dahil etmek gerekiyor?
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Kaanx - 12 Mart 2013, 12:40:32
Hocam keil kullanmadım ben fakat atollicte stm32f4xx.h , stm32f4xx_gpio.h , ve blogların frekans ayarını yaptıgımız ıcın stm32f4xx_rcc.h dahil etmiştim
burada temel olarak stm32f4xx.h kesınlıkle dahıl edılmeli.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: Klein - 12 Mart 2013, 12:44:03
Discovery.h  mecburi değil.
Bu başlığı,  İlk ST_Lib denemesinden sonra açmıştım. Bazı acemilikler ve budan kaynaklı gereksiz şeyler var.
Yakında yeniden  düzenleyeceğim.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: sseedat - 14 Aralık 2013, 17:25:26
merhaba
GPIO_InitTypeDef  GPIO_InitStructure; şeklinde kalıtım oluşturuyoruz
bunu şu şekilde yazıncada çalışıyor GPIO_InitTypeDef  port;
şunu sormak istedim GPIO_InitStructure olarak yazmanın bir önemi varmı yoksa istediğimiz isimden türetebilirmiyiz.

saygılar...
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: M_B - 14 Aralık 2013, 17:44:46
Alıntı yapılan: sseedat - 14 Aralık 2013, 17:25:26
şunu sormak istedim GPIO_InitStructure olarak yazmanın bir önemi varmı yoksa istediğimiz isimden türetebilirmiyiz.
Bir önemi yok. Başka bir şey de yazabilirsin. Ama çağrıştıracak bir şey olursa daha iyi olur.

Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: sseedat - 14 Aralık 2013, 20:28:04
teşekkürler cavabınız için
bu konuda yeniyim aklıma çok şey takılıyor mesel şu olayları tam olara kavrayamadım

timer7 örneğinde;

TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); burdaki  TIM_IT_Update  geleceğini nerden biliyoruz?
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: SpeedyX - 14 Aralık 2013, 21:17:55
Alıntı yapılan: sseedat - 14 Aralık 2013, 20:28:04
TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); burdaki  TIM_IT_Update  geleceğini nerden biliyoruz?
Timer değeri max değere ulaşıp overflow olunca, yani 0 değerine geri dönünce update event i gelir.
Timer da yukarı yada aşağı sayacağı için sona ulaşıp herzaman overflow olacaktır.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: sseedat - 15 Aralık 2013, 23:40:01
merhaba arkadaşlar ;
CooCox ile 2*16 lcd uygulaması yapmaya çalıştım  fakat lcd ye yazdığımla lcd de çıkan farklı oluyor;
kodları şu şekilde
lcd.c

#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx.h"
#include "lcd.h"
#include "Delay.h"

GPIO_InitTypeDef lcd_port;

void lcd_init()
{

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

//GPIOB
lcd_port.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
lcd_port.GPIO_Mode=GPIO_Mode_OUT;
lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
lcd_port.GPIO_OType=GPIO_OType_PP;
lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB,&lcd_port);

//GPIOD

lcd_port.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
lcd_port.GPIO_Mode=GPIO_Mode_OUT;
lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
lcd_port.GPIO_OType=GPIO_OType_PP;
lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD,&lcd_port);

GPIO_ResetBits(GPIOB,GPIO_Pin_4 | GPIO_Pin_5);
GPIO_ResetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

delayms(20);

GPIO_SetBits(GPIOB,GPIO_Pin_5);

    lcd_veri(0x03); // Lcd Reset
    lcd_sil();
    lcd_veri(40);   // 2 satır kullanacağımızı yazdık
    lcd_veri(15);   // Display i aç
    lcd_veri(0x06); // Kursör 1 artan modda.
    lcd_sil();     //
lcd_veri(128);

}

void lcd_veri(unsigned char veri)
{
   GPIO_ResetBits(GPIOB,GPIO_Pin_4);
   GPIO_SetBits(GPIOB,GPIO_Pin_5);
delayms(10);

    GPIO_Write(GPIOD,(veri & 0xF0)>>4);
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delayms(1);
GPIO_SetBits(GPIOB,GPIO_Pin_5); 
  delayms(1);

  GPIO_Write(GPIOD,((veri & 0x0F)));
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  delayms(10);
}

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)
{
    delayms(10);
    while(*lcd_data)  yaz(*lcd_data++);
}

void yaz(unsigned  dat)
{
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
delayms(10);

    GPIO_Write(GPIOD,dat=(dat & 0xF0)>>4);
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delayms(1);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
delayms(1);

GPIO_Write(GPIOD,dat=((dat & 0x0F)));
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
void lcd_sil(void)
{
    lcd_veri(1);
    delayms(10);
}

void lcd_imlec_yok(void)
{
    lcd_veri(0x0C);
    delayms(10);
}

void lcd_imlec_var(void)
{
lcd_veri(0x0F);
    delayms(10);
}



main.c

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include  "stm32f4xx_adc.h"
#include   "lcd.h"
#include  "Delay.h"



int main(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
   SystemInit();



lcd_init();
lcd_yaz("lcd kontrol123");

    while(1)
    {


    }
}



lcd ye " lcd kontrol123"  yazdığımda  "fff"fffwwff333 " çıkıyor.bu konuda daha yeni olduğumdan sorunun  neyde kaynaklandığını anlayamadım pek.

Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: sseedat - 16 Aralık 2013, 00:59:53
Yukarda paylaştığım lcd örneğinin sorununu çözdüm
sorun  GPIO_Write....gibi ifadeleri   GPIOD->ODR ...; ile değiştirdiğimde sorun çözüldü

şimdilik lcd çalışıyor:)
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: mir_as82 - 16 Aralık 2013, 07:13:47
LCD te yazma programini kendiniz mi yazdiniz yoksa. Hazir kutuphane mevcut mu?

Kendiniz yazdiysaniz kodlari kisaca açıklar mısınız?
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: muhittin_kaplan - 16 Aralık 2013, 09:44:16
Alıntı yapılan: sseedat - 16 Aralık 2013, 00:59:53
Yukarda paylaştığım lcd örneğinin sorununu çözdüm
sorun  GPIO_Write....gibi ifadeleri   GPIOD->ODR ...; ile değiştirdiğimde sorun çözüldü

şimdilik lcd çalışıyor:)
Garip bir durum. Zaten kendiside onu yapıyor. (GPIO->ODR yi kütüphanenin içeriğinde yapıyor)
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: X-Fi - 16 Aralık 2013, 11:37:09
Sorunun temeli hız farkı ile alakalı  GPIO_Write() bir alt fonksiyondur. GPIO->ODR ise işlemcide register adresine karşılık gelir.

CMSIS tanımlamalarını direk veya kendiniz define tanımlayıp kullanırsanız. GPIO_Write() fonksiyonundan daha az kod üretilir.
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: matador - 16 Aralık 2013, 15:44:19
Keilde pwm kullanımıyla uğraşıyorum anlamadığım bir şey var. Hazır örneklerde ki kodun noktası virgülüne aynısını yazıyorum tek fark örnekte discovery üstünde ki ledlerin bağlı d12,d13,d14,d15 bitleri kullanılmış ben bunlar yerine c12,c13,c14,c15 bitlerini kullanmak istiyorum tek yaptığım hazır koddaki "D" leri "C" yapmak ama çalışmıyor. Atladığım bir yer mi var?

void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* TIM4 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Connect TIM4 pins to AF2 */ 
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource13, GPIO_AF_TIM4);
}

void pwm()
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / 21000000) - 1;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 2099;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM4, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM4, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OC3Init(TIM4, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM4, ENABLE);

  /* TIM4 enable counter */
  TIM_Cmd(TIM4, ENABLE);
}
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: sseedat - 16 Aralık 2013, 17:11:44
Alıntı yapılan: mir_as82 - 16 Aralık 2013, 07:13:47
LCD te yazma programini kendiniz mi yazdiniz yoksa. Hazir kutuphane mevcut mu?

Kendiniz yazdiysaniz kodlari kisaca açıklar mısınız?

Merhaba Coocox Ide de hd44780 driver bulunmakta  isterseniz kullanabilirsiniz.Fakat coocox un yazılımı karışık geldi ondan kendim yazdım.

kullandığım yazılımın tamamı, pin bağlantılarını  belirledim;

-lcd'nin RS adlı bacağı  STM kitinin B portunun 4. pinine bağlı
-E bacağı B portunun 5. pinine bağlı
-R/W bacağını toprağa verdik :)
-VCC kaynağını kit üzerindeki +5v bacağından besledik
-VSS/GND yine kit üzerindeki GND pinine bağladık
-Lcd veri ilteme portunu kitin D portu ile sağlıyoruz(GPIOD'nin 0,1,2 ve 3. bacaklarına bağladık)
GPIOD_pin0---->lcdPort_D4
GPIOD_pin1---->lcdPort_D5
GPIOD_pin2---->lcdPort_D6
GPIOD_pin3---->lcdPort_D7   şeklinde

Bağlantılar bu şekilde.
Lcd ye veri gönderirken 8 bit olarak değil de 4 bit olarak gönderiyoruz(4 bacak az kullandık fakat veri iletim hızını da 2 kat düşürmüş olduk:))


  Şimdi lcd için yazdığımız kaynak dosyaları yazalım;

lcd.h dosyası;

extern void lcd_init(void);
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);

lcd.c dosyası;

#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx.h"
#include "lcd.h"
#include "Delay.h"


/*Lcd RS pin GPIOB pin 4
*Lcd E pin GPIOB pin 5
*Lcd Data port GPIOD(pin 0,1,2,3)
*
*
*/
    GPIO_InitTypeDef lcd_port;

void lcd_init()
{

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    //GPIOB
    lcd_port.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
    lcd_port.GPIO_Mode=GPIO_Mode_OUT;
    lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
    lcd_port.GPIO_OType=GPIO_OType_PP;
    lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB,&lcd_port);

    //GPIOD

    lcd_port.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
    lcd_port.GPIO_Mode=GPIO_Mode_OUT;
    lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
    lcd_port.GPIO_OType=GPIO_OType_PP;
    lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD,&lcd_port);

    GPIO_ResetBits(GPIOB,GPIO_Pin_4 | GPIO_Pin_5);
    GPIO_ResetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

    delayms(20);

    GPIO_SetBits(GPIOB,GPIO_Pin_5);

    lcd_veri(0x03);
    lcd_sil();
    lcd_veri(40); 
    lcd_veri(15); 
    lcd_veri(0x06);
    lcd_sil();       
    lcd_veri(128);

}

void lcd_veri(unsigned char veri)
{
   GPIO_ResetBits(GPIOB,GPIO_Pin_4);
   GPIO_SetBits(GPIOB,GPIO_Pin_5);
    delayms(10);

     GPIOD->ODR =(veri & 0xF0)>>4; 
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
     delayms(1);
     GPIO_SetBits(GPIOB,GPIO_Pin_5);
      delayms(1);

       GPIOD->ODR=((veri & 0x0F));   
      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
      delayms(10);
}

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)
{
    delayms(10);
    while(*lcd_data)  yaz(*lcd_data++);
}

void yaz(unsigned  dat)
{
     GPIO_SetBits(GPIOB,GPIO_Pin_4);
     GPIO_SetBits(GPIOB,GPIO_Pin_5);
     delayms(10);

    GPIOD->ODR = (dat & 0xF0)>>4;
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
     delayms(1);
     GPIO_SetBits(GPIOB,GPIO_Pin_5);
     delayms(1);

    GPIOD->ODR = ((dat & 0x0F));
     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
void lcd_sil(void)
{
    lcd_veri(1);
    delayms(10);
}

void lcd_imlec_yok(void)
{
    lcd_veri(0x0C);
    delayms(10);
}

void lcd_imlec_var(void)
{
     lcd_veri(0x0F);
    delayms(10);
}

Kullandığımız Geçikme fonksiyonu;

Delay.h
extern void delayms(unsigned long Bekle);
extern void delayus(unsigned long Bekle);

Delay.c



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//         Kullanılışı;
//         Delay_ms(100);   // 100 msn Bekle.
//         Delay_us(100);   // 100 usn Bekle.
//         Not CPU OSC = 168 mhz - 210 MIPS

#include "Delay.h"

void delayms(unsigned long Bekle)
{
    Bekle = Bekle * 21008;    // mSn ye ye çevirdik. OSC 168Mhz de uçuyor.
    while(Bekle>0){Bekle--;}
}

void delayus(unsigned long Bekle)
{
    Bekle = Bekle * 21;    // uSn ye ye çevirdik. OSC 168Mhz de uçuyor.
    while(Bekle>0){Bekle--;}
}

main.c

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include  "stm32f4xx_adc.h"
#include   "lcd.h"
#include  "Delay.h"



int main(void)
{
    GPIO_InitTypeDef ledPort;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
ledPort.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
ledPort.GPIO_Speed=GPIO_Speed_25MHz;
ledPort.GPIO_Mode=GPIO_Mode_OUT;
GPIO_Init(GPIOD,&ledPort);
   SystemInit();



lcd_init();
lcd_yaz("*****2*16 Lcd****");
lcd_git(2,1);
lcd_yaz("Hello World!!!!");
GPIO_SetBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);


    while(1)
    {

    }
}
Başlık: Ynt: STM32F4 Std_LIB Kullanımı (Örnek)
Gönderen: sseedat - 16 Aralık 2013, 17:23:08
Alıntı yapılan: X-Fi - 16 Aralık 2013, 11:37:09
Sorunun temeli hız farkı ile alakalı  GPIO_Write() bir alt fonksiyondur. GPIO->ODR ise işlemcide register adresine karşılık gelir.

CMSIS tanımlamalarını direk veya kendiniz define tanımlayıp kullanırsanız. GPIO_Write() fonksiyonundan daha az kod üretilir.

Hocam
GPIO_Write() kullanımını Debug ederek incelemeye çalıştım fakat nedense istediğim gibi olmadı mesela  GPIO_Write(GPIOD,0xf00000000); değerini yazdığımda 0x00000001 şeklinde register değişimi oluyordu fazla kurcalamadım bende olduğu gibi bıraktım :)
 
  Eğer sorun hız ise GPIO_Write() lcd ye veriyi sağlıklı yollamayacak kadar yavaş mı çalışıyor?