Arm'a ilk adım User butonuyla rastgele Led

Başlatan serhat1990, 23 Mart 2012, 19:26:19

serhat1990

#include "STM32F4xx.h"             // kullandıgımız çipin kütüphanesi yüklenir.
void SystemInit()                //sistem ayarlarının yapıldığı fonksiyondur ( Bu fonksiyon Bülent Hocanın Yazılımından Alınmıştır. Kendimiz tam manasıyla                 öğrenene kadar hazır fonksiyonu kullanacağız ) 
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 çıkış ledler bu pinlerde baglı
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 

//_------------------------------------------------------------------------------------------------------------------------


void delay()            //BEKLEME FONKSİYONU
{
   unsigned int i;         
   for(i=0;i<9000000;i++);   //i=0 dan 900000 'e kadar burada dön.
}

int main()

{
unsigned int i;	 		//i degiskeni tanımlanıyor.
unsigned char a=0; 		//a adında bir bytelik bir degisken tanımladık :)
	while(1)  		//sonsuz döngüye giriliyor.

	{
		i=i+1000;			// program içinde sürekli arttır.... 
		if( GPIOA->IDR & 0x00000001 )	  //butona basılınca
		{
		for(a=0;a<3;a++)   //3 kere işlemleri tekrarla
		{
		GPIOD->ODR = i ;	//i degiskenini d portuna ata...
		delay(); 			//bekle
		GPIOD->ODR = 0x00000000 ;	//0 degerini d portuna ata... 
		delay();			//bekle
		}
		}
	if(i==0x00010000){i=0;}	//i degerinin sınırlaması yapılıyor...
	}
}