STM32F10X Çalışmalarım

Başlatan Mucit23, 12 Mart 2012, 11:17:48

Mucit23

Arkadaşlar STM32F107 ile led yakıp söndürmeye çalışıyorum. Uğraşa uğraşa öğreneceğim.
Bu işlemcide giriş çıkış işlemlerinin nasıl yapılacağını çözemedim.
STM32F107 de GPIO işlemleri için birçok register var.

GPIOX_CRL
GPIOX_CRH
GPIOX_IDR
GPIOX_ODR
GPIO_BSSR
GPIO_BRR
Bu registerlerin her bri farklı bir amaca hizmet ediyor. Bunlar nelerdir. Hangi durumlarda kullanıması gerekiyor

Alışmışız tabi Piclere, Bi TrisX Birde PORTX ile işi bitiriyorduk. Bunları inceleyince epeyce bi afalldım. :o

Ben sağdan soldan kopya çekerek PE8 'e bağlı ledi yakıp söndürecek bir bir program hazırladım.

/******************************************************************************/

#include <stm32f10x_cl.h>

int main (void) {
  int  d;

  SystemInit();

  /* Setup GPIO for LEDs                                                      */
  RCC->APB2ENR |=  1 <<  6;             /* Enable GPIOE clock                 */
  GPIOE->CRH    = 0x33333333;           /* Configure the GPIO for LEDs        */
             
 while (1)
 {
    GPIOE->BSRR = 0x0100;
      for (d = 0; d < 1000000; d++); 
    GPIOE->BSRR = 0x0000;            
	for (d = 0; d < 1000000; d++); 
  }
}


Burada yanmasını isediğim led yanıyor fakat sönmüyor. Acaba Söndürmek için PE8'e 0 yüklemek yetmiyormu, Başka neler yapmam gerekiyor. Açıklarsanız sevinirim.



JKramer

IDR -> PORT
ODR -> LAT

CRL ve CRH da giriş (analog, dijital, vs.) ve çıkış (push-pull, open drain, vs.) ayarlamaları için. Reference manual'da 156. sayfada bir tablo var. BSRR ve BRR'yi şimdilik boşverin. Reference manual sürekli yanınızda olsun; ikinci monitor varsa orada, yoksa çıktı alıp masada dursun :).

Klein


Mucit23

STM32F107 nin manualini 3 cilt olarak çıktı aldım. Devamlı masamda duruyor.
Galiba çözdüm sorun düzelti. Şimdi çalışıyor

GPIOX_BSSR Registeri 32 bitlik, ilk 16 bit Herhangi bir pini set etmek için kullanılıyor, Diğer yüksek 16 bit ise herhangi bir pini resetlemek için kullanılıyor. Yüksek 16bitte resetlenmesini istediğin pine 1 yazıyorsun. 0 yazmanın bir etkisi yokmuş

Mucit23

Klein hocam ODR ye baktım şimdi. Bu daha kolaymış. Set etmek istediğin pine 1 yazman yeterli, Resetlemek için  0 yazılması gerekiyor

Mucit23

Arakdaşlar Keilde Daha önce yapılmış bir projeyi açtığımda kodlar ekrana gelmiyor. Ama bu halde iken Kodu derleyebiliyor hatta mcu ya yükleyebiliyorum. Yazılan kodlar neden editöre gelmiyor?

JKramer

Sol taraftaki "Project" penceresinde dosyalar gözükmüyor mu?

Mucit23

Her seferinde Project sekmesinden open project diyip klasörü bulup editöre getirmem gerekiyor.

Mucit23

Arkadaşlar Tekrardan merhaba.
Bugün birikmiş sorularımı sizlere sormak istiyorum
Ara Ara yine ARM ye bakıyorum. Şimdiye kadar hep yazılmış programlar üzerinde oynama yaparak istediğim Yapıyordum. Şimdi birazdaha farklı şeyler yapmak istiyorum ama başlamadan önce bazı bilmek istediklerim var.
Programcılık mantığında çok eksiğim var daha ARM üzerinde çalışırken bu işi nasıl yaparsın dediklerinde şimdilik pek bir cevap veremiyorum. Zamanla olacak bir iş.
Benim anlamadığım konular var. Şimdi Elimde 2 adet deney kartı var. Bu deney setleri üzerinde çalışıyorum. Bi tanesi EX33DS Diğeri İse MCBSTM32C deney kartı.
İki Deney kartınında örnek kodları var. Fakat yazım şekilleri farklı.
Şöyle benim yapmak istediğim şey Mikroişlemcinin Datasheedini açayım bana hangi register lazımsa o register üzerine direk erişebilmek istiyorum. Aynen Piclerde Pinleri giriş çıkış yapmak gibi düşünün (trisa=0x00 gibisinden)

Mesela  STM32C deney kartında öyle yapılıyor.
Örnek bir kod mesela.
#include <stm32f10x_cl.h>

int main (void) {
int  d;
  /* Setup GPIO for LEDs                                                      */
  RCC->APB2ENR |=  1 <<  6;             /* Enable GPIOE clock                 */
  GPIOE->CRH    = 0x33333333;           /* Configure the GPIO for LEDs        */ 
  GPIOA->CRL    = 0X33333333;
            
 while (1)
 {
    GPIOA->ODR = 0x0001;
    for (d = 0; d < 1000000; d++); 
    GPIOA->ODR = 0x0000 ; 
	for (d = 0; d < 1000000; d++); 
  }
}


Diğer Yandan EX33DS Deney kiti için örnek programları incelediğimde biraz farklı tarafları var.
Bu kodları Coşkun Bey hazırlamış
#include "main.h"  
#include "lcd.h"  

/******************************************************************************/

u8 i=0,j=10,animasyon=0;
static vu32 TimingDelay;

void RCC_Configuration(void);
void NVIC_Configuration(void);
void DelayMs(vu32 nTime);

/*******************************************************************************/

int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	/* System Clocks Configuration */
  	RCC_Configuration(); 
	
	  /* TIM1 clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  
 
  	/* GPIO clock Configuration */
  	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|
							RCC_APB2Periph_GPIOB|
							RCC_APB2Periph_GPIOC|
							RCC_APB2Periph_GPIOD|
							RCC_APB2Periph_GPIOE, ENABLE);

  	/* NVIC Configuration */
  	NVIC_Configuration();

  	/* GPIO Pin Configuration */
  	GPIO_InitStructure.GPIO_Pin = 0xFFFF;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
  	GPIO_Init(GPIOB, &GPIO_InitStructure);
  	GPIO_Init(GPIOC, &GPIO_InitStructure);
  	GPIO_Init(GPIOD, &GPIO_InitStructure);
  	GPIO_Init(GPIOE, &GPIO_InitStructure);

	/* TIM1 ayarlari */
  	TIM_TimeBaseStructure.TIM_Period = 65535;
  	TIM_TimeBaseStructure.TIM_Prescaler = 0;
  	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 
  	/* TIM1 güncelleme kesmesi aktif */
	TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
  	
	/* TIM1 sayici aktif */
  	TIM_Cmd(TIM1, ENABLE);

  	/* SysTick clock 1ms için 4MHz (HCLK/8, default) */
  	SysTick_SetReload(4000);

  	/* SysTick Kesmesi Aktif */
  	SysTick_ITConfig(ENABLE);

	lcd_init();
	lcd_yaz(" LED Uygulaması");
	lcd_gotoxy(2,1);
	lcd_yaz("www.ExpKits.com");

 while (1)
 {
 	while(!i);

	GPIO_Write(GPIOD,0x00FF); 
   
    DelayMs(2*i);

	GPIO_Write(GPIOD,0x0000);		
	GPIO_Write(GPIOE,0x00FF); 
  
    DelayMs(2*i);	
	
	GPIO_Write(GPIOE,0xFF00);
	 
    DelayMs(2*i);

	lcd_gotoxy(2,17);
 	GPIO_Write(GPIOE,0x0000);
	GPIO_Write(GPIOD,0xFF00); 

    DelayMs(2*i);	
 
 	GPIO_Write(GPIOD,0x0000); 
	GPIO_Write(GPIOA,0x00FF);

    DelayMs(2*i);

	GPIO_Write(GPIOA,0xFF00);
	GPIO_Write(GPIOB,0x00FF);

    DelayMs(2*i);

	GPIO_Write(GPIOA,0x0000);
	GPIO_Write(GPIOB,0xFF00);

    DelayMs(2*i);

	GPIO_Write(GPIOB,0x0000);
	GPIO_Write(GPIOC,0x00FF);

    DelayMs(2*i);

	GPIO_Write(GPIOC,0x0000);

  }
}

/*******************************************************************************/

void RCC_Configuration(void)
{   
    /* RCC system reset(for debug purpose) */
    RCC_DeInit();
    /* HSE kapali */
    RCC_HSEConfig(RCC_HSE_OFF);
    /* Prefetch Buffer aktif */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash ulasimi 2 clock */
    FLASH_SetLatency(FLASH_Latency_2); 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    /* PLLCLK = (8MHz(internal osc)/2) * 8 = 32 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_8);
    /* PLL Aktif */ 
    RCC_PLLCmd(ENABLE);
    /* PLL hazir olmasini bekle */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    /* System clock kaynagi PLL cikisi secildi */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* System clock kaynagi hazir olmasini bekle */
    while(RCC_GetSYSCLKSource() != 0x08);  
}

/*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM
  /*  Vectör kaynagi adresi:  0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /*  Vektör kaynagi adresi:  0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

  /* TIM1 güncellenme kesmesi tanitildi */
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************/
void Timer1_Kesmesi(void)
{

  if(j==10){
     /* led animasyonu degisiyor */
	  animasyon++;
	  switch(animasyon){
	   case 1:i=50;j=0;break;
	   case 2:i=1; j=3;break;
	   case 3:i=0; j=9;break;
	   case 4:i=1; j=9;break;
	   case 5:i=0; j=9;break;
	   case 6:i=1; j=9;break;
	   case 7:i=0; j=9;break;
	   case 8:i=2; j=0;break;
	   case 9:i=0; j=9;break;
	   default:animasyon=0;break;
	   }		
	}
	else j++;
}
/*******************************************************************************/

void DelayMs(u32 nTime)
{
  /* SysTick Counter aktif */
  SysTick_CounterCmd(SysTick_Counter_Enable);
  
  TimingDelay = nTime;

  while(TimingDelay != 0);

  /* SysTick Counter Pasif */
  SysTick_CounterCmd(SysTick_Counter_Disable);
  /* SysTick Counter temizlenir */
  SysTick_CounterCmd(SysTick_Counter_Clear);
}

/*******************************************************************************/
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}

/*******************************************************************************/


Bu Benim kafamı çok karıştırdı açıkçası. Burada bilmediğim birçok şey var. İkisi arasında fark nedir acaba bilmek istiyorum.
Birde şunu öğrenmek istiyorum.
Basit bir led yak söndür programı için İşlemcinin configürasyon ayarlarını nasıl yapacağımı bilmiyorum. Özellikle bunu öğrenmeye çok ihtiyacım var. Mesela MCBSTM32C deney seti üzerinde 25Mhz kare kristal var. EX33DS üzerinde ise 8 mhz. Bu frekanslarda işlemcileri düzgün çalıştırmam için hangi ayarları yapmam gerekiyor.

Son bir sorum daha var.
Dediğim gibi daha önce hep başkasının yazdığı programlar üzerinde oynayara en azından işin nasıl işlediğini örenmeye çalışıyordum. Şimdi  ben kendim yeni bir proje oluşturmak istiyorum. Basit bir led yak söndür programı yazmak için Proje dosyasını nasıl oluşturacağım Programa hangi dosyaları ekliyecem bunları bilmiyorum.  Bu konularda beni aydınlatırsanız sevinirim. Girdik bir yola dönüş yok. Öğrenicem bu işi :)

M_B

Hocam İlk kodta ( STM32C deney kartın )   her seyi kullanıcı kendi yapıyor.
Yani Datasheeti acıp bakarak yazıyor. ( Bunalmış hocamızın STM32F407 Discovery kartında yaptıgı gibi )

Diğer EXD33 ( Coşkunun ) kodu ise hazır kutuphane kullanılarak yazılmıştır.
Hazır kutuphane derkende st'nin kendi kutuphanesi
İlgili link:
http://www.st.com/internet/mcu/product/221020.jsp
FIRMWARE başlığı altındaki
STM32F10x standard peripheral library
dosya

dosya icinde orneklerde mevcut.
Hangisini kullanayım dersen kişiye göre değişir.
Bende STM32F107 ve STM32F407 Discovery kart uzerinde calışmalar yapıyorum.  Şimdilik ben firmware kullanıyorum.


İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

Peki hocam ileriye dönük konuşursak hangisi iyidir. Kütüphane kullanarak hazır komutlar yardımıylamı yazmak iyidir. Yoksa Herşeyi datasheede bakarak direk registerler ile iletişim halinde yürütmekmi  iyidir. Şuanda ben hangisi iyi olduğuna bakmıyorum aslında hangisi daha çabuk öğrenirim daha çabuk alışırım Hangisinde kod yazmak daha kolay ona bakıyorum.

Hocam birde dediğiniz STM32F107 kütüphanesini indirdim. Bunu eklememmi gerekiyor keil klasörünün içinemi atacağım. Tam olarak ne yapmam gerekiyor.

pisayisi

#11
Firmware ile yapılan kodlar da geliştirme ürünü piyasaya sürme süreci hızlıdır. Zaten firmalar bu süreci hızlandırmak için register lar ile kullanıcıları boğmamak için bu yazılımları üretirler. Bu firmware lerin yaptığı zaten sizin için register lara ulaşır ve gereken kodları yüklerler. Bu bir harmoni içinde gerçekleşir. Örneklerde yeralan herşeyi firmware kullanarak yaptınız kolcayca oldu kesme, pwm, dma,gpio,adc, dac her örneği denediniz anladınız. Bu örneklerden hareketler yeni birşeyler yapabilirsiniz. lcd sürersiniz kontrol pid birçok şeyi hızlıca yaparsınız. Ancak örneklerde olmayan spesifik bir kod yazmak gerektiğinde parçaları birleştirmek zorunluğu ortaya çıkar bazan bu birleştirme işlemini sadece firmware ler üzerinden yapamayabilirsiniz.
Örneğin bir 3 faz motor kontrol uygulaması yapacaksınız firmware de yer alan hazr örnekler yeterli olmayacak register lara dalıp onlarca kontrol seçeneğinden en uygununu seçmeye zorlanacaksınız...

Çinliler ilk stm32 serileri çıktığında register larla uğraşarak kodlar yazardı. O tip kodlar bug üretmeye ve sorun çıkarmaya daha çok adaydır uzun kodlarda muhakkak gözden kaçan birşeyler vardır. Sonra onlarda firmware tabanlı kodlarla çalışmayı standart haline getirdiler.

Murat

M_B

Alıntı yapılan: Mucit23 - 05 Nisan 2012, 11:24:27
Peki hocam ileriye dönük konuşursak hangisi iyidir. Kütüphane kullanarak hazır komutlar yardımıylamı yazmak iyidir. Yoksa Herşeyi datasheede bakarak direk registerler ile iletişim halinde yürütmekmi  iyidir. Şuanda ben hangisi iyi olduğuna bakmıyorum aslında hangisi daha çabuk öğrenirim daha çabuk alışırım Hangisinde kod yazmak daha kolay ona bakıyorum.
Zaman ve cabuk öğrenme olarak bakarsak bence hazır firmware kutuphanesini kullanmak gerekir. 
İlerde belli bir seviyeye geldin mi kendin de kendi kutuphaneni yazarsın. Bu benim düşüncem.
Çünkü zaman önemli ve bir an önce öğrenmek lazım. 

Alıntı yapılan: Mucit23 - 05 Nisan 2012, 11:24:27
Hocam birde dediğiniz STM32F107 kütüphanesini indirdim. Bunu eklememmi gerekiyor keil klasörünün içinemi atacağım. Tam olarak ne yapmam gerekiyor.
Hocam burası biraz karısık ;)  Keilin icine aktarmayacaksınız.



Her projede yapmanız gereken.

STM32F10x_StdPeriph_Lib_V3.5.0
klasoru icine girip icindeki klasorleri kendi yapacagınız proje klasoru icine bire bir kopyalamak olacaktır.


Ornek: LedYak diye klasor actınız

LedYak\ klasoru icine
Libraries
Projects
Utilities klasorlerini kopyalayın.
Sonra
Projects\STM32F10x_StdPeriph_Template\icine kendi main dosyanızı kopyalayın.
daha sonrada MDK-ARM klasor icine girip keil proje dosyanızı calıstırın. Ve derleyin.

Bu şekilde sample icindeki basit ornegi deneyin olmazsa ben kendi kalıbı mı veririm kullanırsınız.

Umarım anlatabildim.


İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

#13
Anladığım kadarıyla Firmware işleri kolaylaştırıyor. Bende ozaman Fİrmaware ile yola devam ederim. Yeterki firmware yardımıyla basit bir program yazabileyim.
Şimdi aklımda şu sorular kaldı. Şu firmware işini açıklık kazandırmak istiyorum
Birde hazır kütüphanede configürasyon ayarlarının daha doğrusu işlemcinin çalışması için gereken minimun ayarların nasıl yapılacağını bilmiyorum. Şu library nin manuali veya başka bir kitapcık gibi birşey bulsam çok güzel olacak.

Hocam proje oluşturma işine tekrar bir bakayım. Anladım galiba


M_B

firmware icinde
Yardım dosyası ( stm32f10x_stdperiph_lib_um.chm )var.
İnceleyin.

Birde EX33 teki kodları da inceleyin.  Bazılarında Türkce açıklamalar var.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet