Sinav sorularinin samatalarini bu basliktan yapalim.
hocam m4 şamatalarda yazmıştım okudunuz mu bilmem. emin olmamakla birlikte birkaç cevap ve soru yazdım ;D.
GPIOx_OSPEEDR resette sadece B portu için 0x0000 00C0 diğerleri için 0x0000 0000 değerinde.
siz tüm bitleri set ediyorsunuz. 16 bitlik port için her bir bitin 4 farklı alabileceği değerden 11=100MHz i seçiyorsunuz. 30pf da diyor tabiii. bu kristal ile 30pf kullanıldığında anlamına mı geliyor.
System clock (SYSCLK) selection
After a system reset, the HSI oscillator is selected as the system clock. When a clock source
is used directly or through PLL as the system clock, it is not possible to stop it.
sistem 16MHz Rc osilatör ile çalışıyor.
RCC-CFRG reset değeri 0x0000 0000 ile çalışacağıncan AHB ve APB ler için presecale yok. Hepsi 16MHz de çalışır.
PORTlarda AHB den çalıştığına göre onlarda 16MHz de olmazmı.
GPIOD->OSPEEDR= 0xFFFFFFFF bunu yapmanın bir anlamı varmı?
hocam puanları bol verin biraz. hepsini çözdüm soru bile yazdım. ;D
Evet cevaplar dogru. Fakat soyle yapalim ki okuyanlara daha cok faydasi bulunsun.
Rehber yada Hard dokumana atifta bulunun sayfa numarasini verin.
Mesela
GPIOx_OSPEEDR resette sadece B portu için 0x0000 00C0 diğerleri için 0x0000 0000 değerinde. (Rehber Sayfa 149)
Sorulari sorarken cevaplarini hazirlamadim. Burda tartisacagiz.
Bu arada yazdigim kodlarin temellerini cogunlukla bir once yazdigim programlardan cut copy ile aliyorum. Dolayisi ile miras yoluyla gelen kodlarda fazlalik satirlar yakalayabilirsiniz.
Bu satirlar kaldirip atilsa bile kodlar duzgun calisacaktir. Bu tip satirlar yakalarsaniz bunlari da tartismaya acabilirsiniz.
Mesela OSPEEDR portunu daha ilk ornekten en yuksek hiza aldim. Cunku bir sonraki ornekte ele almak yada kendi merakimi gidermek icin, portun herhangi bir pininnden en yuksek kac Mhz sinyal cikabilirim sorusuna cevap arayacaktim. Dolayisi ile ilk ornekte port hizinin en yuksek hiza alma sebebi bu.
Ote yandan, kart uzerinde sadece 4 led oldugu halde bu 4 ledin bagli oldugu pinlerin hizini maxa almadim da toptan tum portun tum pinlerini en yuksek hiza aldim sorusu akla gelebilir. Cevabi, boyle yapmamin zarari yok. Fazladan kafa yormak istemedim.
Gene de kafaniza takilan sorulari sorun bazilarinin cevabi yukaridakiler kadar basit olabilir bosu bosuna kafanizi kurcalamasin.
Alıntı YapSystem clock (SYSCLK) selection
After a system reset, the HSI oscillator is selected as the system clock. When a clock source
is used directly or through PLL as the system clock, it is not possible to stop it.
sistem 16MHz Rc osilatör ile çalışıyor.
Hangi sayfada yaziyor? Gene mesajinizda referans verin.
Bu cevaba ilave olarak asagidaki eklentiyi de yapmanizi arzu ederim.
RCC_CR registeri (Rehber Sayfa 93) reset ardindan 0x0000 XX83 degerini alir.
Bunun anlami HSI
High
Speed
Internal osilator on ve PLL off vaziyettedir.
(http://www.cncdesigner.com/STM/CLK_PLL.JPG)
Yukaridaki blok semadaya bakalim. (Rehber Sayfa 85) (Blogu sadelestirmistim)
HSI osc calismakta ok. Yukaridaki blok semada HSI, HSE ve PLL den clock secimi yapan SW komutatoru hangi pozisyonda?
RCC_CFGR registeri (Rehber Sayfa 97) resette 0x0000 0000 degerini almaktadir SW1, SW0 bitleri 0 olacaktir.
Bu bitlerin 0 olmasi asagidaki tablodan da gorulecegi uzere HSI nin sistem osilatoru olarak kullanildiginin gostergesidir.
00: HSI oscillator selected as system clock
01: HSE oscillator selected as system clock
10: PLL selected as system clock
11: not allowed
Seklinde cevap yazarsaniz mesajlar okunasi zevkli ve ogretici olacaktir.
Evet CPU muz 16Mhz ile kosuyor.
AHB ve APB frekanslari icin RCC clock configuration register (RCC_CFGR) (Rehber Sayfa 97) ya bakalim.
Bu registerin resetteki default degeri 0x0000 0000 imis. Bu durumda .......
Seklinde devam edelim.
evet hocam haklısınız. sayfa vs belirtirsek daha güzel olacak. öğrenciyiz biz mazur görün. registerlar felan programdan takip ederken nerden neye baktığımı bende karıştırmaya başladım.
örnek programlarınızda void SystemInit() içini dediğiniz gibi miras yoluyla doldurmuşsunuz. aslında ben biraz da fazlalılığından değilde tam emin olamadığım için(clock mekanizmasından tam emin olamadığımdan) sordum. yani portlar şu durumda 16MHz de mi yoksa GPIOD->OSPEEDR ayarlmasıyla başka bir şekilde daha yüksek frekanslarda mı çalışır merak etmiştim.
Mesela ornek kodlarda RCC->AHB1ENR |= 0x0000000F; // GPIO A,B,C,D clock'u aktif edelim satirini goreceksiniz. Halbuki uygulamada atiyorum sadece D portu kullaniliyor A,B,C portlari kullanilmiyor.
Neden GPIO A,B,C clock sinyallerini aktif ettiniz diye dusunebilirsiniz. Gene cevabi cok basit. Nasil olsa sonraki ornek kodlarda bu portlari kullanma durumum var simdiden acayim gibi basit bir mantikla bunlari da harekete gecirdim.
Cipin icinde, clock isareti aktif edilen her donanim akim cekmeye baslar ve cipin guc tuketimini arttirir. Bu aklinizda bulunsun.
peki hocam.anlaşılmıştır. sorularınızı takip ediyoruz. içinden çıkabilirsem açıklayıcı cevaplar vermeye çalışırım. teşekkürler.
hocam 23.5MHz için uygun P,Q ve N değerleri çıkmıyor gibi geliyor bana. usb yi de 48 alırsak tabi.
USB iyi isin icine karistirma. 48Mhz uretmeyecegiz.
Alıntı yapılan: fryrmnd - 24 Aralık 2011, 18:07:50
hocam 23.5MHz için uygun P,Q ve N değerleri çıkmıyor gibi geliyor bana. usb yi de 48 alırsak tabi.
Evet bende aynı şekilde buldum ama usb frekansını 48 MHz'i geçemeyecek şekilde ayarlarsak sonuç çıkıyor.
Edit: Ben yazarken siz cevap yazmışsınız hocam.
Hocam final dönemi vize mi olur :(
Ne zaman isterseniz o zaman vizeye girin
Fakat pesin pesin soyleyeyim, en az 70 alamayanin kartini alirim.
Malesef anca tatilde tüm konuları okuyup halledebilirim.
PLL giriş değeri 1-2 MHz arasında olmak zorunda bu yüzden M değerini 8'e ayarlamak 1MHz çıkış ile işimizi kolaylaştırıyor
HARD sf:96
Alıntı YapCaution: The software has to set these bits correctly to ensure that the VCO input frequency
ranges from1 to 2 MHz. It is recommended to select a frequency of 2 MHz to limit
PLL jitter.
P değeri maximum 8 değerine sahip olabiliyor, çıkış frekansımız düşük olduğu için bu değeri kullandım
N/P değeri 23,5 olması için N 188 değerine sahip oluyor, notumuza baktığımızda istenilen değerler içinde olduğunu görebiliyoruz
HARD sf:96
Alıntı YapCaution: The software has to set these bits correctly to ensure that the VCO output frequency is between 64 and 432 MHz.
Bu durumda M=8 P=8 N=188 değeri ile 23,5MHz değerini yakalayabiliyoruz
fakat STM'in kendi clock configuration tool'unda N değerini 192 den aşağı veremiyoruz burada bir çelişki var ve datasheet de sebebini de bulamadım
N değerini 192 den aşağı veremezsek böyle bir frekansta çalışamayızKodu sizin kodlardan çalarak yazarsak :)
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 = 0x04432F08; // PLL katsayilarini M=8, N=188, P=8 ve Q=4 yapalim
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
FLASH->ACR = 0x00000600; // Flash ROM icin 0 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
}
ersin hocam şuhliyle PLL N 376 mı gözüküyor. yoksa farklı bir sebepten dolayı 2 katı mı yapmak gerekiyor(188x2)?
yok hocam yerleştirirken kaydırmışım, düzelttim şimdi =)
Bahsettiginiz tool USB donaniminin calismama ihtimalinden dolayi sinirlama getirmis olabilir. CPU donaniminin 23.5Mhz de calismamasi icin bir neden yok.
Toolda USB donanimini lullanmayacagim diye bir secenek yokmu?
Birde wizardlari bosverin Wizard biziz.
Wizard modda kullanmıyorum hocam, girdiğimiz değeri direk sonuca ulaştırdığı için kolay olur dedim ama yine hesabı kendim yaptım birşey değişmedi =)
Soruyu hazirlarken sinirlamalari da dikkate alarak P, N, M degerlerini secip 23.5 Mhz gibi bir sonuc elde ettim ve sizlerin 23.5 Mhz den yola cikip tersine bu degerleri tespit etmenizi istedim. 23.5 i ozellikle kafadan atmadim.
Peki sonuc ne bu durumda? 8Mhz xtal ile CPU 23.5Mhz de kosacakmi kosmayacakmi?
Deneyen, olcum yapan oldumu?
Osiloskopunuz yok. Frekansmetreniz yok. CPU nun kosturdugu frekansin 23.5Mhz olup olmadigini bilmek istiyorsunuz. Ne yapardiniz?
hocam 23.5 e göre led yakma söndürme felan ayarlayamazmıyız. 23.5 te 1sn yansın 1sn sönsün.
Nasil?
pek iyi bir çözüm olmadı galiba. başka nasıl anlaşılarbilir scopsuz 23.5 te koştuğu? ???
Cevabin dogru. Bu is icin kisa bir kod yazip ledleri yakip sondurur ve kol saatimi bakarim.
Sonucta CPU ya calisir ya calismaz. Calisirsa 23.5 Mhz e set ettigim clock frekansinin belki 23.45 oldugunu anlayamam ama 11.75 yada 47Mhz olup olmadigini anlarim.
Fakat ledleri nasil yakip sondureceksiniz de 23.5 Mhz olduguna karar vereceksiniz kismina daha cok aciklik getirin demek istedim.
PIC projelerinde Delay yerine 1200020200 yaziyorum for dongusunde sayidiririyorum vs diyorlar oyle mi yaparsin?
hocam kodu mu yaz dedeniz? :)
Timer birimini 23.5MHz'e göre 1ms'de bir kesme üretecek şekilde ayarlanır , her kesmede bir değişkenin değeri arttırılır değişken 1000 değerine ulaşınca led'in durumu terslenir.
1ms'yerine 100ms'de bir kesme oluşturmak hata oranını azaltacıktır demek yanlış olmaz sanırım.
1ms'yeye kurmaya ne gerek var :) 1000ms'de bir kesme oluşturulacak şekildede timer sayacına yazım yapılabiliyor.
3. örnekteki gibi yani yazdığınız gibi delay ekleyerek yazılan program sakatmı olur hocam. yoksa namcho hocamın dediği gibi timer mı kurmak gerekli.
şebekeden opto ile herhangi bir interrupt pinine giriş yapıp ayarladığım timer'ın değerini yedekleyip sıfırlamasını sağlarım
elde ettiğim değeri şebeke frekansına göre hesaplayıp sonucu çıkarırım
şebekeyi referans almak biraz tehlikeli ama benzer bildiğiniz bir frekans değer girişi ile aynı şekilde sonuç elde edilebilir
Ersinin verdigi system inite ornek kodlardaki timer 7 ile yanip sonen led projesini birlestirdim.
Ledlerin saniyede bir yanip sondugunu gordum. (Scopla da teyid ettim) Evet CPUmuz tami tamina 23.5Mhz de kosuyor.
(Soruyu hazirlarken kullandigim degerler. M=4 N=94 P=8 idi.)
#include "STM32F4xx.h"
// FAHB=FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4
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 = 0x04432F08; // 23.5Mhz icin ayarlayalim
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000));// Pll hazir oluncaya kadar bekle
FLASH->ACR = 0x00000600; // Flash ROM icin 0 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()
{
RCC->APB1ENR|=0x00000020; // Timer7 CLK'u aktif edelim (FCPU/4) x 2 (23.5 / 2 = 11.75 Mhz)
TIM7->CR1=0x0080; // Otomatik Reload
TIM7->PSC =11749; // Count frekansimiz = 11.75 E6 / 11750 = 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
}
}
Bir arkadas M=8 N=188 P=8 degerlerinden RCC->PLLCFGR = 0x04432F08; nin nasil olusturuldugunu usenmeden aciklarsa super olur. (Ben usendim)
hocam valla gene önce davrandınız.ben de gene azcık çaldım çırptım debelendim aşağıdakini denedim. ama sanki 1sn den biraz uzun yanıyor gibi.
#include "STM32F4xx.h"
void SystemInit()
{
unsigned int i;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00000000; // AHB ve APB de prescale yok. timer7 ye direk 23.5 MHz gidicek.
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x04432F08; // 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
// Yukarıdaki örnek programdaki kodların aynısı
}
int main()
{
RCC->APB1ENR|=0x00000020; // Timer7 CLK'u aktif edelim (23.5 Mhz)
TIM7->CR1=0x0080; // Otomatik Reload
TIM7->PSC =23500; // Prescaler değerimiz 23500, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 23.5E6 / (23500) = 1000 Hz
TIM7->ARR =1000; // Counter, Decimal 1000 olunca basa donsun 1 sn demek (2000 yapmadım çünkü aPB presclae değerim 1)
TIM7->CR1|=0x0001; // Counter Enable
while(1)
{
if (TIM7->CNT > 500) GPIOD->ODR= 0x0000F000; // Ledler yansin
else GPIOD->ODR= 0x00000000; // Ledler sonsun
}
}
hata yaptım düzelticem
şimdi düzeldi.1 sn de bir yanıp sönüyor.
Soru Şu
RCC->CFGR |= 0x00009400; Kodu ile Ne yapılmaya Çalışılmış ?
(RCC nin CFGR registerini sayıyla orlama
Kayıcıyı inceledim böyle bir ayar yok)
bunalmış hocam P=8, N=188, M=8 verince 23.5 çıkıyor tam. 23.5=(8/M=8)*(N=188/P=8)
registerda tam sağlıyor. versiğiniz 32 bit hesaplayıcı ile baktım.
clock configuration tool
indirdim ama çalıştıramadım. macro lar felan tamam ama olmuyor.
muhittin hocam pll ayarı yapılıyor. AHB=160MHz, APB1=42MHZ, APB2=84Mhz elde etmek için presclale değerleri bu registerda ilgili yerlere yazılıyor. ilk sayfada pll blok şeması var.
0x00001400 versek ne olurdu ?
Benim kodlarimla fryrmnd nin kodlarinda
birimiz TIM7->PSC =23500; yazdi
birimiz TIM7->PSC =11749;
Fakat buna ragmen her iki kod da saniyede 1 kez ledleri yakip sonduruyor.
Cok guzel bir ornek oldu. Sebebini aciklayacak varmi?
Muhittin Kaplan sorunu daha netlestirirmisin? (Sayfa no vermeyi unutmayalim)
Hocam Başlık 5.3.2 de RCC PLL configuration register (RCC_PLLCFGR) var.
Sanırım rehber di.
Sizin verdiğiniz değer olan 0x00009400 değeri verilmiş
Etki eden Bitler 6-14 nolu bitler.
Bunlar PLLN: Main PLL (PLL) multiplication factor for VCO
peki neden kullanılmayan 15. biti de 1 yapmaya çalışıyoruz ?
Alıntı yapılan: muhittin_kaplan - 24 Aralık 2011, 20:46:19
Hocam Başlık 5.3.2 de RCC PLL configuration register (RCC_PLLCFGR) var.
Sanırım rehber di.
Sizin verdiğiniz değer olan 0x00009400 değeri verilmiş
Etki eden Bitler 6-14 nolu bitler.
Bunlar PLLN: Main PLL (PLL) multiplication factor for VCO
peki neden kullanılmayan 15. biti de 1 yapmaya çalışıyoruz ?
RCC->CFGR |=0x00009400; yapiyorum.
Sen RCC_PLLCFGR registerine bakiyorsun.
Ben Pc yi kapatayım Hocam. Doğrusunuz. :-[
Alıntı yapılan: muhittin_kaplan - 24 Aralık 2011, 20:30:28
clock configuration tool
indirdim ama çalıştıramadım. macro lar felan tamam ama olmuyor.
hocam şu an için hiç uğraşmayın mantığını kapmaya çalışın, finallerden sonra C# üzerinde ayarları yapmamızı sağlayacak bir wizard oluşturmayı düşünüyorum
işlerimiz o zaman daha kolay olacaktır
Alıntı yapılan: bunalmis - 24 Aralık 2011, 20:41:10
Benim kodlarimla fryrmnd nin kodlarinda
birimiz TIM7->PSC =23500; yazdi
birimiz TIM7->PSC =11749;
Fakat buna ragmen her iki kod da saniyede 1 kez ledleri yakip sonduruyor.
Cok guzel bir ornek oldu. Sebebini aciklayacak varmi?
Bu soruyu atlamayin. Konuyu pekistirmek adina cok onemli.
Timer1 geri sayım ile 1sn aralıklı led yakıp söndürme
#include "STM32F4xx.h"
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 = 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()
{
RCC->APB2ENR|=0x00000001; // Timer1 CLK'u aktif edelim (84 Mhz)
TIM1->CR1=0x0090; // Otomatik Reload(Timer 1 geri sayıcak(down counter şeklinde ayarlandı)
TIM1->PSC =41999; // Prescaler değerimiz 41999, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) (84?2)E6 / (42000) = 4000 Hz
TIM1->ARR =4000; //
TIM1->CR1|=0x0001; // Counter Enable
while(1)
{
if (TIM1->CNT > 2000) GPIOD->ODR= 0x00000000; // Ledler yansin
else GPIOD->ODR= 0x0000F000; // Ledler sonsun
}
}
Alıntı yapılan: bunalmis - 24 Aralık 2011, 21:11:34
Bu soruyu atlamayin. Konuyu pekistirmek adina cok onemli.
RCC->CFGR |= 0x00009400 koduyla APB1 frekansını böldüğünüzden kaynaklanıyor hocam
TIM7 e sistem frekansının yarı frekansı giriyor bu şekilde
@fryrmnd
Hangi timer hangi busdan clocklaniyor konusuna dikkat etmelisin.
#include "STM32F4xx.h"
// FAHB=FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4
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
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
}
int main()
{
RCC->APB2ENR|=0x00000001; // Timer1 CLK'u aktif edelim (84 x 2 =168 Mhz)
TIM1->CR1=0x0080; // Otomatik Reload
TIM1->PSC =41999; // 168E6 / (42000) = 4000 Hz
TIM1->ARR =4000; // 4000 de bir yenilensin
TIM1->CR1|=0x0001; // Counter Enable
while(1)
{
if (TIM1->CNT > 2000) GPIOD->ODR= 0x0000F000; // Ledler yansin
else GPIOD->ODR= 0x00000000; // Ledler sonsun
}
}
evet hocam baştan sona hatalı hesapladım. APB nin prescale oranı 1 olmadığını, 2 katı hızda saycağını bile bile yanlış hesapladım. TMR->CNt yi bile 2000 başlangıç değeri verip 500 yapmışım. kusura bakmayın. ben eskisini azıcık değiştireyim. 4000 den geri sayan haliyle değiştireyim.yanlış kalıp kafa karıştırmasın.
Yalniz 3.soruyu neden atladik?
3.soru su ana kadarki donanim bilgileri ile C bilginizi birlestirmeye yonelik.
hocam 3. soruda deidğiniz gibi c bilgisi girdiğinden c ye biraz bakmam lazım. define felan. tam emin değilim. kolayıma geleni yapmaya çalıştım da onu da beceremedim :(
Bende Anlamaya Çalışıyorum..
Nerede takildin?
hocam 3. soruda define ile cpu ve bus frekanslarını belirlerken Hz değerleriniz decimal olarak verip System _Init() içinde tanıtılmasın şeklinde mi istediniz. yoksa define a RCC_CFRG ye atanması gereken hex değerini mi vermemizi istiyorsunuz. yani System_Init() içinde decimal hexadecimal çevrimi şeklinde mi yapıcaz.
Bunalmış Hocam asker adamım.
Bana Sırasıyla Şurasını Şunu Burasnı Bunu Yap demen gerek Bu OSC ayarları için. 15 sene sonra zor oluyor liberal yaklaşımlar. :)
bunalmış hocam isterseniz dilim döndüğünce ben yapayım osc ayarlarını muhittin hocama
Alıntı yapılan: fryrmnd - 24 Aralık 2011, 22:34:45
hocam 3. soruda define ile cpu ve bus frekanslarını belirlerken Hz değerleriniz decimal olarak verip System _Init() içinde tanıtılmasın şeklinde mi istediniz. yoksa define a RCC_CFRG ye atanması gereken hex değerini mi vermemizi istiyorsunuz. yani System_Init() içinde decimal hexadecimal çevrimi şeklinde mi yapıcaz.
Diyelimki programin tepesinde
#define Fcpu 168000000
#define Fahb 168000000
#define Fapb1 84000000
#define Fapb2 42000000
yazdik.
Demekki yazacagimiz fonksiyon PLL ve dividerlari set etmek icin bu verilerden yola cikacak,
RCC->CFGR, RCC->PLLCFGR vs registerlere yuklenecek sayisal degerleri bulacak.
@Muhittinkaplan
Sanirim 3.soru cevaplandiginda RCC->CFGR, RCC->PLLCFGR registerlerine neden o sayilar yukleniyor daha iyi anlayacaksin.
anladım hocam bir abdest namaz arası versem. sonra yazmaya başlasam o fonksiyonları.
Aynen Benimde Mola Vermem Gerekiyor.
#include "STM32F4xx.h"
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
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
}
int main()
{
RCC->APB2ENR|=0x00000002; // Timer8 CLK'u aktif edelim (84 Mhz) Rehber 117
TIM8->CR1=0x0080; // Otomatik Reload Rehber 333
TIM8->PSC =42000-1; // Prescaler değerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 42E6 / (42000) = 1000 Hz
TIM8->ARR =1000; // Counter, Decimal 1000 olunca basa donsun 1 sn demek
TIM8->CR1|=0x0001; // Counter Enable
while(1)
{
if (TIM8->CNT > 500) GPIOD->ODR= 0x0000F000; // Ledler yansin
else GPIOD->ODR= 0x00000000; // Ledler sonsun
}
}
// Programin sonu
Dersi Kaçırdık ,Sorular çözülmüş sanırım ben 4. yapayım dedim yapayım dedim.
Timer 8 'i kullandım.
green hocam 3. yü yapsaydınız da rahatlatsaydınız bizi ;D
Ben hala bir çözüm yöntemi bulamadım M,N,P yi nasıl hesaplatacağımıza dair.
Alıntı yapılan: fryrmnd - 24 Aralık 2011, 23:25:49
green hocam 3. yü yapsaydınız da rahatlatsaydınız bizi ;D
Yaf 3 çözülmemişmiydi :P
Çözelim abi...
N-> 64-432 arası
P->2,4,6,8 "
Q->2-15 "
M->2-63 "
değer alabiliyor. önce bir algoritmasını çözsem yarım yamalak c bilgim ile yaparım inşallah. :)
PLL frekansinin Xtal, M, N cinsinden degerini veren bagintiyi yazin.
Daha sonra da CPU clk frekansi ile PLL frekansi arasindaki bagintiyi yazin.
Gerisi corap sokugu gibi gelmesi lazim.
Soru 3 nedir bulamadım başlıkta.
Alıntı yapılan: muhittin_kaplan - 25 Aralık 2011, 00:02:36
Soru 3 nedir bulamadım başlıkta.
https://www.picproje.org/index.php/topic,36897.msg267159/topicseen.html#msg267159
https://www.picproje.org/index.php/topic,36897.0.html
hocam bir bildiğiniz vardır diyorum bakınıp duruyorum ama bir türlü göremedim ve olayı çözemedim. şimdi spu frekansı zaten pll frekansı olmuyor mu?
Olurmu? PLL, istenirse 432Mhz e kadar kitlenebiliyor. Halbuki CPU en fazla 168Mhz de işletilebiliyor. PLL çıkışında P bölücüsü var. Rehber Sayfa 85.
Şimdi bu durumda 2 soru biraz ezbere çözüldü gibi duruyor. 2. soruyu çözebiliyorsan bu soruyu da çözebilmen gerekir. En azından CPU clk için gerekli M, N, P değerlerini hesaplayabilirsin.
Mesela atıyorum 8Mhz xtal ile CPU yu 84Mhz de koşturmak istesek M, N ve P yi bulamazmısın?
Tam istediğiniz kod değil hocam, biraz işi compiler yüklensin istedim ama hesaplama kısmında istediğim verileri bulamadım
Hiç içime sinmedi ama şimdilik bunu vereceğim, Optimizasyon ile de çalışmıyor >:( ayrıca bilginize, yarın düzeltmeye çalışırım
bu arada belki arkadaşlar kopya çekerler :)
#define KHZ 1000
#define MHZ 1000000
#define XTAL 8*MHZ
#define F_CPU 23500*KHZ
#define F_AHB 23500*KHZ
#define F_APB1 23500*KHZ
#define F_APB2 23500*KHZ
#if F_CPU >168*MHZ
#error "F_CPU >168MHz"
#elif F_AHB >168*MHZ
#error "F_AHB >168MHz"
#elif F_APB1 >42*MHZ
#error "F_APB1 >42MHz"
#elif F_APB2 >84*MHZ
#error "F_APB2 >84MHz"
#endif
#if XTAL < 2*MHZ
#error "Crystal frequency too Low"
#elif XTAL > 63*MHZ
#error "Crystal frequency too High"
#endif
#if !((F_AHB!=F_CPU)||(F_AHB!=F_CPU/2)||(F_AHB!=F_CPU/4)||(F_AHB!=F_CPU/8)||(F_AHB!=F_CPU/16)||(F_AHB!=F_CPU/32)||(F_AHB!=F_CPU/64)||(F_AHB!=F_CPU/128)||(F_AHB!=F_CPU/256)||(F_AHB!=F_CPU/512))
#error "You can't produce AHB Frequency with current CPU Frequency"
#endif
#if !((F_APB1!=F_AHB)||(F_APB1!=F_AHB/2)||(F_APB1!=F_AHB/4)||(F_APB1!=F_AHB/8)||(F_APB1!=F_AHB/16))
#error "You can't produce APB1 Frequency with current AHB Frequency"
#endif
#if !((F_APB2!=F_AHB)||(F_APB2!=F_AHB/2)||(F_APB2!=F_AHB/4)||(F_APB2!=F_AHB/8)||(F_APB2!=F_AHB/16))
#error "You can't produce APB2 Frequency with current AHB Frequency"
#endif
void SystemInit(void){
volatile unsigned int i,j,chk_brk=0;
volatile unsigned int PLL_P=0,PLL_M=0,PLL_N=0,PLL_RG=0,PLL_Q=2;
for(i=(XTAL/(2*MHZ));i<=(XTAL/MHZ);i++){
for(j=32;j<433;j++){ //P=2 için
if ((F_CPU==((XTAL*j)/(i*2)))&&(((XTAL*j)/(i*MHZ))>63)){
PLL_P=0; //2
PLL_M=i;
PLL_N=j;
chk_brk=1;
break;
}
}
if(chk_brk==1) break;
for(j=32;j<433;j++){ //P=4 için
if ((F_CPU==((XTAL*j)/(i*4)))&&(((XTAL*j)/(i*MHZ))>63)){
PLL_P=1; //4
PLL_M=i;
PLL_N=j;
chk_brk=1;
break;
}
}
if(chk_brk==1) break;
for(j=32;j<433;j++){ //P=6 için
if ((F_CPU==((XTAL*j)/(i*6)))&&(((XTAL*j)/(i*MHZ))>63)){
PLL_P=2; //6
PLL_M=i;
PLL_N=j;
chk_brk=1;
break;
}
}
if(chk_brk==1) break;
for(j=32;j<433;j++){ //P=8 için
if ((F_CPU==((XTAL*j)/(i*8)))&&(((XTAL*j)/(i*MHZ))>63)){
PLL_P=3; //8
PLL_M=i;
PLL_N=j;
chk_brk=1;
break;
}
}
if(chk_brk==1) break;
}
if((PLL_M==0)||(PLL_N==0)){
while(1);
}
PLL_RG=(PLL_Q<<24)|(PLL_P<<16)|(PLL_N<<6)|PLL_M;
sorun çözüldü düzgün değerler üretiyor, şimdi kısaltmada :)
Eline sağlık. Kodları tamamen incelemedin ve denemedim. Gözüme ilişen bir durum var.
#if !((F_AHB!=F_CPU)||(F_AHB!=F_CPU/2)||(F_AHB!=F_CPU/4)..........
yerine
#if !((F_AHB!=F_CPU)||(2*F_AHB!=F_CPU)||(4*F_AHB!=F_CPU).......... olması gerekmez mi?
Haklısınız hocam o kısımları düzelttim, biraz kısaltma ile bu hale getirdim, Optimizasyon ile de çalışıyor
#define KHZ 1000
#define MHZ 1000000
#define XTAL 8*MHZ
#define F_CPU 47000*KHZ
#define F_AHB 23500*KHZ
#define F_APB1 23500*KHZ
#define F_APB2 23500*KHZ
#define XTAL_K XTAL/MHZ
#if F_CPU >168*MHZ
#error "F_CPU >168MHz"
#elif F_AHB >168*MHZ
#error "F_AHB >168MHz"
#elif F_APB1 >42*MHZ
#error "F_APB1 >42MHz"
#elif F_APB2 >84*MHZ
#error "F_APB2 >84MHz"
#endif
#if XTAL < 2*MHZ
#error "Crystal frequency too Low"
#elif XTAL > 63*MHZ
#error "Crystal frequency too High"
#endif
#if !((F_AHB!=F_CPU)||(2*F_AHB!=F_CPU)||(4*F_AHB!=F_CPU)||(8*F_AHB!=F_CPU)||(16*F_AHB!=F_CPU)||(32*F_AHB!=F_CPU)||(64*F_AHB!=F_CPU)||(128*F_AHB!=F_CPU)||(256*F_AHB!=F_CPU)||(512*F_AHB!=F_CPU))
#error "You can't produce AHB Frequency with current CPU Frequency"
#endif
#if !((F_APB1!=F_AHB)||(2*F_APB1!=F_AHB)||(4*F_APB1!=F_AHB)||(8*F_APB1!=F_AHB)||(16*F_APB1!=F_AHB))
#error "You can't produce APB1 Frequency with current AHB Frequency"
#endif
#if !((F_APB2!=F_AHB)||(2*F_APB2!=F_AHB)||(4*F_APB2!=F_AHB)||(8*F_APB2!=F_AHB)||(16*F_APB2!=F_AHB))
#error "You can't produce APB2 Frequency with current AHB Frequency"
#endif
void SystemInit(void){
volatile unsigned int i,j,chk_brk=0;
volatile unsigned int PLL_P=0,PLL_M=0,PLL_N=0,PLL_RG=0,PLL_Q=2;
for(i=(XTAL_K/2);i<=XTAL_K;i++){ // VCO girişi 1MHz-2MHz arası tara
for(j=((64*i)/XTAL_K);j<((432*i)/XTAL_K);j++){ // 64 - 432 MHz arası tara
if ((((XTAL/2)*j)/i)==F_CPU){ //P=2 için
PLL_M=i;PLL_N=j;PLL_P=0;chk_brk=1;break;
}
if ((((XTAL/4)*j)/i)==F_CPU){ //P=4 için
PLL_M=i;PLL_N=j;PLL_P=1;chk_brk=1;break;
}
if ((((XTAL/6)*j)/i)==F_CPU){ //P=6 için
PLL_M=i;PLL_N=j;PLL_P=2;chk_brk=1;break;
}
if ((((XTAL/8)*j)/i)==F_CPU){ //P=8 için
PLL_M=i;PLL_N=j;PLL_P=3;chk_brk=1;break;
}
}
if(chk_brk==1) break;
}
if((PLL_M==0)||(PLL_N==0)){
while(1);
}
PLL_RG=(PLL_Q<<24)|(PLL_P<<16)|(PLL_N<<6)|PLL_M;
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 = 0x00400000 | PLL_RG; // PLL ayarlansın
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000));// Pll hazir oluncaya kadar bekle
FLASH->ACR = 0x00000600; // Flash ROM icin 0 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
}
Kağıt kalemsiz hesaplardaki cambazlıklar pek gözükmüyor, birkaç kez düzenleme yedi ama Q çıkışına bakmaksızın kullanılabilir durumda
Hocam ne Yapmışsınız Siz ?
evet hocam haklısınız. ben blok şemadan bakıp pll frekansı herzaman system clock a eşit olcak diye bağlamışım kendimi. halbuki dediğiniz gibi N 432 ye kadar gidiyor. dediğim gibi ben yaptıklarımdanemin değilim hocam zaten c kodlamada da sıkıntı var. birşeyler bölük pörçük aklımda şuan birleştiremiyorum. c programlama başlığını da tam olarak inceleyemedim. gerçi kodda da pek bir zorluk gözükmüyor.
ersin hocam eline sağlık.
kitler bunalmış hocama gidecek bu gidişle. :)
hocam başka soru yok mu :)
@muhittin_kaplan hocam o kadar karmaşık bir yapı değil, sadece bilinmeyen fazlalığı var
hocam programlama konusundaki başlıkları hala bitiremedim hızla ilerliyorum. tabii yazmadan aşama kaydedilmeyecek. ama üşünmeden önceki başlıklarda cevabını yazdığınızı gördüğüm sorularımı cevapladığınız için sağolun.
kafama takıldı. ersin hocamın programında
if((PLL_M==0)||(PLL_N==0)){
while(1);
}
kısmında uygun frekans değeri yoksa sonsuz döngüye girmek için sanırım. peki ramin 0x20000000 adresine 1 byetlık veri yazan kod kısmı var mı? farkedemedim de.
hata kodlarını başta ürettiğim için bir değişken koymadım, şu an sadece cpu üretilemiyorsa çakılıyor diğer türlü hiç derlenmiyor
ayrıca programda AHB APB1 APB2 atamalarıda eksik hocam
hatta işin içine wait state hesabınıda sokmak lazım ama soruda yazmıyor =)
Burada bir ara verelim. Cok az katilimci var. Diger kart sahiplerinin durumunu bilmiyoruz. Muhittin kaplanin sorusuna cevap olmasi acisindan
Asagidaki soruyu adim adim cozelim.
Xtal frekansimiz 8Mhz dir.
Islemcimizi 100Mhz de kosturmak istiyoruz. AHB frekansimiz 100Mhz, APB1 ve APB2 frekanslarimiz 25Mhz olacaktir. USB donanimini kullanmayacagiz.
Bu amaci gercekleyecek register ayarlamalarini yapalim.
Cozum:
(Burada USB donaninminin kullanilmayacak olmasi, FPLL/Q oraninin 48Mhz olmasi sartini kaldirir. Dolayisi ile FPLL icin sinirlayici faktorlerden birisi kalkmis durumdadir.
Bu aciklamayi anlamaya bu asamada calismayin)
PLLin kitlendigi frekans FPLL=(Xtal/M)*N bagintisi ile hesaplanir.
FCPU=FPLL/P dir. Bu konuyu anlatmistik. https://www.picproje.org/index.php/topic,35721.0.html (https://www.picproje.org/index.php/topic,35721.0.html)
Uretici bazi sinirlamalar getirmis. (Rehber Sayfa 96) Bunlar;
Xtal/M orani 1...2 araliginda olmak zorundadir.
N 64...432 araliginda olmak zorundadir.
M 2...63 araliginda olmak zorundadir.
P 2, 4, 6 yada 8 olabilir.
Bu sartlar altinda
M=4 yaparak Xtal/4 den 2 buluruz.
FPLL=(Xtal/M)*N ve FCPU=FPLL/P bagintilarindan
FCPU= 100= 2*N/P yazariz.
O halde N/P orani 50 dir. Yani N=50P olmalidir.
P=2 alirsak N=100 cikar ve uretici sinirlamalarina uymus oluruz.
Yani PLL e 2 Mhz girer 200Mhz cikar. Bunu 2 ye bolunce de 100Mhz CPU clock elde etmis oluruz.
@Muhittin_kaplan su ana kadar her hangi bir sorun varmi?
Yok, gayet Anlaşılır.
bunalmış hocam şöyle bir kod yazdıydım. klasik registerları oku sırayla ayarla. çok hakim olmadığımdan gene bir gariplik var gibi.anlayamadığım yerler var.
toggle kısmını değiştirdim. bu şekilde olması gerekir diye düşünüyorum. butona basışımda karasızlık var mı var. baze çekerken de ledler durum değiştiriyor. biraz da debug ile uğraşayım.
kod hatalı ve koda benzemediği için sildim :(
Keilde derleyin calistirin. Calismiyorsa sorunu kendiniz bulacaksiniz.
Debug etmeyi deneyeceksiniz. Mesela butona basilinca bir yerlerde bir bit set ediliyormu? Bu tip calismalari yapmazsaniz bu isi yurutemezsiniz.
Isin puf noktasi DEBUG.
Bu arada bir pini Toggle etmek, eger bu pin 1 ise 0 yapmak, 0 ise 1 yapmak demektir.
anladım hocam. bitlere hakim olmam gerek. ama birkaç register ın fonksiyonunu tam anlayamadım. program çalıştı. basıp çekince yanıp sönüyor. biraz basılı tutup çekersem çekerken de yanıp sönüyor.
evet toggle ı da yanlıi yapmışım.
Cevap 5
#include "STM32F4xx.h"
// FCPU =168Mhz
// FAHB =FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4
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
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
}
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);
}
hocam
RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim
ataması ile SSW ve SW ayarlamaları nedir ? (PLL, HS seçimi yapıyorda sizin verdiğiniz Clock block diyagramında nereler ? )
RCC_CFGR registerine 9400 Hex sayisini yuklersen SSW ve SW bitleri ne deger alir?
Sorun bu mu? Eger oyle ise dersleri atlaya atlaya izliyorsun hocam.
Calc.exe diye bir programimiz var. Bunu kullaniyormusun?
9400 yukledigimizde SW bitleri 00 olur. SSW bitlerini yazarak biz degistiremeyiz. O bitlerle sadece switch statusunu ogrenebiliriz.
SW bitleri 00 ise HSI yani 16Mhz lik dahili RC osc calisacak demektir.
Blok diyagram Rehber 85 de. Benim renkli resim olarak koydugum blokdan bahsediyorsan orjinal blogun konumuzla alakasi olmayan kisimlari kesip attim sadelestirdim. Sayfa 85 de SW bitleri tam olarak gosterilmiyor. Blokdan sadece clock kaynaklarinin secildigi anlasiliyor.
Zaten bu tip diyagramlar semboluk olurlar, fikir vermesi acisindan konuyor.
bunalmış hocam yazmış zaten. sildim.
.....
Alıntı yapılan: bunalmis - 25 Aralık 2011, 23:02:05
RCC_CFGR registerine 9400 Hex sayisini yuklersen SSW ve SW bitleri ne deger alir?
Sorun bu mu? Eger oyle ise dersleri atlaya atlaya izliyorsun hocam.
Calc.exe diye bir programimiz var. Bunu kullaniyormusun?
9400 yukledigimizde SW bitleri 00 olur. SSW bitlerini yazarak biz degistiremeyiz. O bitlerle sadece switch statusunu ogrenebiliriz.
SW bitleri 00 ise HSI yani 16Mhz lik dahili RC osc calisacak demektir.
Blok diyagram Rehber 85 de. Benim renkli resim olarak koydugum blokdan bahsediyorsan orjinal blogun konumuzla alakasi olmayan kisimlari kesip attim sadelestirdim. Sayfa 85 de SW bitleri tam olarak gosterilmiyor. Blokdan sadece clock kaynaklarinin secildigi anlasiliyor.
Zaten bu tip diyagramlar semboluk olurlar, fikir vermesi acisindan konuyor.
Tamam Hocam RCC_CR registerinden yapılıyormuş.
İnt Osc ile Xtal Seçimini Nasıl Yaptığımız aklıma takılmıştı. Blok da iki adet swich görünüyor ben yukardaki (Biri PLL girişi Diğeri System Clock Girişi) SSW ve SW bitleri ile hangisinin kontrol edildiğini sormak istemiştim.
#include "STM32F4xx.h"
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 = 0x07431008; // PLL katsayilarini M=8, N=64, P=8 ve Q=7 yapalim =8Mhz
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= 0xAAAAAAAA; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz (25Mhz)
}
int main()
{
while(1)
{
GPIOD->ODR=0x00001000;
GPIOD->ODR=0x00000000;
}
}
Hocam Yukarıdaki gibi bir ayarlamada CPU um 8mhz de çalışması gerekiyor.
Portlar 25Mhz e ayarlı.
24Mhz lik Lojik analizere bağladığım PortD nin 12 sinde nedense bu hızı göremiyorum
Sebebi nedir ?
PORTD12 de hangi frekansi gormeyi bekliyorsun? Neden?
RCC->PLLCFGR = 0x07431008; satirinda
Yanlisim yoksa;
P=3 den dolayi bolme oranini 8,
N=0x40 dan dolayi Carpma oranini 64 secmissin.
M=8
Bu durumda secilen bu degerlere gore (8/8)*(64)/8 den CPU 8 Mhz de kosamasi lazim.
hocam be artık boş kağıt veriyorum. :). hocam buton interrupt uygulamsında debug işleminde register içeriklerini nasıl izleyebilicem. ne yazıkki beceremedim. flag set edildimi. o register ı nasıl izleyebilirim. o satıra geldiğinde kartta butona mı basmam gerekicek.
Boyle durumlarda Debug yaparken Keil yada bir baska programa guvenemem. Kendi yontemimi uygularim. (Bu kendi tercihim)
Deneme yaptigim cevre biriminin int uretmesine izin verir fakat NVIC dan izin vermem.
Her cevre biriminin kendi int flagi olur.
Bir while dongusu icinde bu flagin set olmasini beklerim.
while dongusunun hemen altina break point koyarim.
Programi isletirim. Ornek soruda butona basarim. Butona bastigimda int uretilir fakat yanitlanmaz. Ancak while dongum durumdan haberdar olur ve donguden cikar ve bir alt satirdaki breakpointte sistem durur. Bu, butona basmamla ayni anda gerceklenir.
Bu da bana int uretildigini soyler.
Hocam Cpu nun ayarladığım frekansta çalışıp çalışmadığını nasıl ölçerim ?
Soru Bu aslında..
Yazdığım Kodun Ledleri yakma kısmında birer satırlık asm oluşturmuş. buna bağlı olarak (mov komutuna bakmadım kaç saykılda çalışıyor.) işlemcinin hızını görebilmeliyim sanırım.
hocam farkındayım ama çok soruyoz ama. daha önce debugla felan çok uğraşmayınca. peki dışardan buton ve interrupt kısmında bir nevi test noktası koyarak gözlemliyorsunuz. başka bir register mesela bir çevre birimin konfigürasyon registerı. değer atadık. bunun içeriğini kartı debug ederken peripherals menüsünden mi görebilirim.
muhittin hocam bunalmış hocam bunun için üretilen clock frekansını dışarı veren bir program yazmıştı.
https://www.picproje.org/index.php/topic,35896.0.html
sanırım bu denemeniz için uygun olabilir.
Alıntı yapılan: fryrmnd - 26 Aralık 2011, 15:44:27
hocam farkındayım ama çok soruyoz ama. daha önce debugla felan çok uğraşmayınca. peki dışardan buton ve interrupt kısmında bir nevi test noktası koyarak gözlemliyorsunuz. başka bir register mesela bir çevre birimin konfigürasyon registerı. değer atadık. bunun içeriğini kartı debug ederken peripherals menüsünden mi görebilirim.
Dedigim gibi ben peripheral menu falan kullanmiyorum.
Benim yontemimi kullanmak istersen asagida.
#include "STM32F4xx.h"
// FCPU =168Mhz
// FAHB =FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4
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
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
}
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
EXTI->PR|=1; // Flagi silelim ve pusuya yatalim
while((EXTI->PR&1)==0); // Int uretilirse flag set olur
while(1); // Bu satira break point koy
}
Gecmisteki deneyimler nedeniyle neden peripheral menu vs kullanmadigimi soyleyeyim.
Keil bile olsa peripheral menuler vs BUG icerebilir. Hata yapiyorsam ben yapayim, bir baskasinin hatasi yuzunden sac bas yolmayayim mantigindan
boyle yapiyorum.
anladım hocam teşekkür ederim.
Örnek Programlara Baktım Bulamadım. Bende Biraz Tırmaladım Ama Güzel Oldu sanırım
#include "STM32F4xx.h"
void SystemInit()
{
unsigned int i;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00609400; // AHB ve APB hizlarini max degerlere set edelim
//6 ile Cout1 i PLL clock selected yapıldı.
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x07431008; // PLL katsayilarini M=8, N=20, 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
GPIOA->MODER = 0xAAAAAAAA; // GPIOA nin tüm pinleri cikisları Alternatif yapıldı Clock 1 çıkış İçin
// GPIOA.8 Clock Out REFBER Sayfa 91
GPIOA->OSPEEDR= 0xFFFFFFFF; // GPIOA nin tum cikislari en yuksek hizda kullanacagiz
GPIOD->MODER = 0x55000000; // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
GPIOD->OSPEEDR= 0xAAAAAAAA; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}
int main()
{
while(1)
{
GPIOD->ODR=0x00001000;
GPIOD->ODR=0x00000000;
}
}
Şu an Pll çıkışını porta.8 den görüyorum sanırım (8Mhz.)
örnek program alttta hocam. // satırına alınmamış bazı yorumlarıda almayı unutmayın.
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.
Bu baslik altinda bir arkadasin LIS302DL MEMS motion sensor ile ilgili sorusu vardi. Ornek kodlardaki MEMS uygulamasini tekrar denedigimde bazen tutarsiz davrandigini gordum.
Asagidaki programda, karti elinizle tutup egdikce ledler egilen yonde isildiyor.
#include "STM32F4xx.h"
unsigned short PWM[8]; // PWM registerler
unsigned short SRG[8]; // Shadow Registerler
unsigned short CNTR; // PWM Counter
signed char who,x,y,z,xo,yo,zo;
/*****************************************************************************************************
CPU PLL ile 168Mhz de kosturulur
AHB frekansy 168 Mhz
APB1 frekansy 42 Mhz
APB2 frekansy 84 Mhz
*****************************************************************************************************/
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
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>=255)
{
CNTR=0;
for(i=0;i<8;i++)
{
if(PWM[i]>255) PWM[i]=255;
SRG[i]=PWM[i];
}
}
j=0x8000;
for(i=0;i<8;i++)
{
if (CNTR>=SRG[i]) d&=~j;
j=j>>1;
}
GPIOD->ODR=d;
}
void Write(char Adr,unsigned char Data)
{
GPIOE->BSRRH=0x0008; // LIS302DL CS=0
SPI1->DR=((Adr&0x3F)<<|Data;
while(!(SPI1->SR&2));
GPIOE->BSRRL=0x0008; // LIS302DL CS=1
}
char Read(char Adr)
{
char Dat;
GPIOE->BSRRH=0x0008; // LIS302DL CS=0
SPI1->DR=((Adr&0x3F)|0x80)<<8;
while(!(SPI1->SR&1));
Dat=SPI1->DR;
GPIOE->BSRRL=0x0008; // LIS302DL CS=1
return(Dat);
}
int main()
{
int i;
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)+xo);
xo=x>>1;
if (x>=0) PWM[0]=x;
else PWM[2]=-x;
}
if (who&2)
{
y=Read(0x2B)+yo;
yo=y>>1;
if (y>=0) PWM[1]=y;
else PWM[3]=-y;
}
if (who&4)
{
z=Read(0x2D);
}
}
}
TIM7->DIER=0x0000; // Update Int disable
while(1)
{
for(i=0;i<0x1000000;i++);
GPIOD->ODR^=0x0000F000;
}
}
Merhaba Hocam;
kodunuzu kopyala yapıstır yaptım derleme esnasında altakı hatayı verdi.
Hatanının oldugu yere baktıgımda ise bir parantezin eksik oldugunu gordum duzeltım ama olmadı.
Build target 'Target 1'
assembling startup_stm32f4xx.s...
compiling main.c...
main.c(81): error: #29: expected an expression
Target not created
Parantezin eksik oldugu yer.
void Write(char Adr,unsigned char Data)
{
GPIOE->BSRRH=0x0008; // LIS302DL CS=0
SPI1->DR=(Adr&0x3F)<<|Data); // Eksik olan yer.
while(!(SPI1->SR&2));
GPIOE->BSRRL=0x0008; // LIS302DL CS=1
}
Not: Yazım duzeltmesi yapıldı.
void Write(char Adr,unsigned char Data)
{
GPIOE->BSRRH=0x0008; // LIS302DL CS=0
SPI1->DR=((Adr&0x3F)<<|Data;
while(!(SPI1->SR&2));
GPIOE->BSRRL=0x0008; // LIS302DL CS=1
}
Yukarida 8 ve parantez kapa yan yana gelince parantez yutuluyor.
Asagida ise 8 ve parantez kapa yan yana gelince siritan gozluklu adam cikiyor.
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
}
8) 8 )
Bu durumda kodlara guvenemeyecekmiyiz?
Alıntı yapılan: bunalmis - 26 Aralık 2011, 23:26:09
8 ve parantez kapa yan yana gelince siritan gozluklu adam cikiyor.
Hocam mesaj yazma ekranının alt kısmında
"Gülümseme kullanma" kutucuğu var orayı işaretleyince ne yazıldıysa o şekilde çıkması lazım.
Deneme 8)
Bu baslik altinda bir arkadasin LIS302DL MEMS motion sensor ile ilgili sorusu vardi.
teşekkürler sayın hocam
kit işyerinde kaldığı için deneyemiyorum
ilk fırsatta kodları inceleyeceğim
Hocam NVIC nedir ? Biraz Anlatabilirmisiniz ?(Bu birinci Sorum)
Alakasız ikinci Sorum CMSIS Nedir ? (Bir çeşit kütüphane mi ?)
NVIC Nested Vectored Interrupt Controller
Gelen interruptlari yoneten birimin adi. Bir interrupt geldiginde sapilacak adresi ogrenen, kesme icinde kesmelere de izin veren, interrupt onceliklerini ayarlamamiza saglayan donanim.
Interruptlarin kullanildigi ornek programlarimiza bakarsaniz yaptigimiz is, cevre biriminin interrupt ozelligini acmak, daha sonra da NVIC de bu interrupta izin vermek.
Iyi hatirlattin. Bir ara da birden fazla interrupt kullanan ornek yapalim ve interrupt oncelikleriyle oynayalim.
-----------------
CMSIS ise Cortex Microcontroller Software Interface Standart
Registerlerle ugrasip cevre birimlerini hazirliyoruz ya. Bu islem her islemci degistirdigimizde yeni bastan ogrenilmesi gereken bir islem. STM CM4 de calisiyoruz. Diyelimki registerlerle kedinin fareyle oynadigi gibi oynamaya basladiniz. Fakat ileri bir tarihte NXP CM4 islemci kullanmaya karar verdiniz. Bu kez bu cipin dokumanlarini da sil bastan okumaya baslayacagiz.
Gerci bir firmanin islemcisinde ustalasinca baska bir firmanin islemcisinde zorlanmazsiniz fakat dokumanlari sil bastan okumaniz gerekir.
CMSIS de rutinler standartlastirilmis. Hangi islemciyi kullanirsaniz kullanin degismeyecek. Fakat bunun icin CMSIS kullanimini ogrenmeniz gerekecek. Ben bu konuya hic girmeyecegim. Bir ara bir arkadas bu konuda notlar hazirlayacagini soylemisti.
Mesela NXP sitesinden aldigim bir ornek
/* Set PORT0_4 direction to output */
LPC_GPIO0->DIR |= 0x10;
/* Set PORT0_4 high */
LPC_GPIO0->DATA |= 0x10;
Ornegin yukarida bizim yaptigimiz gibi yani registerlere veri yukleyerek portun 4 nolu biti 1 yapilmis.Asagida ise CMSIS fonksiyonlari kullanilarak ayni islem yapilmis
/* Set PORT0_4 to output */
/* void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir) */
GPIOSetDir(0, 4, 1);
/* Set PORT0_4 to HIGH */
/*void GPIOSetValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal ) */
GPIOSetValue(0, 4, 1);
CMSIS evet bir kutuphane ve bana cok itici geliyor. Fakat bir kere ogrenirseniz rahat edebilirsiniz.
CMSIS rutinleri cipin icindeki ROMA gomulu hazir derlenmis fonksiyonlar da olabilir, derleme sonucunda elde edilecek fonksiyonlarda olabilir.
TI ciplerinde ROMDA duruyor. (Flash haricinde)
Yani Şunumu Anlamalıyım ?
CAMIS Öğrenirsem ST, NXP vs fark etmeden yazabilirim.
Emin olmamakla birlikte evet. Fakat bir elektronikci olarak guzelim registerler varken kafani bir suru ivir zivir fonksiyon isimleriyle dolduracaksin. Degermi?
Yazilimci olsan neyse.
ben pes ediyorum bunalmış hocam. açarsanız seneye tekrar alırım bu dersi. biraz daha picle uğraşmak gerek galiba. adc yi bile ayarlayamadım.
Bence öğrenme aşamasındayken işlemcileri iyice tanımak için register'larla çalışmakta fayda var. Ama iş birşeyler halletmeye ve proje yapmaya gelince CMSIS kullanmak daha mantıklı (rahat) geliyor. Özellikle taşınabilirlik açısından avantajlar getiriyor. Bu da tek bir üreticiye bağımlı kalmak istemeyenler için önemli bir özellik olabilir.
Alıntı yapılan: bunalmis - 27 Aralık 2011, 13:12:30
Emin olmamakla birlikte evet. Fakat bir elektronikci olarak guzelim registerler varken kafani bir suru ivir zivir fonksiyon isimleriyle dolduracaksin. Degermi?
Yazilimci olsan neyse.
Derste PIC anlatırken "Direncin Ne olduğunu Bilmeyen Birilerine"
Programlama biliyormusunuz Sorusuna "Hayııırr" cevabı ile birlikte sözlü olarak Yumurta Haşlatır çay demletirim.
Sonrasında Mutfaktaki Malzemeleri bilmeden yemek yapamaz, çay demleyemez, yumurta haşlayamazsınız derim. Sonrasında Stack reg, PC, Program Memory dalarız konuya.
Biz Böyle gidelim CAMIŞ dursun orada şimdilik. Donanıma Hakim olalım nerede neler yapılıyor?
AMa Katılım az neden ?
Yok oyle kacmak.
Simdi mantigi yeni yeni kavramaya basladiniz. Su ana kadar temel mantigi az bucuk anlamis olmaniz gerekiyor.
Hangi cevre birimini kullanmak istiyorsak o cevrebiriminin temel ayarlamalarini yapiyoruz.
Ornegin ADC kullanmak icin.
Oncelikle CPU clock ayarlamalarini yapiyoruz. AHB , ABP bus frekanslarini ayarliyoruz.
ADC cevre biriminin clock sinyalini harekete geciriyoruz.
ADC girisi icin kullanilacak pini Analog moduna geciriyoruz.
ADC icin diger ivir zivir ayarlari yapiyoruz.
Ivit zivir diyorum su ana kadar ben de ADC mizi kullanmayi denemedim.
Rehberin: REHBER
Labaratuvarin adi: Keil
Kitin adi: STM32F4 Discovery
Damarlarindaki kan: TURK KANI
Dot kadarcik kart sana pes dedirtiyorsa bu meslegi birakmalisin bosuna meslekte zaman kaybetme.
Kendini komutan yerine koy. Registerler de senin askerlerin. Sana bir gorev verildi. Senin yapacagin tek sey
askerlerine emretmek.
Yep yeni bir islemci ile calisiyorsunuz. Fazla tanimiyorsunuz. Isin basindasiniz. Gozunuz korkmasin.
Bu dunyada zor olan hic bir sey yoktur. Eksik bilgi ve bu bilgiyi temin etmeme vardir.
Basarisizligimizin tek sebebi problemin ustune gitmek yerine kacmaktir.
Boyle kacacaksaniz islerimizi yapsinlar diye bu ulkeye gavur teknisyenler gavur muhendisler mi getirecegiz?
-----------------------
ADC donanimini bastan asagi adim adim kullanmayi aciklayan not yazacagim. Zaman taniyin.
Zaman Sizin Hocam Ama Biraz Hızlı Gidiyoruz Sanırım.
Bence Giriş Çıkış işlemleri Pekişmeden Diğer Donanımlara Geçmemeliyiz. Sonrasında Birkaç Fonksiyon yazıp denemeliydik.(For, vs gibi yavaşlatma bekleme fonksiyonları gibi.) Sonrasında Ledler 7 segmentler gibi basitten gidip PWM ADC DAK gibi int gerektirmeyen sistemler ve Sonunda int rutinleri olabilirdi.
Şöyleki, Sorular bölümündeki verdiğiniz soruları çözemeyince Sönümlenme yaşayabiliriz.
Ama Hoca Sizsiniz Saygım Sonsuz Son Karar Sizin
Ben de uzun zamandır yoğunluktan uzak kalmıştım ARM işleriyle... Bu kitle oynamaya başladım ben de bugünlerde... Notlarımı paylaşacağım ben de ilerledikçe...
Bence de kimsenin gözü korkmasın. Datasheet'i 1300 sayfa görünce bende "oha" dedim ama sonra bakınca:
300 küsür sayfa usb on the go
100 küsür sayfa ethernet modüllerinin
Geri kalanlardan da 300-400 sayfa başlangıçta işimize yaramayan şeyler...
Yani asıl odaklanmamız gereken temelde 100-200 sayfa ve ilgilendiğimiz ana modüllere ait bölümler. Onların da her biri ortalama 30 sayfa felan...
Bence bu kit ve Bülent hocamızın emekleri herkes için büyük bir nimet... Artık şu memlekette "elektronik" diye bir sektör olmasının vakti gelmedi mi?
Yukardaki Yazımda, Kendi Üzerime Alarak Genelleme Yapmaktı amacım. Yazılımdan Yana Sıkıntım Olmaz. Ama C bilmeyenler Fonksiyonu/Parametreyi bilmeyenler olduğunu ve Register Kavramının nasıl oluştuğunu bilmeyenler vardır diye düşünüyorum.
Alıntı yapılan: muhittin_kaplan - 27 Aralık 2011, 13:43:19
Yukardaki Yazımda, Kendi Üzerime Alarak Genelleme Yapmaktı amacım. Yazılımdan Yana Sıkıntım Olmaz. Ama C bilmeyenler Fonksiyonu/Parametreyi bilmeyenler olduğunu ve Register Kavramının nasıl oluştuğunu bilmeyenler vardır diye düşünüyorum.
Yürümeden koşulmaz tabi. Bence ARM ile oynamaya başlamadan önce biraz temel gerekli:
1- Temel C programlama
2 - Temel Mikrodenetleyici bilgisi (en azından 8 bitlerle biraz oynamış olmak)
Belki bu konular başka bir başlık altında ayrıca işlenebilir. Zaten Bülent hocamız C programlama için başlıklar açmıştı.
dediğiniz mantığı anlamada sıkıntım yok. tüm ayarları yapıyorum. yanlış anlamıyorsam tabii. gelgelelim öyle bir kod yazıyorum ki. stlink utility ile kodu yükleyip resetleyince karttan bağlantı kopuyor. diyorum bir yerde büyük bir hata yapıyorum işlemci çküp mü kalıyor artık. tabii aynı kod debug etmeye çalışınca da bilmem kaçıncı adresten okumada hata oluştu diyor. program hatasız derleniyor. ama int rutininde işlemcinin işlemcinin doğasına mı dilin doğasına(meşhur doğa ;D) mı aykırı bir yazım yapıyom bilmiyom.
@fryrmnd
Download lamı yüklüyorsun ? eğer öyleyse bağlantıyı koparıyor doğru. ben önce debug yapıp programın yüklenmesini sağlıyor sonrasında debug ı kapatıp normal çalışmasını göslüyorum.
ben st link utility ile yüklüyorum hocam. programı yükleyince bağlantı kopmaması lazım. tabii düzgünse. bunalmış hocamın programlarda sıkıntı olmuyor mesela.
Bahsettigin hataya neden olan programin bulundugu klasoru oldugu gibi rarlayip bir yere yukle. Biz de soruna bir bakalim.
http://hotfile.com/dl/138653582/a97d93d/deneme.zip.html (http://hotfile.com/dl/138653582/a97d93d/deneme.zip.html)
buyrun hocam.
Hocam açıkçası benim de kafam iyice karıştı. Dersler hızlı, karmaşık ve bana göre üst seviyede gidiyor.
Çalışmaya okumaya nereden başlayayım hepten şaşırdım bir sürü konu var. C var, örnek proramlar var, örnek sorular var, bir sürü şamata var..
Çalışırken nereden başlayalım, nasıl bir yol izleyelim yardımcı olabilir misiniz?
stlink in vin7 64bit sürücüsü yok sanırım.
şimdi masaüstüne kurayım dedim yok.
muhittin hocam ben kullanıyorum 64bit win7 de . gayet güzel çalışıyor.
Kurdum çalıştı.
Hocam Sanki Keil Debug.ini de bir hata veriyor. ama neden bu programda veriyorda başkasında vermiyor ?
Alıntı yapılan: sayment - 27 Aralık 2011, 15:11:47
Hocam açıkçası benim de kafam iyice karıştı. Dersler hızlı, karmaşık ve bana göre üst seviyede gidiyor.
Çalışmaya okumaya nereden başlayayım hepten şaşırdım bir sürü konu var. C var, örnek proramlar var, örnek sorular var, bir sürü şamata var..
Çalışırken nereden başlayalım, nasıl bir yol izleyelim yardımcı olabilir misiniz?
C diline https://www.picproje.org/index.php/topic,35908.0.html (https://www.picproje.org/index.php/topic,35908.0.html) basligindaki samatalardan dolayi artik asina oldugunuzu varsayiyoruz. (Mukemmel C bilgisi gerekmiyor)
https://www.picproje.org/index.php/topic,35719.0.html (https://www.picproje.org/index.php/topic,35719.0.html) linkini okuyup denemeler yaparak Keil konusuna artik yabanci olmadiginizi varsayiyoruz.
https://www.picproje.org/index.php/topic,35721.0.html (https://www.picproje.org/index.php/topic,35721.0.html) yi okudugunuzu varsayiyoruz.
https://www.picproje.org/index.php/topic,35813.0.html (https://www.picproje.org/index.php/topic,35813.0.html) yi okudugunuzu ve bu terimlerle karsilastiginizda sorun olmayacagini varsayiyoruz.
https://www.picproje.org/index.php/topic,35896.0.html (https://www.picproje.org/index.php/topic,35896.0.html) deki ornekleri Keil de sirayla derleyip isletip Rehber dokumanini acip programi anlamaya calisiyoruz.
ORnegi anlamadan bir sonrakine kesinlikle gecmiyoruz. (VGA ve RTOS konusunu atlayin)
Anliyorsak https://www.picproje.org/index.php/topic,36897.0.html (https://www.picproje.org/index.php/topic,36897.0.html) yi okuyor ve sorulari cozmeye calisiyoruz.
Anlamiyorsak https://www.picproje.org/index.php/topic,36908.0.html (https://www.picproje.org/index.php/topic,36908.0.html) de konuyu tartisiyoruz.
Burada daha genel sorular soruyor ve tartisiyoruz. https://www.picproje.org/index.php/topic,35794.0.html (https://www.picproje.org/index.php/topic,35794.0.html)
Rehber ve Hard dokumanini elimizden dusurmuyoruz.
Alıntı yapılan: fryrmnd - 27 Aralık 2011, 14:54:15
http://hotfile.com/dl/138653582/a97d93d/deneme.zip.html (http://hotfile.com/dl/138653582/a97d93d/deneme.zip.html)
buyrun hocam.
Option for Target Target1 de Debug menuye gel.
Sag tarafta yani ST link Debugger tarafinda initializaion file kisminda yazan .\Debug.ini yi sil.
Bu dosya kartla calisirken kullanilmiyor.
Ayni sekilde Utilities menude init file kisminda yazan .\Debug.ini yi sil.
Yasadigin sorunun kaynagi bu.
Yok Hocam Bir Sıkıntı Var. Sanki Debugda Takılı Kalıyor.
STM32 ST-LINK Utility ile yüklemeyi denermisiniz ?
hocam silik çıktı zaten. ???
Alıntı Yap
Option for Target Target1 de Debug menuye gel.
Sag tarafta yani ST link Debugger tarafinda initializaion file kisminda yazan .\Debug.ini yi sil.
Bu dosya kartla calisirken kullanilmiyor.
Ayni sekilde Utilities menude init file kisminda yazan .\Debug.ini yi sil.
Yasadigin sorunun kaynagi bu.
Bir de options for Target for Target 1 de degug da
ST_Links tarafinda sagda Run to main de centigi kaldirin. Eger SystemInit fonksiyonunda hata yaparsaniz ve oradaki while vs dongulerinde takili kalirsa Debug takili kalir.
Stop ile durdurmaniz gerekir. Eger SystemInit i dogru yazdiysaniz Run to main centigini koyun. Boylece bosu bosuna Startup ve SystemInit i adimlatmak zorunda kalmazsiniz.
Programi karta yuklemek icin ben dogrudan Debug tusuna basiyorum.
F7 ile derle sonrada Ctrl F5
Alıntı yapılan: fryrmnd - 27 Aralık 2011, 15:48:06
hocam silik çıktı zaten.
Nasil silik cikti?
Bir ekran goruntusu verebilirmisin?
osilator seçeneği kaç mhz olacak hocam ?
normalde 8 ama st nin firmware inde 25 görünüyor.
hocam st util ile içeriği sildim.
Keilden debug.ini leri sildim
Flash/Download yaptım yüklemedi.
Debug Start Yaptım yükledi.
Stlink Utilden OpenFile yapıp Deneme.hex i seçtiğimde
"OpenFile Sucsess"
"The File is not downloded to the device...." hatası veriyor.
Yüklemeye devam et dediğimde yüklüyor.
Bağlantıyı kesene kadar "keilde Debug" Yapınca renk değiştiren led hep renk değiştiriyor.
Bağlantıyı kesip boardı resetleyince çalışıyor.
st util de st nin verdiği firmware demo da da aynı mesajı veriyor.
Option for target for target 1 de target menudeki xtal frekansinin bir ise yaradigina tanik olmadim.
Ne yazarsam yazayim sorunsuz calisiyor.
En iyisi ben deneme yaptigim klasoru rarlayip bir yere koyayim. Siz onu desktopa aynen acin. (Desktop altinda deneme klasoru, bunun da icinde dogrudan dosyalar)
Boylece benim bu projeye ozgu tum sorunsuz Keil vs setuplari sizde de olur. Bir de oyle bakin.
http://www.cncdesigner.com/STM/Deneme.rar
Bu dosyayi indirip acin. Bir deneyin.
Eger sorun yoksa main.c icini bosaltip ornek kodlarinizi buraya yazin.
Hocam Sorum şu
keil de programı yüklerken hangi yolu izliyorsunuz ?
bunalmış hocam silik çıktı dedğim. zaten debug.ini yi seçmemişim st link için. hatta keil için de kaldırmışım. yolladığım klasörde adc projesini doğru düzgün çalıştıramıyorum hocam. yolladığım haliyle siz debug edebildiniz mi.
@muhittin hocam utility programında hex dosyayı gösterince çipe yüklenmemiş gibi bir uyarı veriyor. program diyince yüklüyor bende. ama o programın debug etme özelliği yok yanlış görmediysem. disconnect etmeden de programı yükleyip reset e basınca çalışması lazım. ama onu disconnect etmeden keilde debug etmeye çalışırsanız olmuyor sanırım.
Alıntı yapılan: muhittin_kaplan - 27 Aralık 2011, 16:03:40
hocam st util ile içeriği sildim.
Keilden debug.ini leri sildim
Flash/Download yaptım yüklemedi.
Debug Start Yaptım yükledi.
Stlink Utilden OpenFile yapıp Deneme.hex i seçtiğimde
"OpenFile Sucsess"
"The File is not downloded to the device...." hatası veriyor.
Yüklemeye devam et dediğimde yüklüyor.
Bağlantıyı kesene kadar "keilde Debug" Yapınca renk değiştiren led hep renk değiştiriyor.
Bağlantıyı kesip boardı resetleyince çalışıyor.
Nerede okudum hatirlamiyorum. Flash programlamak icin DEBUG u kullanmak gerekiyor. Debug kullanmadan yapilan yuklemelerde sorun oluyormus ST yada Keil her kim ugrasiyorsa
bunu duzeltmemis deniyordu. Hic ugrasmayin Debugu baslattiginizda zaten kendisi otomatik yukleme yapiyor.
Alıntı yapılan: fryrmnd - 27 Aralık 2011, 16:11:25
bunalmış hocam silik çıktı dedğim. zaten debug.ini yi seçmemişim st link için. hatta keil için de kaldırmışım. yolladığım klasörde adc projesini doğru düzgün çalıştıramıyorum hocam. yolladığım haliyle siz debug edebildiniz mi.
@muhittin hocam utility programında hex dosyayı gösterince çipe yüklenmemiş gibi bir uyarı veriyor. program diyince yüklüyor bende. ama o programın debug etme özelliği yok yanlış görmediysem. disconnect etmeden de programı yükleyip reset e basınca çalışması lazım. ama onu disconnect etmeden keilde debug etmeye çalışırsanız olmuyor sanırım.
Iyide bana verdigin rarlanmis klasoru actigimda debug.iniler vardi. Bunlar senden geldi.
Alıntı YapNerede okudum hatirlamiyorum. Flash programlamak icin DEBUG u kullanmak gerekiyor. Debug kullanmadan yapilan yuklemelerde sorun oluyormus ST yada Keil her kim ugrasiyorsa
bunu duzeltmemis deniyordu. Hic ugrasmayin Debugu baslattiginizda zaten kendisi otomatik yukleme yapiyor.
Daha Önce Yine Benimle Konuşmuştunuz Hocam.
Keil bende Debug ini ile de yüklüyor bu arada hocam (Debug Start ile)
Yukluyor fakat Build Output penceresinde bir suru ivir zivir hata mesaji veriyor.
Debug.ini dosyasini kartsiz calismak icin hazirlamistik. Bunu Keil programinin kurulumu konusunda ozellikle vurguladik.
hocam sizin dosyadan da açtım adc dosyasını. debug dediğimde led turuncu yanıyor. f11 yapıyorum error veriyor. 0x8000020c den okumada hata diyor. size de saç baş yoldurduk .benim iki üç tel de daha bişey yapmadan gitti.
Deneme klasorunuzu sildiniz.
http://www.cncdesigner.com/STM/Deneme.rar (http://www.cncdesigner.com/STM/Deneme.rar) Deneme.rar i indirdiniz
Rar dosyasini Destop'a actiniz.
Deneme diye bir klasorunuz oldu. Icine girdiniz.
(Deneme icinde bir tane daha Deneme diye bir klasor varsa, Deneme altindaki tum dosyalari bir ustteki Deneme klasorunun altina tasiyin, onemi yok ama kafamiz rahat etsin)
Deneme.uvproj dosyasini cift tiklayin. Keil karsimiza gelsin.
F7 bastiniz. Derledi.
Rebuild target 'Target 1'
assembling startup_stm32f4xx.s...
creating preprocessor file for main.c...
compiling main.c...
linking...
Program Size: Code=788 RO-data=424 RW-data=11744 ZI-data=1632
"Deneme.axf" - 0 Error(s), 0 Warning(s).
Daha sonra CTRL F5 yaptiniz.
Load "C:\\Documents and Settings\\TI\\Desktop\\Deneme\\Deneme.AXF"
Mesaji aldiniz. değilmi. Ne 1 satir fazla ne 1 satir eksik.
hocam ben galiba karıştırmışım dosyaları. siz ayar options ayarlarını yapıp yolladınız sandım. bende ki adc dosyasını kullandım galiba. işyerinde kaldı o artık evden giriyom.
dedikleriniz aynen oldu. debug da run edebiliyorum. ama benim adc dosyamda aynısını yapamıyorum. size yolladığım adc elinizde duruyorsa yollayabilirmisiniz hocam. sizin deneme de main içine yazıp çalıştırayım.
Bu Başlık Biraz (Özellikle Son Mesajlar ) Temizlenirse Güzel Olur Kanısındayım.
bunalmış hocam gene ben. şimdi hafızdan hafızaya memroy örneğinizi debug ettim. target dizisini izlemeye aldım. target[ 0 ]=0, target[ 1 ] =1
gibisinden gidiyor. şimdi yanlarında da semboller çıkıyor. sebebini merak ettim.(herşeyi bitirdim ya!). bir de char tipi diziye int tipi değerleri 8 bit lik transfer ile atıyoruz.yanılmıyorsam. bu vhar int olayından mı kaynaklanıyor. mı kaynaklanıyor.
char Source[1024];
volatile int i;
for(i=0;i<1024;i++) Source [ i ] =i;
Burada char tipindeki arraya int tanimli i uzerinden gene char veri aktariyoruz. Asagidakiler gibi de yapabilirdik fakat herhangi bir avantaji olmazdi.
for(i=0;i<1024;i++) Source [ i ] =(char) i;
yada
char n;
n=0;
for(i=0;i<1024;i++) { Source [ i ] =n; n++}
Target alanina veriler atildikca yanlarinda sembollerde cikiyor derken 0x20000000 adresli memory penceresinde semboller cikiyorsa pencere ASCI gosterim icin ayarlanmis olabilir.
Memory window da verilerin oldugu alanda sag click yapip gosterilecek verilerin decimal, ASCI, unsigned vs olusunu ayarlayabilirsin.
hocam watch 1 de target a bakıyorum.target dizisini açınca dizinin elemanları için value nun altında decimal değerleri ve yanlarında tırnak içerisinde semboller gözüküyor.
Char verilerin ASCI karşılıklarını gösteriyor.
timer 1 APB2ENR ile çaıştırmaya başladıktan sonra. 84mhz olan hatta da daha önce açıklandığı gibi iki kat hızlı çalışma durumu mevcutmudur ?
evet hocam dediğiniz gibi.
Bunalmıs Hocam;
Keilin Toolbarinda Derleme sırasında Load ikonu var onu tıkladıgımda
Load "C:\\Documents and Settings\\TI\\Desktop\\Deneme\\Deneme.AXF"
gibi mesaj cıkıyor. Kit uzerindeki Resete bastıgımda veya USB baglantısını cıkarıp taktıgımda kite yuklenen program calısmıyor.
Yalnız Derlemeden sonra
CTRL + F5 yaparsam debug moduna giriyoriyor. Adım adım calıstırdıgımda calısıyor veya Debug moddan cıkınca program atılmıs oluyor.
Debug moduna girmeden program atamıyormuyuz.
Teşekkürler
7. soru ile ilgilenen pek yok galiba =)
yarın kartımı bitirir bitirmez kolları sıvıyorum hocam merak etmeyin :)
@m_b
Maalesef atamıyoruz.
keil de debug etmeden program atılmıyor. st nin sitesinde stlink utility var onu kullanabilirsiniz.
ersin hocam daha 6 yı yapamadım ;D. nerden çıktı 7.
Timer1 Zamanlaması Nasıl Yapılıyor ?
zamanlaması derken hocam. belli sürese sonunda kesme almak için gibi mi sordunuz.
Bunalmı Hoca Timer7 ile yaıp Bunu Timer 1 ile sormuştu. yaptım ama bir türlü zamanlamayı tutturamadım.
hocam hızlı mı yanıyor ledler.
evet.
hocam prescaler ve auto reload register yüklemesinde sıkıntı olabilir. yazarsanız kodları bakabilirim belki bulurum sıkıntıyı.
Kodları vereyim yanlız Amacım Bir Standart Oluşturmak. Yani Timer lar nasıl ayarlanır.
#include "STM32F4xx.h"
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 = 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()
{
RCC->APB2ENR|=0x00000001; // Timer1 CLK'u aktif edelim (84 Mhz)
TIM1->CR1=0x0080; // Otomatik Reload
TIM1->PSC =42000-1; // Prescaler değerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 42E6 / (42000) = 1000 Hz
TIM1->ARR =2000; // Counter, Decimal 2000 olunca basa donsun 1 sn demek
TIM1->CR1|=0x0001; // Counter Enable
while(1)
{
if (TIM1->CNT > 1000) GPIOD->ODR= 0x0000F000; // Ledler yansin
else GPIOD->ODR= 0x00000000; // Ledler sonsun
}
}
// Programin sonu
#include "STM32F4xx.h"
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 = 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()
{
RCC->APB2ENR|=0x00000001; // Timer1 CLK'u aktif edelim (84 Mhz)
TIM1->CR1=0x0080; // Otomatik Reload
TIM1->PSC =42000-1; // Prescaler değerimiz 42000, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (42000) = 4000 Hz
TIM1->ARR =4000; // Counter, Decimal 2000 olunca basa donsun 1 sn demek
TIM1->CR1|=0x0001; // Counter Enable
while(1)
{
if (TIM1->CNT > 2000) GPIOD->ODR= 0x0000F000; // Ledler yansin
else GPIOD->ODR= 0x00000000; // Ledler sonsun
}
}
// Programin sonu
hocam birde böyle deneyin. prescaler ve arr hesaplamalarınızda yanlışık var.
şöyle ek yapayım. hocam sanırım timerların hepsinde clock aktif etme, otomatik reload,counter enable vs sabit var. sadece timer clock frekansı ne. timer 1 apb2(84) den aldığı için 84x2Mhz oluyor. 42000 prescaler verirsek. 4000 hz ediyor.bu yüzden otomatik reload 4000 verirsek 1sn debir yanıp söner. tabii if bloğunun içinde 2000 değeriverice ki saniyenin yarısı sönsün yarısında yansın
hehe evet ;D https://www.picproje.org/index.php/topic,35896.15.html
ben hala dac çalıştıramadım. :'(
Tamam 48Mhz olan hat (timer7 nin) 84 de bu ise 168 de çalışıyor.
bu arada Herşyin bir zamanı var yavaş yavaş gidelim.
Yanlız Şu "Camış" işine girmek gerek.
http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php
CMSIS de aslı ben camış diyorum.
Arkadaşlar ADC de injected ve regular kanallar arasındaki fark nedir anlayamadım? Yani nerede hangisi kullanılır.
Edit:İnjected kanallar clock pulsleri dışardan alanlarmı?
yok hocam regular grup da dışardan trigger oluyor gözüküyo. neden böyle bir ayrım var ben de bilimiyorum
Evet söylediğin doğru. Sanırım injected olarak ayarlanmış bir adc de kullanılan kanallardan bir adc sonucu bitmeden diğer bir kanaldan istediğimiz bir anda 2. okumayı yapabiliyoruz. Karışık oldu ama .... mesela injected olarak ayarlanmış ADC1 'e ait 2 kanal düşünelim , 1. kanaldan adc çevrimini başlattım , adc sonucunun ADC injected data register'e yazılabilmesi için geçen süre sampling + convertion olacak (3 clk + 12 clk). 1. kanalda sampling süresi geçtikten sonra ADC1 in diğer bir kanalından 2. adc çevrimine başlayabiliyoruz. Regularda bu yok . Bu konuyu aslında Simultaneous(eş zamanlı) çalışma ile karıştırdım. Ama eş zamanlı çalışmada ADC1 ve ADC2 kanalları kullanılıyor. dsPIC'lerde sequential çalışma gibi değilmiş. Regularde ise sanırım herşey sıra ile oluyor.
Regular kanallarla injected kanllar birlikte de kullanılabiliyor galiba.. Baya karıştı . Vesselam...
anladım hocam. çevrim süresi bitmeden farklı kanaldan da çevrime başlayabiliyoruz. bu regular da yok. teşekkür ederim bilgilendirmeniz için. sadece microchip ile uğraşmış biri olarak bu st nin datasheet ler bana biraz daha karışık geldi. çok fazla tecrübemin olamaması da etken tabii.
injected grup stm32 modellerine göre değişmekle beraber 4 kanala kadar yazılım ya da donanımsal olarak tetiklenebilen ve bu tetikleme işlemi ile regular kanaldaki adc dönüşümlerini durduran bir adc yapısıdır. injected adc dönüşümü bitince regular kanallardaki dönüşümler devam edecektir. regular gruptan farklı olarak ta injected dönüşümde farklı birer sonuç ve ofset register ları mevcut.
Genelde injected adc işlemi motor kontrolu gibi pwm işareti ile eşgüdümlü adc işlemi yapmak için kullanılıyor.
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00258017.pdf (http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00258017.pdf)
adc modlarının ne işe yaradığı, ne tarz uygumalarda kullanılabileceği hakkında bir uygulma notu.
Alıntı yapılan: bunalmis - 26 Aralık 2011, 22:32:57
Bu baslik altinda bir arkadasin LIS302DL MEMS motion sensor ile ilgili sorusu vardi. Ornek kodlardaki MEMS uygulamasini tekrar denedigimde bazen tutarsiz davrandigini gordum.
Asagidaki programda, karti elinizle tutup egdikce ledler egilen yonde isildiyor.
#include "STM32F4xx.h"
unsigned short PWM[8]; // PWM registerler
unsigned short SRG[8]; // Shadow Registerler
unsigned short CNTR; // PWM Counter
signed char who,x,y,z,xo,yo,zo;
/*****************************************************************************************************
CPU PLL ile 168Mhz de kosturulur
AHB frekansy 168 Mhz
APB1 frekansy 42 Mhz
APB2 frekansy 84 Mhz
*****************************************************************************************************/
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
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>=255)
{
CNTR=0;
for(i=0;i<8;i++)
{
if(PWM[i]>255) PWM[i]=255;
SRG[i]=PWM[i];
}
}
j=0x8000;
for(i=0;i<8;i++)
{
if (CNTR>=SRG[i]) d&=~j;
j=j>>1;
}
GPIOD->ODR=d;
}
void Write(char Adr,unsigned char Data)
{
GPIOE->BSRRH=0x0008; // LIS302DL CS=0
SPI1->DR=((Adr&0x3F)<<|Data;
while(!(SPI1->SR&2));
GPIOE->BSRRL=0x0008; // LIS302DL CS=1
}
char Read(char Adr)
{
char Dat;
GPIOE->BSRRH=0x0008; // LIS302DL CS=0
SPI1->DR=((Adr&0x3F)|0x80)<<8;
while(!(SPI1->SR&1));
Dat=SPI1->DR;
GPIOE->BSRRL=0x0008; // LIS302DL CS=1
return(Dat);
}
int main()
{
int i;
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)+xo);
xo=x>>1;
if (x>=0) PWM[0]=x;
else PWM[2]=-x;
}
if (who&2)
{
y=Read(0x2B)+yo;
yo=y>>1;
if (y>=0) PWM[1]=y;
else PWM[3]=-y;
}
if (who&4)
{
z=Read(0x2D);
}
}
}
TIM7->DIER=0x0000; // Update Int disable
while(1)
{
for(i=0;i<0x1000000;i++);
GPIOD->ODR^=0x0000F000;
}
}
(http://img268.imageshack.us/img268/3680/screenshotgz.jpg)
hocam iyi geceler.
bir konuda yardımınıza ihtiyacım var
logic anayzerimi spi moduna ayarladım
önce yüksek değerli bitler
sonrada düşük değerlikli bitler first olarak sample aldım
program çalışmaya başlar başlamaz
bu data geliyor
configuration ayarları gibi sanırım
fakat buradaki değerler ile yukarıdaki programın değerleri arasında
if(Read(0x0F)==0x3B) // Who are you ?
daki 0x0F dışında hiçbir değer tutmuyor bende hangisini bizim gönderdiğimizi hangisinin sensörden gelen açı bilgisi olduğunu ayırt edemiyorum
eğer birazcık ipucu verirseniz bu şeyi çozmek istiyorum
datalara dikkat ettinizmi bilmiyorum yada sizdede logic analyzer vardır mutlaka
bu datalar doğru gelmişmi mosi ile miso datalarında sanki bi gariplik var yada ben çözemedim mesela resimde bakarsanız
0x22 ile 0xFF
0x13 ile 0x17
0x03 ile 0x8B
alt alta geliyor bunlar neye göre gidip geliyor 3 gündür bakıyorum datasheetlerede fakat bir ucundan yakalayamadım işi
derdimi anlatabilmişimdir umarım biraz uzun oldu :(
şimdiden cok teşekkür ederim herkese iyi geceler...
Gambit Neden Dataları Görmek İstiyorsun ?
SPI ile gönderilen
0x27
0x28
0x29
adreslerden X,Y,Z bilgileri alınıyor.
0x20 adresinde Config ayarlanıyor.
bunları için Sensörün Datasına Bak..
Alıntı yapılan: muhittin_kaplan - 05 Şubat 2012, 10:39:22
Gambit Neden Dataları Görmek İstiyorsun ?
SPI ile gönderilen
0x27
0x28
0x29
adreslerden X,Y,Z bilgileri alınıyor.
0x20 adresinde Config ayarlanıyor.
bunları için Sensörün Datasına Bak..
hocam dedikleriniz doğru fakat neden ben bunları logic analyzer ile göremiyorum onu anlamış değilim ayarlarınımı yanlış yapıyorum bilemedim...
gönderip aldığımı gormeden başlarsam cok zorlanırım ileride.
Bu kodda bir zamanlar hata vardi. Daha sonra nedeni anlasildi ve duzeltildi.
Asagidaki program parcasi uzerinde calisin.
https://www.picproje.org/index.php/topic,35896.msg269160.html#msg269160
Alıntı yapılan: bunalmis - 05 Şubat 2012, 16:15:53
Bu kodda bir zamanlar hata vardi. Daha sonra nedeni anlasildi ve duzeltildi.
Asagidaki program parcasi uzerinde calisin.
https://www.picproje.org/index.php/topic,35896.msg269160.html#msg269160
hocam cok teşekkür ederim..
son düzeltilmiş örneği ve datasheetleri iyice kurcaladıktan sonra biraz yol katettim diyebilriim
spi iletişim mantığına göre gönderilen 8 bitlik datanın
ilk 2 biti read write ve multiple okuma ayarlarını barındırdığı için bunları gözardı ediyormuşuz
yani logic analyzerden
1000 0111 yani 87 datası geliyorsa bunu
xx00 0111 yani 07 olarak okumamız gerekiyormuş
fakat ufak bir sorum daha var mazur görün.
signed char Read(char Adr)
{
return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
}
şu minik programcıkta
b=Read(0x29) dedik mesela
şimdi read yaparken
return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
satırında adr yerine 0x29 yazarsak
29= 0010 1001
3F= 0011 1111
& = 0010 1001 = 29
80= 1000 0000
| = 1010 1001 = A9 buluyoruz
0xA9 u <<8 yaparsakta sağdan 8 sıfır ile besleyerek 0x00 bulmazmıyız
yani read adr yerine ne yazarsak yazalım sonuç 0x00 olarak dönmüyormu yoksa ben biyerdemi saçmalıyorum anlayamadım :(
aynı şekilde
return(SPI_CMD(((Adr&0x3F)<<8 )|Data));
buradaki write programcığındada adres değeri ne olursa olsun en sonunda silinip yerine data yazılmıyormu ozaman adres değerini yazmanın ne anlamı var anlayamadım
saygılar.
Bizim kullaniminizda SPI registerleri 16 bit.
CM4 nun SPI registerlerine bir goz atin.
Bir de haberlestigimiz cipin komut setine bakin. Bit treninde adres nereye yerlesiyor veri nereye yerlesiyor bakin.
Hocam Bu arada Başka Örnek Program verecekmisiniz :-[
ADC gibi yada Kartın üzerindeki DAC gibi
CMIS da bir anlamda iyi olurdu. Nasıl Kullanılır, nelerden oluşur, Kimdir nedir, Ayımıdır Kurtmudur, Çalımıdır Murt mudur
Su siralar yogun oldugum icin hizim kesildi kartla pek ilgilenemiyorum. Fakat bunca kart sahibinden de artik ornek programlar bekleme zamani geldi diye dusunuyorum. Kart uzerindeki Audio DAC icin ornek diyorsan bu cipi tanimak bir hayli ugrastirici. Bana cok da cazip gelmedigi icin registerlerine detayli inceleme ihtiyaci duymadim.
Eger sizin de bu cipe odaklanma durumunuz yoksa STM nin bu ciple uygulamalarinin bulundugu ornek programlarda kullanilmis hazir fonksiyonlari kullanabilirsiniz.
#include "STM32F4xx.h"
unsigned char WAdr,RAdr;
char RxBuf[128];
/*****************************************************************************************************
CPU PLL ile 168Mhz de kosturulur
AHB frekansy 168 Mhz
APB1 frekansy 42 Mhz
APB2 frekansy 84 Mhz
*****************************************************************************************************/
void SystemInit()
{
volatile 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
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;
}
//-----------------------------------------------------------------------------------------------------------USART3_IRQHandler
void USART3_IRQHandler()
{
volatile int Sts;
Sts=USART3->SR;
RxBuf[WAdr]=USART3->DR;
WAdr=(WAdr+1)&0x7F;
}
//-----------------------------------------------------------------------------------------------------------SPI_CMD
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);
}
//-----------------------------------------------------------------------------------------------------------SpiWrite
signed char SpiWrite(char Adr,unsigned char Data)
{
return(SPI_CMD(((Adr&0x3F)<<8 )|Data));
}
//-----------------------------------------------------------------------------------------------------------SpiRead
signed char SpiRead(char Adr)
{
return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
}
//-----------------------------------------------------------------------------------------------------------SendChar
void SendChar(int Tx)
{
while(!(USART3->SR&0x80)); // TX Buffer dolu ise bekle (Rehber Sayfa 646)
USART3->DR=Tx;
}
//-----------------------------------------------------------------------------------------------------------UsartInit
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
}
//-----------------------------------------------------------------------------------------------------------main
int main()
{
int i;
signed char who,xo,yo;
short x=0,y=0;
UsartInit();
if(SpiRead(0x0F)==0x3B) // Who are you ?
{
SpiWrite(0x20,0x47); // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable
while(!(SpiRead(0x27)&1));
xo=SpiRead(0x29);
while(!(SpiRead(0x27)&2));
yo=SpiRead(0x2B);
while(1)
{
who=SpiRead(0x27); // Statusu ogrenelim. Kim hazir kim değil?
if (who&1)
{
x=(SpiRead(0x29));
SendChar(x);
//SendChar(0x0A);
}
// if (who&2)
// {
// y=(SpiRead(0x2B));
// SendChar(y);
// SendChar(0x0A);
// }
}
}
TIM7->DIER=0x0000; // Update Int disable
while(1)
{
for(i=0;i<0x1000000;i++);
GPIOD->ODR^=0x0000F000;
}
}
//-----------------------------------------------------------------------------------------------------------STOP
programda X den aldgım bilgiyi Usart tan göndrmee çalışıyorum. Yanlış gidn birşeyler var gibi geliyor bana
değer 0-255 arasında olmalı değilmi ?
X yönünde oynattığım değişim görmem gerek ama anlamsız bir değişim var
ADC örneğini "Örnek temel programlar" başlışındaki accelerometer örneği ile biraz modifiye ettim. sorun yok.
Kodlarını incelemedim sorunun nerede bilmiyorum. Bu örneğe bakarak sorunun kaynağını tespit edebilirsin.
#include "STM32F4xx.h"
#include "stdio.h"
unsigned char WAdr,RAdr;
char RxBuf[128];
char TxBuf[128];
unsigned char timer_update=0;
uint16_t adc_val;
/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/
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 |= 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
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 =5; // 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
RCC->APB2ENR|=0x00000100; // ADC saat kaynağını aktif ettik.
//PB->MODER.p0 = PORT_ANALOG; // PortB0 analog
GPIOB->MODER |= 0x00000003;
ADC1->CR1 |=0x00000100; // ADC scan modunda çalışacak.
ADC1->SQR3 |= 0x00000008; // Çevrime ilk girecek kanal 8. (PB0)
ADC1->CR2 |=0x00000003; // AD converter'i açtık. Sürekli çevirim yapacağımızı belirttik.
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;
}
/*********************************************************************************
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);
}
void TIM7_IRQHandler()
{
TIM7->SR=0;
timer_update=1;
}
// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir
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()
{
unsigned int ledtime;
signed char who, b;
UsartInit();
SendTxt("PicProje");
ADC1->CR2 |=0x40000000; // ADC çevrimini başlattık.
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)
{
b=Read(0x29);
}
if(ADC1->SR & 0x0002){
ADC1->SR &= ~0x0002;
adc_val = ADC1->DR;
}
if(timer_update){
timer_update=0;
if(++ledtime > 5000){
ledtime =0;
GPIOD->ODR ^= 0x0000008000;
// sprintf(TxBuf,"ADC Degeri :%u\r",adc_val);
sprintf(TxBuf,"X = %d\r",b);
SendTxt(TxBuf);
}
}
};
}
Verdiğiniz Program Tam Olarak ne Yapıyor Hocam ?
kartın eğimine göre X ekseni ( Y de olabilir) açısını seri porttan gönderiyor.
"sprintf" i stdio dan mı çalışıyor hocam ?
evet.
Yeri Gelmişken Sorayım Ozaman.
Bu STDIO bu chip için düzenlenmiş/yazılmış olmalı değil mi ?
Doğrudan işlemci için değil ama işlemci ailesi için düzenlenmiş olması gerekebilir. emin değilim.
Alıntı Yapsprintf fonksiyonu da, printf ve fprintf fonksiyonlarına benzer şekilde çalışmaktadır. Bu fonksiyonun diğerlerinden temel farkı ise, yazacağı ifadeleri bir dosyaya ya da ekrana değil, bir karakter katarına yazmasıdır
???
Şaşırmayın Hocam Dediğinizi Desteklemek için Alıntı yaptım biryerden.