STM32F407VG - STM32F4 Discovery Deneme Kartı

Başlatan bunalmis, 12 Ekim 2011, 00:37:31

z

Bu başlık altındaki konular, soru cevap şeklinde https://www.picproje.org/index.php/topic,35794.0.html başlığında ele alınmaktadır.

Bu başlık, çipimizi ve Cortex mimarisini tanıtmak amacıyla açılmıştır. Giriş mahiyetindedir.

Kartımızda kullanılan STM32F407VG çipine ait dokumanların bulunduğu link: http://www.st.com/internet/mcu/product/252140.jsp  (Design Support) başlığında)

Deneme kartımızla ilgili dokumanların bulunduğu link: http://www.st.com/internet/evalboard/product/252419.jsp  (Design Support) başlığında)

STM32F-Discovery kartımızın şeması bu dokumanın içinde.

Çipimizin dokümanı bu.   Bu dokumana isim verelim ve bunun adı Hard olsun. Hard'a bakalım deyince bu dokuman akla gelsin. (DocID 022152 Rev1)

Fakat elimizden düşürmeyeceğimiz pdf dokuman bu.   (September 2011, Doc ID 018909 Rev1) Bu dokumandan sözederken, kolaylık olması açısından, bundan sonra bu dokumana Rehber diyeceğim. Sayfa numaraları vererek dokumana atıfta bulunduğumda Rehber pdf'in September 2011 Rev1 versiyonu anlaşılmalıdır. (ST, bu dokümanı zaman içinde revize edeceğinden yeni çıkacak pdf dokumanın sayfalarıyla  Rehber dokuman sayfaları arasında kaymalar oluşabilir.)

CM4 işlemcilerin komut kümesine ait link: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/CHDDIGAC.html

CM4 un kendi dokümanını buluncaya kadar NVIC gibi core ile ilgili anlatımları bu pdf den takip edeceğiz.
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/PROGRAMMING_MANUAL/CD00228163.pdf


Exceptionlarla ilgili

http://www.keil.com/appnotes/files/apnt209.pdf


********************************************************************************************

Rehber, oldukça karmaşık bir dokümandır. Bu karmaşıklığa bakıp sakın umutsuzluğa kapılmayın.

********************************************************************************************

ARM CM3 çiplerin genel özellikleri (Kitimiz üzerindeki STM32F4 icin değil genel konuşuyorum)

ARM işlemci denince dilimizin süçtüğünü varsayın, çünkü aslında Arm işlemci derken ARM Cortex M3 ve Cortex M4 (CM3 ve CM4) işlemcilerden bahsetiyoruz demektir. Zira ARM büyük bir ailenin genel adıdır.  CM3 ve CM4 serisi, Arm ailesinin ARM7 ferdinden türetilmiştir.

Risk tabanlı 32 bitlik bu işlemciler, yüksek hızlı olup, çok çeşitli çevre birimlerine, yüksek Ram ve Flash kapasitelerine sahiptir.
CM3 ve CM4 serisi microcontroller olarak geçmektedir. Ancak;

İstisnaları bir kenara bırakırsak, microcontrollerlar microprocessorlere kıyasla daha yeteneksiz CPU ünitesine sahip buna karşılık sayıca çok ve çeşitli çevre birimleri olan özel işlemcilerdir.

ARM Cortex serisi, microprocessor sınıfından CPU ünitesine sahiptir. Bu da ARM Cortex serisini diğer controller çiplere kıyasla bir başka özel yapar.

Clock kaynağı olarak, xtal yada dahili RC osc kullanabilir yada harici bir kaynaktan beslenebilir.

Güç tüketimini kontrol edebilmek için, çevre birimlerinin clock sinyalleri tamamen kapatılabilir. DMA ünitesi sayesinde bir adresden veya sıralı adreslerden okunan verileri alıp, bir başka adrese yada sıralı adreslere hiç cpu gücü kullanmadan taşıyabilir.

Interruptların birbirine göre önceliklerini tanımlamıza ve int rutininin bir başa interrupt ile kesilmesini de sağlayabilen işlemci mimarisi ve NVIC adı verilen ünite, interrupt ları kolayca yönetmemizi sağlar.

Cortex serisinin sahip olduğu I/O, ADC, DAC, Timer, PWM, I2C, SPI, UART vs çevre birimleri hem sayıca çok hem de oldukça esnek kullanıma sahiptirler.



Kartımızdaki çipin tüm pinlerini malesef dilediğimiz gibi kullanamıyoruz. Yukarıdaki tablodan reserv edilmiş pinleri öğrenebilirsiniz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#1
Kartımızı koruyalım.

Kartımızı doğrudan masa üstüne koyduğunuzda kartın aşağıya bakan pinheader bacakları doğrudan masaya dokunuyor.  Kartın bu vaziyette usb bağlantısı yapılırsa, çalışma masanızdaki tel yada lehim topu gibi iletken parçacıklar, pinheaderların pinlerini kısa devre ettiği takdirde kartınız hasar görebilir.

Böyle bir durumla karşılaşmamak için, aşağıdaki resimde olduğu gibi orjinal kutunun USB konnektörünün tam karşısını, maket bıçağıyla usb kablo konnektörünün ucu girecek kadar oyun.

Bu durumda usb kablosunu, kartı kutudan hiç çıkartmadan takıp çıkartabilirsiniz. 



Deneme kartımız hakkında


Kart, üzerinde demo programı yüklenmiş olarak geliyor ve enerjisi verildiğinde demo program koşmaya başlıyor.

Karta debug tarafindaki (resimde sağda) CN1 usb konnektürüne kabloyu taktığınızda  4 adet led  showa başlıyor.

Mavi şapkalı user butonuna bastığınızda demonun ikinci aşaması başlıyor ve karta eğim verdiğinizde 4 led eğime uygun şekilde kırpışmaya başlıyor.

Soldaki CN5 usb soketine de PC den gelen usb kabloyu takarsanız bu kez cursor hareket ediyormuş. (Kablom olmadığı için bunu deneyemedim)

http://www.youtube.com/watch?v=5FOnYS8ILDk

Karta yükleyeceğimiz ilk deneme programı ile birlikte bu demo programı silinecek. 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#2
Yanıp sönen led projesi

Keil örnekleri altında, STM32F Discovery kartı ve bu kart için yanıp sönen led proje örneği var.
Fakat bu örnek(ler),  C ve/veya STM32F4xx serisi çipleri bilmeyen birisinin anlayabileceği basitlikte değil.

Bu nedenle bu kodları bir kenara bırakacağız ve kodları yeni baştan yazacağız. Tüm kurs boyunca anlatımda en çok zorlanacağım konu kesinlikle yanıp sönen led projesi olacak. Eğer yanıp sönen led projesini anlarsanız daha sonraki projeleri çok kolay anlayacaksınız.

Şimdi ARM işlemciyi biraz yakından tanıyalım. (Tanımadan bu işler yürümez)



Öncelikle CPU nun çevresindeki birimlerle haberleştiği BUS (iletişim yolu) yapısına bakalım.

Yukarıdaki blok çizimde AHB olarak yeşil renkle çizilmiş Advanced High performans Bus en yüksek hıza sahip iletişim yoludur ve max frekansı 168Mhz dir. (Dokumanda 150Mhz den bahsedilen bir BUS daha var bu konuda bir hata olduğunu düşünüyorum)

APB1 ve APB2 ile adlandırılan BUSlar ise Advanced Peripheral Bus olarak bilinir. Bu bus AHB ye kıyasla daha yavaştır.

APB1 max frekansı 42Mhz

APB2 max frekansı 84Mhz

ARM işlemcimiz resetlendiğinde neler olur?

Hard 39 sayfasında Boot 0 ve Boot 1 pinlerini bulun.  Bu iki pinin ikili sistemde 4 kombinasyonu olabilir. (4 (3) Ayrı Boot tipi var))
Bizim kitimizde Boot 0 pini low, Boot 1 pini ise 1 seviyesindedir. Mevcut bu konfigurasyon, işlemcinin kodları Flash ROM'dan işletmeye başlayatağı anlamına gelir.

Diğer konfigürasyonlar üzerine bu aşamada hiç kafa yormayın.

Discovery kitindeki işlemcimiz resetlendiğinde, Boot0 ve Boot1 pinlerinin konumu gereği Flash rom 0x0800.0000 adresinden 0x800.0??? (Daha sonra kesinleştireceğim) a kadar adreslerdeki veriler aynen 0x0000.0000 adresine yansır. Yani bu adres aralığındaki veriler birbirinin aynı olur. Bu olaya mirror yada ReMap işlemi denir.

(Keil'de Project-> Option for Target "Target1" den Taget butonuna bastığınızda IROM1 kutusunun karşısında 0x0800.0000 yazmasının sebebi, Flash Romun başlangıç adresin 0x0800.0000 olmasındandır.)

İşlemcimiz sıradan bir CM3 işlemci olsaydı ReMap olayları olmayacaktı. Çünkü sıradan CM3 ler sadece tek bir boot seçeneğine sahiptir.

Neden böyle ReMap işi yapmışlar? Cevap: Arm mimarisinde Boot işlemi 0x0000.0000 da olur da ondan. Eğer işlemcimizin tek boot seçeneği olsaydı bu durumda ST firması Flash ROMu 0x0800.0000 a değil de 0x0000.0000 a yerleştirirdi.

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

Tamam işlemcimiz resetlendi ve Flash Rom, 0x0800.0000 da olmasına rağmen 0x0000.0000 dan da aynen okunabiliyor.

İşlemcinin SP (Stack pointer) registerine 0x0000.0000 .... 0x0000.0003 adreslerinde saklanan 32 bitlik veri donanımsal olarak yüklenir.

İşlemcinin PC (Program Counter) registerine donanımsal olarak 0x0000.0004..0x0000.0007 adreslerinde saklanan 32 bitlik adres yüklenir ve bu adrese sıçranır.

(Keil, Startup_stm32f4xxx.s dosyasını derlediğinde zaten bu değerler otomatik olarak flashın bu gözlerine yerleşecek şekilde kod üretimini sağlıyor.)

İşte tüm olay bu kadar. Bu işlem sonucunda Keil'de Deneme projemizde Startup_stm32f4xxx.s assembly programında Reset_Handler denen satırdan itibaren kodlarımız çalışmaya başlar. Normal şartlar altında bu dosyaya hiç müdahale etmeyeceksiniz. (Bu dosya ST yada Keil tarafından oluşturulur ve bizlerin kullanımına sunulur)

Flashın boot kodları İnterrupt vektörlerini, Reset Handler kodlarını ve Keil'in kendi fonksiyonlarının işleyebilmesi için gerekli düzenlemeleri sağlayan kodları içerir.

Nihayetinde Startup kodları SystemInit fonksiyonunu çağırır.
Bu kodlar işleyip bittikten sonra da C nin ana fonksiyonu olan main() çalışmaya başlar.

Şu ana kadar yazılanlardan hiç bir şey anlamadıysanız şu kadarını bilin.

1) ARM işlemci Reset ardından sırayla önce, Startup_stm32f4xxx.s dosyasındaki kodları koşturur.
2) SystemInit adındaki fonksiyonu koşturur.
3) main() fonksiyonunu koşturur.

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

Reset ardından çağrılan SystenInit fonksiyonunu, ARM işlemciyi şekillendirmeye yarar.

Örneğin işlemcimiz, Xtal ile çalışsın, GPIOA portu enable edilsin ve çıkış tanımlansın, CPU 168Mhz de koşsun vs vs.
SystemInit fonksiyonu donanıma özgü programları içerir ve bu sebepten dolayı alçak seviyelidir.

Yanıp sönen led projesini olabildiğince basit yazabilmek için SystemInit fonksiyonlarını da çok basit yazacağız.

SystemInit kodları, basit yazılsa ne olur karmaşık yazılsa ne olur?

Bu sorunun cevabını bilmeniz çok önemli. Çünkü cevabı, yazım şeklinde tercih yapmanızı, dolayısıylada sizin ARM hayatınızı şekillendirecektir.

Reset işlemi ardından çipin ne kadar registeri varsa hepsi tabiri yerindeyse fabrikasyon değerlerini alır.

SystemInit kodlarınızı bu varsayımla yazarsanız, daha açık ifadeyle, kodlarınız, sadece reset işleminden çıkılır çıkılmaz çalıştırılacak, daha sonra çalıştırılmayacak varsaysayımı ile yazarsanız yazılım sade olacaktır. Çünkü tüm registerler bilinen değerlere sahiptir. Size, Rehber dokumandaki register anlatımlarına göre registerlerin bitlerini set yada reset etme işi kalır.

Fakat bu şekilde yazacağınız kodları, gelişigüzel bir safhada çağırmaya kalktığınızda işlemcinin yada donanımın çakılması sorununu yaşayabilirsiniz.

Bu sorunun çözümü daha dikkatli yazım şeklini gerektirir. Daha önceden değer almış registerler donanım çalışırken bir anda ilk değerlere döndürülemez kademeli olarak döndürülmelidir. Bu tip registerlere en güzel örnek clock ayarlamalarının yapıldığı registerlerdir.

(Son konuya ait açıklamayı ben de beğenmedim. Bir ara tekrardan ele alacağım. Fakat şimdilik böyle kalsın)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#3
İşlemcinin Clock ayarlamalarının yapılması

SystemInit rutininde öncelikli ele alınması gereken konu, çipin clock kaynağının belirlenmesi, çalıştırmayı arzu ettiğimiz frekansların set edilmesi konularıdır.

ARM işlemciler reset ardından kod koşturmaya internal osc ile başlar. SystemInit rutininde çalışmaya internal osc ilemi Xtal ilemi devam edeceğimize karar veriririz

Rehber de sayfa 85 de clock donanımında HSE ve HSI terimlerini dikkat edin. HSI, High Speed Internal Clock anlamına gelir ve bunun 16 Mhz RC osilatörle üretildiğini görebilirsiniz.



Fakat biz işlemcimizi 16 Mhz dahili RC osilatör ile değil de kart üzerine takılı olan 8Mhz lik xtal kullanarak HSE (High Speed External Clock) ile elde edelim. Amaçlarımızdan birisi de işlemcimizi max clock frekansı olan 168Mhz de koşturmak olsun. Ayrıca, ihtiyaç duyulan CLOCK frekanslarını da mümkün olan en üst değere yani 168 Mhz'e set edelim.

Hard Sayfa 16 dan Ledlerimizin bağlı olduğu PORT D nin AHB1 BUSı kullandığını görebilirsiniz. O halde AHB1 BUSın aktif hale getirilmesi ve frekansının da istediğimiz değere set edilmesi gerekir. (ARM işlemcilerde işler böyle yürür.)

8Mhz den 168Mhz üretme işlemi PLL sayesinde gerçekleşir. 8Mhz yolunu (Kırmızı Yol) izlerseniz /M bölücüsüyle karşılaşırız.

PLL'in VCO girişinin 1..2Mhz aralığında olması isteniyor.

Bu durumda PLL e giren sinyalimiz  örneğin 2 Mhz olacaksa M değerini, 4 buluruz.

PLL yazan bloğa bakarsak burada N, P, Q gibi çarpan ve bölenler göreceğiz. Daha önceki PLL bilgilerimizden biliyoruzki VCO çıkışındaki sinyalin frekansı girişindeki sinyalin frekansının xN katıdır.

VCO çıkışındaki sinyal, /P değerine bölünmektedir. O halde ;

PLLCLK = (8/M)*(N/P) bağıntısıyla hesaplanır.

USBCLK = (8/M)*(N/Q) bağıntısıyla hesaplanır.

Bunu nerden çıkarttım? PLL bloğuna bakarak. (Fakat dokumanlardan birisinde bu bağıntı verilmiş olması lazım.)

O halde amacımız M, N, P ve Q değerlerini tespit etmek olacaktır.  M, N, P ve Q değerleri için üreticinin sınırlamaları vardır.

Sınırlamalar şunlardır. (Rehber Sayfa 95-96)

1.  VCO giriş frekansı 1..2Mhz aralığında olmalıdır.

2.  VCO çıkış frekansı 64...432 Mhz aralığında olmalıdır.

3.  USB sinyali (PLL48), tamı tamına 48 Mhz olmalıdır. Aksi halde USB calıstırılamaz. USB kullanmayacaksanız bu frekans 48 Mhz den büyük olamaz.

4.  N>1,  Q>1 ve P=2 veya 4 veya 6 veya 8 olmalıdır.

5.  AHB Frekansi 168 Mhz i asamaz.

6.  APB1 Frekansi 42 Mhz i asamaz.

7.  APB2 frekansi 84 Mhz i asamaz.

168 = (8/M)*(N/P)

48  = (8/M)*(N/Q)


N/(M*P)=21
N/(M*Q)=6

Q/P=3.5

P min 2 olabiliyor.

P=2 için Q=7

N/(M*2)=21 den N/M=42  buluruz.


VCO girişi 1...2 Mhz aralığına olduğuna ve 8 Mhz Xtal kullandığımıza göre M ya 4 yada 8 olabilir.

M=4 için N=168             
M=8 için N=336 bulunur. 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#4
GPIO lar hakkında

ARM işlemcimizde her biri 16 bit olan 5 adet GPIO bulunmaktadır. Bunlar GPIOA, GPIOB, GPIOC, GPIOD, GPIOE  dir.
Dokumanlarda GPIOx şeklinde gösterimde tüm GPIO için ortak bir açıklama yapılıyor demektir. (x yerine A,B,C,D,E koyabilirsiniz anlamında.)

Çipin donanım yeteneklerinde bağlı olarak GPIO pinleri, output yada input yapılarak I/O port olabileceği gibi alternatif fonksiyonlarla ilişkilendirilebilir yada Analog giriş yada çıkış yapılabilir.

Her bir GPIOun 32 bitlik kontrol registeri bulunur. Bunlar,   GPIOx_MODER    GPIOx_OTYPER    GPIOx_OSPEEDR   GPIOx_PUPDR

Eğer GPIO I/O port olarak tanımlanırsa bu I/O portların 16 bitlik registerleri bulunur ve bunlar GPIOx_IDR   GPIOx_ODR  I/O portların her bir pinine istersek bit bit erişilebiliriz. Bunun için GPIOx_BSRR registerinden yararlanırız.

İstersek GPIO tanımlarını yaptıktan sonra tanım registerlerini kitleyebiliriz. Bu durumda GPIO tanımlamaları, çip resetleninceye kadar değiştirilemez. Bunu kilitleme işlemini GPIOx_LCKR registeri ile yaparız. Bu işlem kontroldan çıkmış bir yazılımın portlar üzerinde yanlış işlem yapmasını engeller ayrıca işletim sistemi gibi yapılarda kullanıcı programının yetkilerini sınırlar.
Bir GPIO nun herhangi bir bitine alternatif görev verilebilir. Bu görevler GPIOx_AFRL ve GPIOx_AFRH registerleri üzerinden tanımlanır.

Bu registerlerin ne işe yaradıklarını kısaca açıklayacağız ve şamatalar bölümünde örnekler üzerinde tartışacağız.

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

GPIOx_MODER   

Rehber Sayfa 148 de bu registeri göreceksiniz.

GPIOnun herhangi bir I/O bacağı, giriş, çıkış, alternatif fonksiyon yada Analog giriş olarak tanımlanabilir. (Alternatif fonksiyon olarak PWM çıkışı, Timer clk girişi vs örnek verilebilir)

Bu dört durumun her biri iki bitle tanımlanır.

Bunlar;
  00: Input (reset state)
01: General purpose output mode
10: Alternate function mode
11: Analog mode

Her bir GPIO 16 Adet I/O ya sahip olduğundan, her bir I/O nun yapısı 2 bitle tanımlandığından toplam 32 bite ihtiyaç vardır.

GPIOA nın en düşük pozisyondaki pinini A0, Output tanımlamak için GPIO_MODER  registerine 0x00000001 yazmamız yeterlidir.

A0'a ilave olarak A1 pini de output tamamlamak istersek bu kez GPIO_MODER  registerine 0x00000005 yazmamız gerekir.

Bunlara ilave olarak A2 pini Alternatif fonksiyon tanımlayacaksak bu kez GPIO_MODER  registerine 0x00000025 yazmalıyız.

GPIOx_OTYPER

GPIO I/O seçilmiş ve output tanımlanmışsa I/O pin pushpull mu yoksa open drain mi olacağı bu register ile tanımlanır. Pine ait bit 0 yapılarak  Pushpull, 1 yapılarak open drain seçilir. (Rehber Sayfya 148)


GPIOx_OSPEEDR

Her bir I/0 pinin hızı, 2 bit ile değiştirilebilir. Output pininden çıkartacağınız sinyalin frekansına uygun olarak bu bitleri ayarlamalısınız.  (Rehber Sayfa 149)

00 için 2 Mhz ve altı
01 için 25 Mhz ve altı
10 için 50 Mhz ve altı
11 için 100Mhz ve altı

Devam edecek.....
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include "STM32F4xx.h"
void SystemInit()
{
volatile int i;

for (i=0;i<0x00100000;i++);  // Boyle bir gecikme sorunlu programların kurtarılmasında işe yarar.

//  32 Bit Hesaplayici programinda once CLR kutusunu tiklayin.

//  RCC_CFGR registerinin (Rehber Sayfa 97)
//  Hard Sayfa 16 yi acin. Amacimiz cipi en yuksek hizda calistirmak
//  Max AHB  frekansi = 168 Mhz
//  Max APB1 frekansi =  42 Mhz
//  Max APB2 frekansi =  84 Mhz

//  AHB clock frekansini 168 Mhz yani CPU nun max kosma hizi secmek istiyorum.
//  7,6,5,4 bitlerini 0 yapabilirim (0xxx: system clock not divided)

//  Simdi de APB1 ve APB2 Bus frekanslarini istedigimiz degerlere set edelim.
//  APB1 frekansi 42 Mhz olmasi icin 168/42 den bolme orani 4 cikar.
//  RCC_CFGR registerinde Bit 12-11-10 bitlerine 101 yazacagiz.
//  Cunku dokumanda 101: AHB clock divided by 4 yaziyor.

//  APB2 frekansimiz ise 84Mhz olmasi icin 168/84 den bolme oranimiz 2 bulunur.
//  RCC_CFGR registerinde Bit 15-14-13 bitlerine 100 yazacagiz.
//  Cunku dokumanda 100: AHB clock divided by 2 diyor.

//  32 Bit Hesaplayici programinda  15, 12, 10 kutucuklerini da tiklarsak  0x00009400 degeri bulunur.
RCC->CFGR |= 0x00009400;  // SYSCLK 100Mhz den yuksek oldugu icin 2 ye bolunmus degerini gozleyecegiz (Rehber sayfa 91)
//  Rehber Sayfa 93 u acin.
//  CPU hala 16Mhz RC OSC yi kullaniyor. 8Mhz Xtal OSC yi calistiralim.
//  HSE XTAL OSC yi on yapmak icin HSE_ON bitini set edelim. Yalniz bu registerin reset degeri 0x83 mus.
//  0 ve 1 nolu bitlere aman dikkat dokunmayin onlara. O halde orlama yaparak yukleme yapalim. (Bunun samatasini yapin)
//  Orlama yapmadan yukleme yapacaksak 0x00010083 de yazabiliriz.

RCC->CR |= 0x00010000;             

//  Yukaridaki satir isletildiginde 8Mhz Xtal (X2) pinlerinde 8 Mhz sinusel sinyal belirecektir.
//  Asagidaki satir, yeni calismaya baslayan Xtal OSC'nin kararli sinyal uretmesini bekleme amaclidir.


while (!(RCC->CR & 0x00020000));   // (Samatasini yapin)

//  8 Mhz Xtal OSC calisti ama biz hala 16Mhz RC Osc ile calisiyoruz.
//  Simdi de PLL katsayilarini ayarlayalim. M=8, N=336, P=2 ve Q=7 degerlerini ders notlarinda hesaplamistik.
//  Rehber Sayfa 95 de PLLCFGR register aciklamalarina gore yerlestirirsek


RCC->PLLCFGR = 0x07405408;
//  PLL calismaya baslasin  (Rehber Sayfa 95)

   
RCC->CR |= 0x01000000;      // RCC_CR de PLLON bitini set edelim;

// PLL kilitlenmesini bekleyelim

   while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle

//  FLASH->ACR = 0x00000705;           // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55) Yazmamız gereken asıl kod bu fakat çipte bug var
   

    FLASH->ACR = 0x00000605;           // Flash ROM icin 6 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55) Mecburen bunu yazacağız.

//  PLL ve XTAL osc ayarlarini yaptik fakat hala 16Mhz RC Osc ile calisiyoruz
//  Artik PLL i Clk kaynagi olarak devreye sokabiliriz. (Derslerde islemcinin Clock ayarlarinin yapilmasi
//  konusunda verdigimiz blok semada daire icindeki komutatoru PLLCLK konumuna alalim)


RCC->CFGR |= 0x00000002;     // Sistem artik PLL Clk dan beslensin

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
       
   
GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz

}

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();
   }
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Aşağıdaki notları şu anda okumanıza gerek yok. Doküman karıştırıken karşıma çıkan fakat çok yakında lazım olacak bilgiler.
Yeri gelikçe burdan koparılıp ders notlarına taşınacak.

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

(Çipimizin bir diğer özelliği de sayfa 85 den de görüleceği üzere MCO1 ve MCO2 pinlerinden dışarıya clock sinyali çıkartabilmesidir.  PLLden türetilmiş  bu sinyaller bazı projelerde oldukça işe yarar. (PLLCLK yı 1...5 arasında bölerek dışarı çıkartabiliyoruz))

------------------------
PORTx_OSPEEDR registeri üzerinden port pinlerinin, frekansa baglı olarak yukselen ve duşen kenarlarındaki akım basma ve emme yetenegi ayarlanabilmektedir.

00: 2 MHz Low speed
01: 25 MHz Medium speed
10: 50 MHz Fast speed
11: 100 MHz High speed

Şimdilik çipimizle düşük akım ugylulamaları yapalım düşüncemiz olmadığına göre ılgileneceğimiz portun OSPEEDR registerinin tüm bitlerini 1 yaparak portun ilgili pinlerin en yüksek frekansda çalışmasını sağlayacağız.

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

Çipimiz 1.8 ila 3.6 volt arasında çalışabilir. Ancak CPU CLOCK için voltaja bağlı olarak sınırlama sözkonusudur. (Rehber Sayfa 55)
Üstelik CPU CLOCK frekansına göre FLASH ROM Wait state eklemek gerekmektedir.

Fakat ART Adaptive Real-Time memory accelerator modülüne teşekkür etmeliyiz. Çünkü bu modül sayesinde Wait state eklenmiş olsa bile Flash ROM, sanki hiç wait state yokmuşcasına 168Mhz de okunabilir yada bu frekansla komutlara erişilebilir.  (Rehber Sayfa 56)

Kartımızın düşük voltajda beslenmesi sözkonusu değil ve CPU yu 168 Mhz de koşturmak istediğimiz için FLASH ROMa 6 wait state eklemeliyiz. (Tablo 3, Rehber Sayfa 55)

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

32 Bit registerlerle uğraşırken bize kolaylık sağlayan programı indirmenizi öneririm. www.cncdesigner.com/STM/Calc.rar

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

kralsam

Bu cihazların fiyatı nedir acaba? Nasıl temin edeceğimiz konusunda bilgisi olan varmı?
Tez de işimi çok kolaylaştırır gibi geldi. Kullanabilirsem tabi. :)

MC_Skywalker

Alıntı yapılan: kralsam - 30 Ekim 2011, 23:48:09
Bu cihazların fiyatı nedir acaba? Nasıl temin edeceğimiz konusunda bilgisi olan varmı?
Tez de işimi çok kolaylaştırır gibi geldi. Kullanabilirsem tabi. :)

Forumu iyi araştırmamışsın https://www.picproje.org/index.php/topic,35740.0.html konusunu okur isen sana faydalı olacaktır.