STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

z

Adı üstünde SystemInit.

Bu işlemcinin öncelikle clock kaynağını seçeceksin.
PLL varsa bunu istenen değere kitleyeceksin.
Kullanılacak donanımları clk ile besleyeceksin.
Veri yollarının hızlarını belirleyeceksin.
Portlardan I/O olarak kullanılacakları, ilave fonksiyonlara ait giriş çıkışları belirleyeceksin.
Timer, ADC, PWM vs kullanılacaksa bunları ayarlayacaksın.

Bu böyle devam eder. Fakat olmazsa olmaz iki ayar ilk iki ayardır. Diğerleri yeri geldikçe ayrıca da ayarlanabilir.

Tüm bunları yapabilmek için de bu çipin registerlerini anlatan dokumanın ilgili bölümlerini dikkatlice okumak gerekecek.

Arm mimarisini bilmek işleri kesinlikle kolaylaştırır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

#1111
Alıntı YapArm mimarisini bilmek işleri kesinlikle kolaylaştırır.
evet sanki sıkıntım buradan kaynaklı.
neyse bugün kendime görev seçtim. 32f100 ün sistem ayarlarını yapıp DAC dan belli bir gerilim alacağım.

mesaj birleştirme:: 20 Ekim 2012, 18:17:27

system_stm32f10x.c

dosyası bu systeminit i yerimize yapıyor sanırım

mesaj birleştirme:: 20 Ekim 2012, 22:10:33

#include <stm32f10x.h>

void SystemInit(void) 

{
	RCC->CR |= 0x00010000;          //HSEON=1	High Speed External Osc ON
	while(!(RCC->CR & 0x00020000)); //Harici osilatörün stabil olması için bekleniliyor(6 komut çevrimi)
	RCC->CIR |= 0x00080000;         //HSERDYC: HSE ready interrupt cleared
	RCC->CR |= 0x00080000;          //Clock security system Enabled.
	RCC->CIR |= 0x00800000;         //CSSC: Clock security system interrupt cleared.
	RCC->CR |= 0x00040000;          //HSE bypassed.  
	
	RCC->CFGR |= 0x00000080;       //AHB configuration -> 1000: SYSCLK divided by 2
	RCC->CFGR |= 0x00002000;       //APB2 configuration -> 100: HCLK divided by 2
	RCC->APB2ENR |= 0x0000001C;    //PORT C,A,B Clock Enabled.  
//-------------------------------------------------------------------------------------------------
	RCC->APB1ENR |=0x20000000;	//DAC Enable
   	
	GPIOA->CRL &= 0x00000000;   //Aportu analog giriş
	GPIOA->CRL |= 0x00000000;     
	GPIOA->CRH &= 0x00000000;
	GPIOA->CRH |= 0x00000000;    
	DAC->CR |=0x00000003; 		//DAC Channel1 Enable, Buffer Disable
//-------------------------------------------------------------------------------------------------	
	GPIOC->CRL &= 0x00000000;
	GPIOC->CRL |= 0x33333333;     //PC0-7 Çıkış olarak ayarlandı (Max 50MHz)
	
	GPIOC->CRH &= 0x00000000;
	GPIOC->CRH |= 0x33333333;    //PC8-15 Çıkış olarak ayarlandı (Max 50MHz)
}

void delay(int Z)
{
	while(--Z);		 
}

main ()
{
	while (1)  // sonsuz döngü
	{
		Deger++;
		
		GPIOC->ODR=0xFFFFFFFF;
			delay(0x00000FFF);
		
		GPIOC->ODR=0x00000000;
			delay(0x00000FFF);
		
		DAC->DHR12R1=0x000000FF;

/*
DACoutput=VREF * (DHR12R1 / 4095)
*/
	}
}


Herhalde oldu.
Yanlız Hocam cm4 de sizin yazdığınız dac tan kopya çıkarttım keza datasından birşey anlamadım. (epey inceledim ama)
DAC->CR |=0x00000003; de siz buffer enable demişsiniz datasında 1 değer verildiğinde disable yazıyor.

Enginar

#1112
Arkadaşlar SPI haberleşmesinin mantığını öğrenip yazılan kodlarla karşılaştırıp kavramaya çalışıyorum.Kavrayamadığım noktalar var.Yardımcı olursanız sevinirim :)

Full duplex iletişimde shift registerin Tx , Rx bufferla ve SPI_DR ile olan ilişkisi nasıldır ? full duplexte bi bit veri yollandıgı zaman karşıdanda bi bit veri geliyo diye biliyorum.ama bu bilgiyi yukarda adı geçen registerlerle bağdaştıramadım bi türlü  :'(

dökümandan anladığım kadarıyla 2 tane 8 bitlik shift register var ? 1. shift registere 1 bit bilgi yazılınca 2. shift registerdende 1 bit bilgi okunuyo ?

Aydınlanmaya ihtiyacım var :)

Klein

SPI_DR hem alma hem de gönderme için kullanılan register. SPI haberleşmede  Master tarafı CLK verdiği sürece registerde data varsa datayı gönderir. Aynı zamanda girişi de okur.  Ve aynı registere yazar.

SPI master veri göndermeye başladı. İlk biti pine çıktı. CLK pininden darbeyi verdi. 1. bit gittiğinde 1. bitin yeri boşaldı. Buraya da giriş pinindeki bilgiyi yazdı. Bu bilgi genelde ilk 8 bit için 1 olacaktır.  Çünkü karşı taraf bizim ne istediğimizi bilmiyor. İlk 8 bit gittikten sonra  karşı taraf bizim ne istediğimizi biliyor artık. Biz halen clk basmaya devam ediyoruz. Karşı taraf da her darbede bize bilgiyi gönderiyor. Gelen veri de SPI_DR registerine yazılıyor. 8 darbe sonunda  SPI_DR registerini okuyoruz.  Eğer birden fazla bilgiyi peşpeşe göndermesini istemişsek , clk basmayı kesmiyoruz ve her 8 veya 16 darbeden sonra SPI_DR registerini okuyoruz.

Enginar

Klein Hocam verdiğiniz bilgiler için teşekkür ederim kafamdaki başka bi soruya cevap buldum ama sorduğum soru için tatmin olamadım :)

Asıl öğrenmek istediğim Rx Tx buffer ve Shift registerin bu iletişimde nasıl bir rol üstlendikleri ?

Klein

Şöyle:
İki tane shift register var. TX buffere bağlı olan paralel giriş seri çıkış. RX buffer e bağlı olansa seri giriş paralel çıkış.  CLK kaynakları aynı. shift registere clk verildiğinde tx bufferdeki bir bit seri çıkışa ötelenirken , seri girişteki bit de rx buffer'e aktarılıyor.  Ancak bu TX ve RX bufferler ayrı ayrı değil. İkisi de aynı. SPI_DR registeri.  SPI_DR registeri bir yandan ötelenerek boşaltılırken , diğer yandan da girişteki bilgi ile dolduruluyor.

Enginar

Heh hocam istediğim yanıt buydu teşekkür ederim :).Dökümanlardan inceledimde biraz kafam karışmıştı şimdi oturdu :)

muhittin_kaplan

kod korumasını nasıl yapacağız ?

Klein

@muhittin  kitimi yedin :)

STLink Utility ile kod koruması atayım dedim. Option bitini programlarken işin yarısında program uçtu.
Şimdi kart ile bağlantı kurulamıyor.

muhittin_kaplan

Yok Aklıma Geldi. Nasıl Yaparız Bu işi ?

z

Bir ara kartımı bende uçurmuştum. Daha sonra kendimce bir yöntemle kurtardım ve nasıl yaptığımı yazmıştım.

Bitbanding tartışması içinde diye hatırlıyorum. Gene bir başka arkadaş bir kurtarma şeklini yazmıştı. (Ama forumda nerede?)

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

Klein

Evet o tartışmayı hatırlıyorum ama bulamadım.
SWD pinlerinin program içinde kullanılması sonucu oluşan boot sorununu , boot0 pinini VDD'ye çekip, resete basılı tutup, program komutu verir vermez reseti bırakarak çözmüşler.

muhittin_kaplan

evet ben yaşamıştım. SWD pinlerini programdan değiştirmiş ve program atamamıştım. sonrasında Reset e basılı tutup olayı çözmüştüm.
şimdi program başlamadan bir gecikme koyuyorum (System init içerisinde ki gecikmelerde bu açıdan yararlı)

Klein

Benimki boot bini ile ilgili değil.  Muhtemelen Write protectlerle ilgili veya bootloader uçtu.
Senin kod koruma sorusu ile uğraşırken oldu ,çözümü de senden bekliyorum :)

muhittin_kaplan

Çalışmadığım Yerden Soruyorsunuz Hep.