STM32F-Discovery örnek temel programlar

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

z

Keilde F11 ile adım adım koşturularak çalıştırılacak yanıp sönen led programı  (OSC vs ayarlaması yok)

Bu başlık altındaki örnekleri kolay anlamak için HARD dokumanın 49..53 sayfalarını print edin.

#include "STM32F4xx.h"
 
void SystemInit()
{
    (*((int*)0xE000ED88))|=0x0F00000;  // Floating Point donanımını aktifleştir. !!! Başımızın derdi !!!
    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 cikislari en yuksek hizda kullanacagiz 
} 
 
int main()
{
    while(1)
   {
     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     GPIOD->ODR= 0x00000000;     // Ledler sonsun
   } 
}

// Programın sonudur.

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

z

#1
User butonuna basıldığında ledleri yakan basılmadığında ledleri söndüren program

CPU 8 Mhz Xtal OSC ile 168Mhz de koşuyor. 
AHB frekansı 168 Mhz
APB1 frekansı 42 Mhz
APB2 frekansı 84 Mhz

#include "STM32F4xx.h"

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 = 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ın sonu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#2
Ledleri flash eden program

CPU 8 Mhz Xtal OSC ile 168Mhz de koşuyor. 
AHB frekansı 168 Mhz
APB1 frekansı 42 Mhz
APB2 frekansı 84 Mhz

#include "STM32F4xx.h"

void SystemInit()
{
//  Yukarıdaki örnek programdaki kodların aynısı
}

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();
      } 
}
// Programın sonu.

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

z

#3
Timer 7 kullanarak Ledleri flash eden program (Interrupt kullanılmıyor)

CPU 8 Mhz Xtal OSC ile 168Mhz de koşuyor. 
AHB frekansı 168 Mhz
APB1 frekansı 42 Mhz
APB2 frekansı 84 Mhz
Timer7 içeriği gözlenerek ledler yakılıp söndürülüyor

#include "STM32F4xx.h"

void SystemInit()
{
//  Yukarıdaki örnek programdaki kodların aynısı
}

int main()
{
    RCC->APB1ENR|=0x00000020; // Timer7 CLK'u aktif edelim (42 Mhz)
    TIM7->CR1=0x0080;              // Otomatik Reload
    TIM7->PSC =42000-1;           // Prescaler değerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 42E6 / (42000) = 1000 Hz
    TIM7->ARR =1000;                // Counter, Decimal 1000 olunca basa donsun 1 sn demek
    TIM7->CR1|=0x0001;            // Counter Enable
 
    while(1)
      {
         if (TIM7->CNT > 500) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;                            // Ledler sonsun
      } 
}
// Programin sonu


Not: Programda kurulan mantığa göre ledlerin saniyede 1 kez yanıp sönmesi gerekiyor.
Fakat saniyede 2 kez yanıp sönüyor. Hatanın sebebi henüz belli değil.

CPU, AHB ve APB Bus frekanslarını yeni baştan gözden geçirmek gerekecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#4
GPIO pinlerinde alternatif fonksiyonları kullanmak

Bir önceki Timer7 programında ledlerin yanıp sönme hızının beklenenden 2 kat fazla olduğu gözlenince akla gelen sorulardan birisi acaba
PLL ayarlarını yanlış yaptık da çevrebirimleri olması gerekenden 2 kat hızlı mı koşuyor oldu.

Bu programda MCO2 pininden SYSCLK sinyalini çıkartıp osiloskop ile frekansını ölçeceğiz.
Rehber Sayfa 85 de SYSCLK ve MCO2 yi inceleyin.

CPU 8 Mhz Xtal OSC ile 168Mhz de koşuyor.  (Acaba)
AHB frekansı 168 Mhz (Acaba)
APB1 frekansı 42 Mhz (Acaba)
APB2 frekansı 84 Mhz (Acaba)

// Programın başı

#include "STM32F4xx.h"

void SystemInit()
{
//  Yukarıdaki örnek programdaki kodların aynısı
}

int main()
{
//  MOC2 pininden SYSCLK cikacagiz
    RCC->CFGR &= 0x07FFFFFF;         // 31,30,29,28,27 nolu bitleri silelim (Aslinda zaten 0)  (Prescaler degerinide silelim)
    RCC->CFGR |= 0x30000000;   // MCO2 prescaler /4 secildi

//  Hard sayfa 46 dan MCO2 nin GPIO C9 pini oldugu tespit edildi
//  http://img263.imageshack.us/img263/4633/pinlistesi.jpg dan PC9 un bos pin oldugu teyid edildi
//  PC9 a hangi alternatif fonksiyon atanacağını bulalım  (Hard Sayfa 50 den MCO2 nin AF0 oldugu goruldu)

    GPIOC->AFR[1] &= ~0x000000F0;  // 7,6,5,4 nolu bitler silindi 
//  Keil yada ST yukarıdaki registeri neden structure içinde array tanımlamış anlamadım,
//  Halbuki diğer regler gibi yapabilirdi (header dosyayı değiştirmek istemiyorum ama istersek yapabiliriz)

    GPIOC->OSPEEDR =  0xFFFFFFFF;  // GPIOC nin tum cikislarinı en yuksek hizda kullanacagiz

// GPIOC de 9 nolu pine ait cikisi alternatif fonksiyon secelim

    GPIOC->MODER =  0x00080000;    // Bit 19=1 ve Bit 18=0 yaparak pinin alternatif fonksiyon olmasini sagladik


    while(1)
      {
      }
}

// Programın sonu

MCO2 pini (PC9) scopla gözlendi ve 42Mhz ölçüldü. MCO2 prescaler 4'e set edildiğindenö SYSCLK frekansımızın 4x42=168Mhz oldugu anlaşıldı.
Burda hata olsaydı yanlışlıkla overclock yapmış ve bir ihtimal sistemi 336Mhz ile besleyebilirdik.

Neden prescalerı 1 yapmadıkda 4 yaptık?  Dokümanlarda, GPIO lardan 100Mhz den yüksek frekansda sinyal çıkamazsınız deniyor.

SYSCLK 168Mhz buna rağmen Timer7 örneğindeki ledler 1 sn yerine 0.5 sn de yanıp sönüyorsa, olası durumlar;

1. APB1 BUS'ı 42 yerine 84Mhz ile besledik.
2. Timer Clk kaynağı APB1 BUS clk dan beslenmiyor.
3. Timer programında mantık hatası yapıyorum.

Sonuç: Timer7 programındaki hatayı hala bulamadık. Fakat bu program sayesinde alternatif fonksiyon kullanımını görmüş olduk.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#5
Timer 7 Programındaki hatanın sebebi

Bir önceki Timer7 programında ledlerin yanıp sönme hızının beklenenden 2 kat fazla olduğunu gözleyince Timer7 nin CLK frekansını 2 kat yüksek olmasına neden olacak BUS frekans hatta CPU CLK (SYSCLK) ayarlamalarını yanlıs yaptığımdan şüphelenmiştim. Ancak MCO2 pininden SYSCLK sinyalini gözetledik ve frekansının doğru şekilde 168Mhz olduğunu ispatladık. Geriye
http://www.cncdesigner.com/STM/Chip.JPG den TIMER7 nin bağlı olduğu APB1 BUS'ının iki kat yüksek frekansla beslendiği ihtimali kaldı. Fakat SystemInit kodlarında prescaler değerlerinin de doğru olduğu anlaşıldı. Bunun üzerine Rehber dokumanı karıştırırken Sayfa 86 daki şu açıklama dikkatimi çekti.

The timer clock frequencies are automatically set by hardware. There are two cases:
1. If the APB prescaler is 1, the timer clock frequencies are set to the same frequency as that of the APB domain to which the timers are connected.
2. Otherwise, they are set to twice (×2) the frequency of the APB domain to which the
timers are connected.

Neticede diyorki;

Eğer APB prescaler 1 değilse Timerlar bağlı oluğu APB BUS frekansından 2 kat yüksek frekansla saydırılır.

(APB1 için prescaler değerimiz 4 dü. O halde Timer7 ye 42 değil 84Mhz giriyor.)

Bu durumda ledlerimiz neden 1 sn yerine 0.5 saniyede yanıp sönüyor anlaşılmış oldu. Sözkonusu durumu artık aşağıdaki gibi çözeceğiz.

Timer 7 kullanarak Ledleri flash eden program (Interrupt kullanılmıyor)

CPU 8 Mhz Xtal OSC ile 168Mhz de koşuyor. 
AHB frekansı 168 Mhz
APB1 frekansı 42 Mhz
APB2 frekansı 84 Mhz
Timer7 içeriği gözlenerek ledler yakılıp söndürülüyor

// Programın başı

#include "STM32F4xx.h"

void SystemInit()
{
//  Yukarıdaki örnek programdaki kodların aynısı
}

int main()
{
    RCC->APB1ENR|=0x00000020; // Timer7 CLK'u aktif edelim (84 Mhz)
    TIM7->CR1=0x0080;                 // Otomatik Reload
    TIM7->PSC =42000;                 // Prescaler değerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (42000) = 2000 Hz
    TIM7->ARR =2000;                   // Counter, Decimal 2000 olunca basa donsun 1 sn demek
    TIM7->CR1|=0x0001;                // Counter Enable

    while(1)
      {
         if (TIM7->CNT > 1000) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;                            // Ledler sonsun
      }
}
// Programin sonu

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

z

#6
Timer 7 ve interrupt kullanarak yanıp sönen led programı

// Programın başı

#include "STM32F4xx.h"
 
void SystemInit()
{
//  Yukarıdaki örnek programdaki kodların aynısı
}
 
void TIM7_IRQHandler()
{
volatile short i;
static char LedFlag=0;
 
    TIM7->SR=0;                                        // Timer Int Flagý silelim 
    LedFlag=(LedFlag+1)&1;
    if (LedFlag) GPIOD->ODR= 0x0000F000;     // Ledler yansin
    else GPIOD->ODR= 0x00000000;              // Ledler sonsun
} 

int main()
{
    RCC->APB1ENR|=0x00000020;         // Timer7 CLK'u aktif edelim (84 Mhz)
    TIM7->CR1=0x0080;                      // Otomatik Reload
    TIM7->PSC =42000-1;                   // Prescaler deðerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (42000) = 2000 Hz
    TIM7->ARR =1000;                        // Counter, Decimal 1000 olunca basa donsun 0.5 sn demek
    TIM7->DIER=0x0001;                     // Update Int enable
    NVIC->ISER[1] = 0X00800000;        // NVIC de Timer 7 interrupta izin verelim
    TIM7->CR1|=0x0001;                    // Counter Enable
    
   while(1)
      {
      } 
}
// Programin sonu
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#7
PC monitötünü STM32F Discovery kitimize bağlamak

Şu ana kadar öğrendiğimiz bilgileri özetlersek;

Çipin CLK üretim ünitesini istediğimiz gibi programlayabiliyoruz.
GPIO ları I/O Port olarak tanımlayabiliyoruz.
Timerları programlayabiliyor ve int ürettirebiliyoruz.
NVIC interrupt kontrol ünitesini programlayabiliyoruz.

Bu tecrübeler PC monitörünü ARM kitimize bağlamak için yeterli. 











Programa karakterlere ait pixel bilgilerinden olusturulmus tabloyu eklemedim. Tablo olusturmak isterseniz karakter desenleri   http://bytecollector.com/archive/mark_8/My_Mark-8_Info/DigitalGroupPacket/M6570.pdf dokümanının 7 sayfasından mevcut.

Bu tablo olusturulur ve verdigim ornek kodlar modifiye edilirse program ise yarayabilir.

Monitörün STM32F - Discovery kitimize bağlantısı için 15 pin VGA dişi konnektöre ihtiyacımız var. Ben eski bir VGA kartından söktüm. Bağlantı için sadece 4 kablo yeterli.

Konnektörün   1 numarası seri 100 Ohm üzerinden kitimizin D12 pinine,
Konnektörün   5 numarası  kitimizin Gnd pinine,
Konnektörün 13 numarası  kitimizin D13 pinine,
Konnektörün 14 numarası  kitimizin D14 pinine.

Kodlari indirmek icin: http://www.cncdesigner.com/STM/VIDEO.rar

Kitimizde ARM çipimizin GPIOD pinlerine kart üzerindeki ledler baglı. Monitor için sinyaller, ledlere giden pinlerden alındı. Haliyle bu sinyallerin çıktığı pinlere çok yüklenilmiş durumda. Buna rağmen elde edilen görüntü idare eder. Görüntü elde edince de monitor sinyallerini boştaki pinlerden alma yoluna gitmedim.

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



Programı yeni baştan yazdım ve bunun sonucu öncekinden daha iyi. Ayrıca karakter jenaratörü de eklendi.

Programın kaynak kodu için: www.cncdesigner.com/STM/CRT.rar

Monitör bağlantıları  GPIOD 8-9-10 dan alındı. (8 Video), (9 HS), (10 VS)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#8
System Tick Counter kullanarak 1ms lik int uretmek

Alıntı Yap
#include "STM32F4xx.h"

#define STK_CTRL (*((volatile unsigned int*) 0xE000E010)) 
#define STK_LOAD (*((volatile unsigned int*) 0xE000E014)) 
#define STK_VAL   (*((volatile unsigned int*) 0xE000E018)) 

/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansý 168 Mhz
         APB1 frekansý 42 Mhz
         APB2 frekansý 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 = 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
}

/*****************************************************************************************************
     STS TICK COUNTER AHB FREKANSINDA (168 MHZ) KOSACAK
*****************************************************************************************************/
void SysTickInit()
{
     STK_LOAD= 0X00029040>>1; // 168E6/1000/2=168000 TICK TIME 1MS
     STK_CTRL&=~0x00010000;   // Count Flagi silelim,
     STK_CTRL|= 0x00000007;   // int enb ve count enb yapalim, clk kaynagini AHB yapalim 
}

void SysTick_Handler()
{
volatile static int flag=0;
     STK_CTRL&= ~0x00010000; // Count Flagi silelim
     flag^=0xF000;
     GPIOD->ODR= flag;       // LEDLER yansin
}

int main()
{
     SysTickInit();
     while(1)
        {
   
        }
}

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

z

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

EmaNet

Konuyu bölmek gibi olmasın ama PC monitötünü STM32F Discovery kitimize bağlamak isimli uygulamada STM32F407VG ARM yerine STM32VL DISCOVERY kit kullansak olur mu?

z

Sözkonusu programda video sinyali hiç bir donanım kullanılmadan tamamen yazılımla üretiliyor. Bu ise ancak yüksek işlemci hızıyla mümkün.
Bu nedenle 268Mhz de koşan işlemcilerde programı işletmek zorundasınız.

Daha düşük hızlı işlemcilerle deneme yapmak isterseniz yazılımı değiştirerek 1 satırdaki karakter sayısını azaltmanız gerekir. Ancak karakterleriniz anormal şekilde şişman görüleceklerdir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#12
STM32F Discovery kitimizle bir başka video uygulamasının anlatım ve kaynak kodlarına http://www.mcu-turkey.com/?p=20659&preview=true&preview_id=20659&preview_nonce=9be3fc4e75 linkinden ulaşabilirsiniz.

Bu yazıda, monitörlerin çalışma prensibi, farklı bir yaklaşımla ele alınmış, video sinyali, senkron palsları gibi kavramlar üzerinde de durulmuştur.

Ayrıca monitörü, 720x400 70Hz modunda kullanmak için hangi hesaplamaların yapıldığına değinilmiştir.

Bu monitör uygulaması, daha öncekilerden farklı olarak, gif animasyonlardaki gibi animasyon yapmakta ilave olarak animasyonu döndürebilmektedir.

http://www.mcu-turkey.com/wp-content/uploads/2011/11/Video.wmv

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

z

#13
"Memory"den "Memory"e DMA kullanarak veri transferi yapmak

Örnek programda Source[1024] array içine veri doldurulmakta daha sonra bu veriler DMA marifetiyle Target[1024] array içine taşınmaktadır. (Interrupt kullanılmamıştır.)

#include "STM32F4xx.h" 
 
char Source[1024];
char Target[1024];
 
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 = 0x07402584;        // PLL katsayilarini M=4, N=150, P=2 ve Q=7 yapalim   150 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 |= 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 
} 
 

int main()
{
volatile int i;
 
    RCC->AHB1ENR |= 0x00400000;       // DMA2 clock'u aktif edelim 
 
    while(DMA2_Stream0->CR&1);    // DMA 0 kanalinin isi varsa bitmesini bekleyelim
    DMA2_Stream0->PAR=(int)&Source[0];  // Source array dan datalari alacagiz
    DMA2_Stream0->M0AR=(int)&Target[0];  // Target array a datalari tasiyacagiz
    DMA2_Stream0->NDTR=1024;    // 1024 adet veri tasiyacagiz
    DMA2_Stream0->CR=0x00A00680;
 
    for(i=0;i<1024;i++) Source[i]=i;  // Source alanina datalarimizi koyalim
 
    DMA2_Stream0->CR|=1;     // Transferi baslat
 
// Artik biz kendi yolumuza DMA kendi yoluna 
 
   for(i=0;i<0x100000;i++);
 
    while(DMA2_Stream0->CR&1);    // DMA2 0 kanalinin isini bitirmediyse bekleyelim
      {
      }   
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#14
STM32F407 RNG modülü ile random sayı üretmek

RNG modülü ile random sayı üretmek oldukça basit bir işlem.  Donanım, analog olarak üretilen seed değerlerini LFSR registerine yüklenmekte ve random sayı üretmektedir. Üretilen sayı bazı kriterleri sağlıyorsa, sayı hazır flağını set etmekte ve bize sadece bu değeri okumak kalmaktadır.

#include "STM32F4xx.h" 
int Random[256];
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 |= 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 
} 
 
int main()
{
volatile int i,r;
    RCC->AHB2ENR |= 0x40;        // RNG modulunun clock'unu aktif edelim 
    RNG->CR=0x04;                    // RNG modulu calismaya basladin
  
    for(i=0;i<256;i++)                 // 256 adet random sayi uretilsin
     {
       while (!(RNG->SR&1));        // kullanilabilir sayi olusumunu bekle
       Random [ i ] = RNG->DR;
   }
   
    while(1); 
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com