STM32F-Discovery örnek temel programlar

Başlatan z, 22 Ekim 2011, 22:12:57

z

#15
Kit üzerindeki LIS302DL çipini (3 axis accelerometer) SPI modülü üzerinden kullanmak

Bu çalışmada interruptlar kullanılmamıştır.


#include "STM32F4xx.h"   
char x,y,z;   

void SystemInit()
{
unsigned int i;   
       (*((int*)0xE000ED88))|=0x0F00000; 
       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 |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim
       GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
       GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz

//  GPIOA da A7, A6, A5 pinleri, LIS302DL cipiyle haberlesmek icin SPI moduna alinacak   

       GPIOA->AFR[0]=0x55500000;         // SPI1 secelim (Rehber Sayfa 141), Hard Sayfa 49
       GPIOA->MODER|=0x0000A800;       // A7,A6,A5 Alternatif fonksiyon
       RCC->APB2ENR|=0x00001000;        // SPI1 clk enable   //   GPIOE3 pinini output tanimlayalim (LIS302DL SPI/I2C secimi)   
       GPIOE->MODER  = 0x00000040;      // GPIOE nin 3 nolu pini cikis tanimlandi
       GPIOE->OSPEEDR= 0xFFFFFFFF;     // GPIOE nin tum cikislari en yuksek hizda kullanacagiz
       GPIOE->BSRRL=0x0008;                // GPIOE3=1; LIS302DL CS=1   
       SPI1->CR1=0x00000B7F;               // SPI1 16 bit, master , fulldublex vs
       SPI1->CR2=0X0000;
}   

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 ?
       {
          Write(0x20,0x47);  // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable
          while(1)
            {
               who=Read(0x27); // Statusu ogrenelim. Kim hazir kim değil?
               if (who&1) x=Read(0x29);
               if (who&2) y=Read(0x2B);
               if (who&4) z=Read(0x2D);
            }
       }
      while(1);
}

Programda onemli bir hata var. Bunun icin asagidaki linki muhakkak okuyun. 
Programdaki hatayi, linki ziyaret ettikten sonra kendiniz duzeltirsiniz.

https://www.picproje.org/index.php/topic,35794.msg269243.html#msg269243
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#16
USART3 modulunu kullanarak 1 Start Bit, 8 Data Bit, 1 Stop bit, No Parity, 9600 Baud Asenkron haberlesme calismasi yapmak.


#include "STM32F4xx.h"   

/*********************************************************************************
   CPU frekansi 168Mhz
   AHB frekansi 84 Mhz
   APB frekansi 42 Mhz
*********************************************************************************/

void SystemInit()
{
unsigned int i;
    (*((int*)0xE000ED88))|=0x0F00000; 
    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 |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim
    GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

/*********************************************************************************

   USART3 modulunu kullanarak asenkron haberlesme
   Interrupt kullanilmamistir
   
*********************************************************************************/

void UsartInit()
{
//   USART3 MODULUNU AKTIF HALE GETIRELIM
   
   RCC->APB1ENR|=0x00040000;      // USART3 Clk Enable (Rehber Sayfa 113)
   RCC->APB1RSTR|=0x00040000;      // USART3 Resetlendi
   GPIOB->AFR[1]=0x07777700;             // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
   GPIOB->MODER|=0x2AA00000;      // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)
   
//   USART3 MODULUNU AYARLAYALIM      // 1 Start, 8 Data, 1 Stop, No parity (Default degerler)

   RCC->APB1RSTR&=~0x00040000;      // USART3 Reseti kaldiralim
   USART3->SR&=~0X03FF;                 // Status registeri silelim
   USART3->BRR=0X1112;            // 9600 Baud
   
   USART3->CR1|=0x0000200C;              // USART3 enable
}

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

char WaitChar()
{
   while(!(USART3->SR&0x20));      // RX Buffer bos ise bekle (Rehber Sayfa 646)
   return(USART3->DR);
}   
   
int main()
{
    UsartInit();   
    SendChar(0x1B);
    WaitChar();
    while(1);   
}


Bundan sonraki asamada ornek programlarda interrupt kullanimina agirlik verecegiz. Register atamalarinda okunurlugu artirmak adina C yi daha etkin kullanacagiz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#17
USART3 modülünü kullanan (9600, 8, N, 1Stp) alım işlemini interrupt rutini üzerinden gerçekleştiren program örneği


#include "STM32F4xx.h"

unsigned char WAdr,RAdr;
char RxBuf[128];

/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/

void SystemInit()
{
unsigned int i;
      (*((int*)0xE000ED88))|=0x0F00000; 
      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 |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim
      GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
      GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

/*********************************************************************************
      USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor)
*********************************************************************************/

void USART3_IRQHandler()
{
volatile int Sts;
     Sts=USART3->SR;
     RxBuf[WAdr]=USART3->DR;
     WAdr=(WAdr+1)&0x7F;
}

void UsartInit()
{
     WAdr=0;RAdr=0;

// USART3 MODULUNU AKTIF HALE GETIRELIM

      RCC->APB1ENR|=0x00040000;  // USART3 Clk Enable (Rehber Sayfa 113)
      RCC->APB1RSTR|=0x00040000;  // USART3 Resetlendi
      GPIOB->AFR[1]=0x07777700;  // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
      GPIOB->MODER|=0x2AA00000;  // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)

// USART3 MODULUNU AYARLAYALIM  // 1 Start, 8 Data, 1 Stop, No parity (Default degerler)

      RCC->APB1RSTR&=~0x00040000;  // USART3 Reseti kaldiralim
//      USART3->SR&=~0X03FF;   // Status registeri silelim
      USART3->BRR=0X1112;    // 9600 Baud

      USART3->CR1|=0x0000202C;  // USART3 enable
      NVIC->ISER[1]|=0x80;         // NVIC da USART3 interrupta izin verelim
}

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++;
        } 
}

char DataReady()
{
       return(WAdr-RAdr);
}

char ReadChar()
{
char Dat;
   
      Dat=RxBuf[RAdr];
      RAdr=(RAdr+1)&0x7F;
      return(Dat);
}

// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir

int main()
{
int i;
      UsartInit();
      SendTxt("PicProje");
      SendChar(' '); 
      SendTxt("Bunalmis");

      for(i=0;i<0x1000000;i++);         // Laf olsun diye bekledik

      while(DataReady()) ReadChar();

      while(1);
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#18
DMA ile Ramdaki verileri USART3 den yollayan, USART3 den gelen verileri ise INT ile yakalayan program örneği

#include "STM32F4xx.h"

char RxBuf[128];
char TxBuf[128];
int cntr=0;
unsigned char WAdr,RAdr;

/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/

void SystemInit()
{
unsigned int i;
      (*((int*)0xE000ED88))|=0x0F00000; 
      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 |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim
      GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
      GPIOD->OSPEEDR= 0xFFFFFFFF;    // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

/*********************************************************************************
      USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor)
*********************************************************************************/

void USART3_IRQHandler()
{
volatile int Sts;
     Sts=USART3->SR;
     RxBuf[WAdr]=USART3->DR;
     WAdr=(WAdr+1)&0x7F;
     cntr++;
}

void UsartInit()
{
     WAdr=0;RAdr=0;

//    USART3 MODULUNU AKTIF HALE GETIRELIM

      RCC->APB1ENR|=0x00040000;    // USART3 Clk Enable (Rehber Sayfa 113)
      RCC->APB1RSTR|=0x00040000;  // USART3 Resetlendi
      GPIOB->AFR[1]=0x07777700;     // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
      GPIOB->MODER|=0x2AA00000;   // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)

//    USART3 MODULUNU AYARLAYALIM    1 Start, 8 Data, 1 Stop, No parity (Default degerler)

      RCC->APB1RSTR&=~0x00040000; // USART3 Reseti kaldiralim
      USART3->BRR=0X1112;               // 9600 Baud

      USART3->CR1|=0x0000202C;       // USART3 enable
      USART3->CR3|=0x80;                 // DMA Transfer Enable (Transmit)
      NVIC->ISER[1]|=0x80;                // NVIC da USART3 interrupta izin verelim
}

// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir

int main()
{
volatile int i;
      UsartInit();
      RCC->AHB1ENR |= 0x00200000;        // DMA1 clock'u aktif edelim
      RCC->AHB1RSTR|= 0x00200000;        // DMA1 resetleyelim
      for(i=0;i<0x1FF;i++);         
      RCC->AHB1RSTR&=~0x00200000;        // DMA1 reseti kaldiralim
      DMA1_Stream4->M0AR=(int)&TxBuf[0]; // Nereden okuyacagiz
      DMA1_Stream4->PAR=(int)&USART3->DR;// Nereye yazacagiz
      DMA1_Stream4->FCR&=~0xFFFFFF40;
      DMA1_Stream4->CR=(DMA1_Stream4->CR & 0xF0100000)| 0x0E000440;      // CH7 vs
      for(i=0;i<128;i++) TxBuf=i+1;   // Laf olsun diye tasinacak verileri olusturalim
      DMA1_Stream4->NDTR=50;             // 50 adet veri tasiyacagiz
      USART3->SR&=~0x40;                 // Rehberde boyle yapin deniyor fakat yapmasak da oluyor !!!!
      DMA1_Stream4->CR|=1;               // Transferi baslat 

//    Asagidaki while dongusune girdigimizde DMA, Ramdaki verileri USART'dan yollarken
//    CPU da int Data received anlamina gelen interrupt ile Usartdan verileri okur
//    ve circular buffera yazar.
//    Transferin bittigini interrupt ile ya da dogrudan
//    DMA1_Stream4->CR yada  DMA_HISR registerinden ogrenebilirsiniz.
      while(1);
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#19
Interrupt kullanarak yazılımsal PWM sinyalleri üretmek

Aşağıda 8 kanallı yazılımsal olarak PWM sinyal üreten örnek yazılım görülmektedir. RC Servo çalışması yapmak isteyenler için PWM peryodu  20 mili saniye seçilmiş olup her bir PWM  0..1000 aralığında değer alabilir. Programda değişiklik yapıp, PWM kanallarının sayısını dilediğiniz kadar artırabilirsiniz.

#include "STM32F4xx.h"
 
unsigned short PWM[8];  // PWM registerler
unsigned short SRG[8];  // Shadow Registerler
unsigned short CNTR;    // PWM Counter

/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/
void SystemInit()
{
unsigned int i;
     (*((int*)0xE000ED88))|=0x0F00000;  
     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
     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 |= 0x0000000F;     // GPIO A,B,C,D clock'u aktif edelim 
     GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
     GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 

     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =839;                 // 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
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     TIM7->CR1|=0x0001;              // Counter Enable
     
} 

 
void TIM7_IRQHandler()
{
unsigned short d,i,j;
 
    TIM7->SR=0;                       // Timer Int Flagini silelim 
    d=GPIOD->ODR & 0x00FF;
    CNTR++;
    if(CNTR>=1000)
      {
        CNTR=0;
        for(i=0;i<8;i++) 
         { 
           if(PWM[i]>1000) PWM[i]=1000;
           SRG[i]=PWM[i]; 
         }  
      }
    j=0x8000;
    for(i=0;i<8;i++)
      {
       if (CNTR>=SRG[i]) d|=j;
       j=j>>1;
      } 
    GPIOD->ODR=d;
} 

int main()
{
    
    PWM[0]=100;
    PWM[1]=200;
    PWM[2]=300;
    PWM[3]=400;
    PWM[4]=500;
    PWM[5]=600;
    PWM[6]=700;
    PWM[7]=800;
    
    while(1);
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#20
DAC kullanımı

STMF4 kartımızda  2 adet DAC bulunmaktadır. Bunlardan birincisini kullanmak için basit bir kod örneğimiz aşağıda. DAC için DMA ve interrupt kullanılmamıştır. Timer7 her 20 mikrosaniyede bir int çakarak işlemciyi döngüden çıkartıp CNTR değişkenini 1 artırmakta ve eğer 1024 olduysa sıfırlamaktadır. Daha sonrada CNTR değerini DAC a yüklemektedir.

#include "STM32F4xx.h"
 
int CNTR;

/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/
void SystemInit()
{
unsigned int i;
     (*((int*)0xE000ED88))|=0x0F00000;  
     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
     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 |= 0x0000000F;     // GPIO A,B,C,D clock'u aktif edelim 
     GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
     GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
   
//   DAC1 kullanacagiz

     GPIOA->MODER=0xA8000200;        // GPIOA4 Analog inp yapildi 
     RCC->APB1ENR|=1<<29;            // Artislik olsun (0x20000000 ile OR yap demek)
     DAC->CR=0x00000003;             // DAC1 ve Bufferi aktif edelim

//   Timer 7 ile calisalim
     
     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =839;                 // 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
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     TIM7->CR1|=0x0001;              // Counter Enable
} 

 
void TIM7_IRQHandler()
{
    TIM7->SR=0;                       // Timer Int Flagini silelim 
    CNTR++;
    CNTR&=0x3FF;
    DAC->DHR12R1=CNTR;
} 

int main()
{
    while(1);
}


Program, GPIOA4 den analog sinyal çıkartmaktadır. Ancak bu pin aynı zamanda kart üzerindeki digital çiplerden birisine daha gidiyor. Açıkcası digital bir pine analog sinyal girmek hiç hoş bir şey değil ama kısa süreli denemeler için başka çaremiz yok. Çünkü her iki DAC çıkışı da mevcut kart üzerinde alıkonulmuş durumda.

Bir sonraki programımızda şenlik var.  Amplifikatörlerinizi hazır edin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#21
GPIO Pinlerini INT pini olarak kullanmak

Ayni programi bir baska baslikta vermistik.

Program kart uzerindeki butona (GPIOA0 ile baglantili) basildiginda int uretmekte ve yesil ledi toggle etmektedir.

#include "STM32F4xx.h"

// FCPU =168Mhz
// FAHB =FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4

void SystemInit()
{
unsigned int i;
    (*((int*)0xE000ED88))|=0x0F00000;  
    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
    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 |= 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 
    RCC->APB2ENR|=0x4000;           // SYSCFG Enable
} 

void EXTI0_IRQHandler ()
{
    EXTI->PR|=0x00000001;           // EXTIO INT flagimizi silelim
    GPIOD->ODR^=0x00001000;     
} 

int main()
{
//  Butona basinca pinimiz H oluyor

    GPIOA->MODER&=~0x00000003;      // GPIO pin ancak inp modunda interrupt uretebilir (Rehber 143)
    SYSCFG->EXTICR[0]&=~0x0000000F; // GPIO A0 interrupt uretecek
    EXTI->RTSR=1;                   // Yukselen kenar tetiklemesi yapacagiz. (EXTI0)
    EXTI->FTSR=0;                   // Dusen kenar tetiklemesi istemiyoruz.  (EXTI0)
    EXTI->IMR=1;                    // EXTI0 Int enable (Rehber 202-203)
    EXTI->EMR=0;                    // Event istemiyoruz
    NVIC->ISER[0] = 0x00000040;     // NVIC EXTI0_IRQ interrupti acalim
    while(1);      
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#22
WAV Dosyasi dinlemek

STM32F4 Discovery kitindeki işlemcimizde iki tane DAC bulunmaktadır. DAC sayesinde sayısal verileri kolayca analog sinyallere dönüştürebiliyoruz. Bu yazımda wav uzantılı dosyaları seslendirmek için örnek program vereceğim. Bu program aynı zamanda DAC kullanımı için de bir örnek teşkil edecektir.

Bilgisayarınızdaki wav uzantılı dosya içeriğini doğrudan kaynak kodlar arasına ekleyeceğiz. Bunun için PC üzerinde koşturulan wav.exe adını verdiğim programdan yararlanacağız. Wav.exe programını çalıştırıp  Load butonuna basarak wav dosyasını yükleyin ve ardından Save tuşuna basın. Wav.c adıyla oluşan dosya doğrudan C program içinden kullanılabilecek formattadır. Bu dosyayı (wav.c) aşağıdaki programın bulunduğu proje klasörünüze kopyalayın ve projeyi derleyin.

Kit üzerinde koşacak program derlenirken, wav.exe programının ürettiği wav.c dosyası da derlenmektedir. Kitimizin PA4 pinindeki ses sinyalini, bu pine bağlayacağınız 1uf kapasitör üzerinden alıp doğrudan bilgisayarın ses kartının girişine yada bir amplifikatöre bağlayabilirsiniz.

wav.exe programi icin http://www.cncdesigner.com/STM/wav.rar

#include "STM32F4xx.h"
#include "wav.c"
 
/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/
void SystemInit()
{
unsigned int i;
     (*((int*)0xE000ED88))|=0x0F00000;  
     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
     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 |= 0x0000000F;     // GPIO A,B,C,D clock'u aktif edelim
     GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
     GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
 
//   DAC1 kullanacagiz
 
     GPIOA->MODER=0xA8000200;        // GPIOA4 Analog inp yapildi
     RCC->APB1ENR|=1<<29;            // Artislik olsun (0x20000000 ile OR yap demek)
     DAC->CR=0x00000003;             // DAC1 ve Bufferi aktif edelim
 
//   Timer 7 ile calisalim
 
     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =0;                   // Prescaler cikis frekansimiz 84Mhz
     TIM7->ARR =84000000/SampleRate; // Counter, Decimal 1 olunca basa donsun. 
     TIM7->DIER=0x0001;              // Update Int enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     TIM7->CR1|=0x0001;              // Counter Enable
} 
 
void TIM7_IRQHandler()
{
static int Indx=0;
 
    TIM7->SR=0;                       // Timer Int Flagini silelim
    if (Indx<NumOfData)
      {
        DAC->DHR12R1=Wav[Indx]<<4;
        Indx++;
      }
    GPIOD->ODR^=0xF000;
} 
 
int main()
{
     while(1);
}


Speech Synthesizer

0...999999 aralığındaki sayıları konuşan program. Ses verileri de içerdiğinden dolayı çok uzun olduğundan rar dosyası olarak veriyorum.

http://www.cncdesigner.com/STM/Ses_Sentez.rar
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#23
Konuşan Tavla Zarları 
Program  donanımsal Random Jenoratörü ile zar atmakta ve sonuçları konuşarak söylemektedir.Zar atmak için mavi butona basın.

#include "STM32F4xx.h"

char Soyle;
int  Sayi, EndAdr, Bekle, Indx;

char Wav[]={ // Bir üstteki Speech Synthesizer programindaki char Wav kısmın aynısıdır.
                    }

/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/

void SystemInit()
{
unsigned int i;
     (*((int*)0xE000ED88))|=0x0F00000;  
     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
     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 |= 0x0000000F;     // GPIO A,B,C,D clock'u aktif edelim
     GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
     GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
 
//   DAC1 kullanacagiz
 
     GPIOA->MODER=0xA8000200;        // GPIOA4 Analog inp yapildi
     RCC->APB1ENR|=1<<29;            // Artislik olsun (0x20000000 ile OR yap demek)
     DAC->CR=0x00000003;             // DAC1 ve Bufferi aktif edelim
 
//   Timer 7 ile calisalim
 
     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =0;                   // Prescaler cikis frekansimiz 84Mhz
     TIM7->ARR =84000000/8000;       // Counter, Decimal 1 olunca basa donsun. 8Khz
     TIM7->DIER=0x0001;              // Update Int enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
} 
 
void TIM7_IRQHandler()
{
 
    TIM7->SR=0;                       // Timer Int Flagini silelim
    if (Soyle)
      {
        DAC->DHR12R1=Wav[Indx]<<4;
        Indx++;
        if(Indx>EndAdr) Soyle=0;
      }
    else if(Bekle) Bekle--;
    GPIOD->ODR^=0xF000;
} 
 
void NefesAl()
{
    Bekle=6000;
}

char ZarAt()
{
int Zar;
     
     Zar=0;     
     while((!Zar) || (Zar>6))
       {
         while (!(RNG->SR&1));        // kullanilabilir sayi olusumunu bekle
         Zar = RNG->DR &0x0F;
       }  
     return(Zar);
}

void Sound(short N)
{
    while(Soyle|Bekle);
    switch(N) 
      {
        case    1:{ Indx=4620 ; EndAdr=7279;  break;}
        case    2:{ Indx=7280 ; EndAdr=10599; break;}
        case    3:{ Indx=11120; EndAdr=14999; break;}
        case    4:{ Indx=15000; EndAdr=18119; break;}
        case    5:{ Indx=18120; EndAdr=24419; break;}
        case    6:{ Indx=24420; EndAdr=28399; break;}
      }        
    Soyle=1;   
}

int main()
{
int Z1,Z2;
     
     Soyle=0;

     Indx=0;
     EndAdr=0;
     Bekle=0;
     
     TIM7->CR1|=0x0001;              // Timer Enable
     
     RCC->AHB2ENR |= 0x40;           // RNG modulunun clock'unu aktif edelim 
     RNG->CR=0x04;                   // RNG modulu calismaya basladin
  
     while(1)
       {
         Z1=ZarAt();
         Z2=ZarAt();
         while(!(GPIOA->IDR&1));
         Sound(Z1);     
         Sound(Z2);     
         while(GPIOA->IDR&1);
       }
}

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

z

#24
Kartın eğimiyle orantılı olarak ledleri yakmak

Aşağıdaki programda, kartı elinizle tutup eğdikçe ledler eğilen yonde ışıldıyo.

#include "STM32F4xx.h"
 
unsigned char PWM[8];  // PWM registerler
unsigned char SRG[8];  // Shadow Registerler
unsigned char CNTR;    // PWM Counter

/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/
void SystemInit()
{
volatile unsigned int i;
     (*((int*)0xE000ED88))|=0x0F00000;  
     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
     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 |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim 
     GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
     GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
//  GPIOA da A7, A6, A5 pinleri, LIS302DL cipiyle haberlesmek icin SPI moduna alinacak   
 
     GPIOA->AFR[0]=0x55500000;       // SPI1 secelim (Rehber Sayfa 141), Hard Sayfa 49
     GPIOA->MODER|=0x0000A800;       // A7,A6,A5 Alternatif fonksiyon
     RCC->APB2ENR|=0x00001000;       // SPI1 clk enable   //   GPIOE3 pinini output tanimlayalim (LIS302DL SPI/I2C secimi)   
     GPIOE->MODER  = 0x00000040;     // GPIOE nin 3 nolu pini cikis tanimlandi
     GPIOE->OSPEEDR= 0xFFFFFFFF;     // GPIOE nin tum cikislari en yuksek hizda kullanacagiz
     GPIOE->BSRRL=0x0008;            // GPIOE3=1; LIS302DL CS=1   
     SPI1->CR1=0x00000B7F;           // SPI1 16 bit, master , fulldublex vs
     SPI1->CR2=0X0000;
   
     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =839;                 // 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
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     TIM7->CR1|=0x0001;              // Counter Enable
     
} 
void TIM7_IRQHandler()
{
unsigned short d,i,j;
 
    TIM7->SR=0;                       // Timer Int Flagini silelim 
    d=GPIOD->ODR | 0xFF00;
    CNTR++;
    if(!CNTR)
      {
        for(i=0;i<8;i++) SRG[i]=PWM[i]; 
      }
    j=0x8000;
    for(i=0;i<8;i++)
      {
       if (CNTR>=SRG[i]) d&=~j;
       j=j>>1;
      } 
    GPIOD->ODR=d;
} 
signed char  SPI_CMD(short DAT)    
{
signed char RxDat;
      GPIOE->BSRRH=0x0008;      // LIS302DL CS=0
      RxDat=SPI1->SR;           // AMAC DELAY (kalmasinda fayda var)
      SPI1->DR=DAT;             // Komutu yukle
      while(!(SPI1->SR&0x01));  // RX BUF bos ise beklemede kal  
      while(SPI1->SR&0x80);     // BSY durumu varsa kalkmasini bekleyelim
      RxDat=SPI1->DR;           // Cipten gelen veriyi oku 
      while(SPI1->SR!=0x02);    // CS=1 yapmadan once cipin orjinal duruma donmeyi bekleyelim
      GPIOE->BSRRL=0x0008;      // LIS302DL CS=1
      return(RxDat);
}   
signed char Write(char Adr,unsigned char Data)
{
      return(SPI_CMD(((Adr&0x3F)<<8 )|Data));
}
signed char Read(char Adr)
{
      return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
}
      
int main()
{
int i;
signed char x[16];  // PWM registerler
signed char y[16];  // PWM registerler
signed char who,xo,yo, b;
signed short a;   
      
      if(Read(0x0F)==0x3B)       // Who are you ?
       {
          Write(0x20,0x47);  // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable
          while(!(Read(0x27)&1)); xo=Read(0x29);
          while(!(Read(0x27)&2)); yo=Read(0x2B);
          
          while(1)
            {
               who=Read(0x27);   // Statusu ogrenelim. Kim hazir kim değil?
               if (who&1) 
                {
      a=x[0];
      b=Read(0x29)-xo;
      for(i=15;i>0;i--){ x[i]=x[i-1]; a+=(signed short)x[i];}
      x[0]=b; a=a>>2;
                  if (a>=0) { PWM[0]=a; PWM[2]=0; }
                  else      { PWM[0]=0; PWM[2]=-a;}
                }  
    
               if (who&2) 
                {
      a=y[0];
      b=Read(0x2B)-yo;
      for(i=15;i>0;i--){ y[i]=y[i-1]; a+=(signed short)y[i];}
      y[0]=b; a=a>>2;
                  if (a>=0) { PWM[1]=a; PWM[3]=0; }
                  else      { PWM[1]=0; PWM[3]=-a;}
                }  
            }
       }
       
      TIM7->DIER=0x0000;              // Update Int disable
      while(1)
       {
         for(i=0;i<0x1000000;i++);
         GPIOD->ODR^=0x0000F000;
       }  
       
}


Programda onemli bir hata vardi (duzeltildi). Bunun icin asagidaki linki muhakkak okuyun. 

https://www.picproje.org/index.php/topic,35794.msg269243.html#msg269243

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

z

#25
PA0 ve PB2 pinlerini ext int pini olarak kullanmak

#include "STM32F4xx.h"

// FCPU =168Mhz
// FAHB =FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4


void SystemInit()
{
unsigned int i;
    (*((int*)0xE000ED88))|=0x0F00000;  
    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
    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 |= 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 
    RCC->APB2ENR|=0x4000;           // SYSCFG Enable
} 

void EXTI0_IRQHandler ()  // A0 int
{

    EXTI->PR|=1;                     // INT flagimizi silelim
    GPIOD->ODR^=0x00001000;     
} 

void EXTI2_IRQHandler ()  // B2 int
{

    EXTI->PR|=4;                     // INT flagimizi silelim
    GPIOD->ODR^=0x00002000;     
} 


int main()
{
       
    GPIOA->MODER&=~0x00000003;      // GPIO A0 pin Inp modunda
    GPIOB->MODER&=~0x0000003A;      // GPIO B2 pin Inp modunda
    
    SYSCFG->EXTICR[0]=0x00000100;   // A0 ve B2 intlar acildi 
    
    EXTI->RTSR=0x05;                // Yukselen kenar tetiklemesi yapacagiz. (EXTI0)
    EXTI->FTSR=0;                   // Dusen kenar tetiklemesi istemiyoruz.  (EXTI0)
    EXTI->IMR=0x05;                 // EXTI0 Int enable (Rehber 202-203)
    EXTI->EMR=0;                    // Event istemiyoruz
    NVIC->ISER[0] = 0x140;          // NVIC EXTI0_IRQ ve EXTI2_IRQ interrupti acalim
    
    while(1);
      
}

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