STM32 ile ilgili Tipik Başlangıç Sorusu

Başlatan NaMcHo, 23 Mart 2011, 20:33:11

NaMcHo

Stm32 kitimi yeni yeni kurcalamaya başladım ve Datasheet olarak : RM0008 Reference manual kullanıyorum.
Derleyici olarak Keil kullanıyorum (MDK ve RL de yüklü)
#include "stm32f10x.h" 
int main(void)
{
	unsigned long sayac=0;
	GPIOA_CRL_MODE0 = 1;
}
Bu kodu derleyince
#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
hatasını alıyorum. Sonra
stm32f10x.h başlık dosyası yerine " - High-density value line devices are STM32F100xx microcontrollers where the
   Flash memory density ranges between 256 and 512 Kbytes."
bu yazıdanda yola cıkarak stm32f10x_hd_vl.h başlık dosyasını ekledim yine sonuç alamadım.

Bu tarz sorunları aşmış olan bir üye, işlemcinin registerlarını kullanarak basit bir led yak söndür uygulaması paylaşılırsa,hızlı bir şekilde uygulamalar yapabileceğime inanıyorum. (GPIO kullanımını öğrendim başta belirtmiş olduğum datasheet den)

Birde stm32f10x.h dosyasında GPIO_CRL şeklinde tanımlamalar var yani bu A portumu B portumu belli değil bunun ayrımınıda nasıl yapacagımı anlamıs değilim.
Datasheetde GPIOA_CRL(Port configuration register low (GPIOx_CRL) (x=A..G)) şeklinde belirtiliyor.(GPIOA_BASE şekllinde tanımlamaların olduğu satırlar gözüme çarptı stm32f10x.h dosyasında, sanki bunlarla ilgili birşey gibi hangi portu seçmek istediğimiz.)

memo333

merhaba,

STM32 için kod yazabilmek için CMSIS ile ilgili tüm dosyaların sisteminizde olması gerekir. Bunu elde etmenin kolay yolu STnin sitesinden Standard Peripheral Library (indir) indirip template bölümünden oluşturacağınız proje ile kod derlemedir.

Ayrıca deneme kitinizin CDsi içinde mutlaka  örnek uygulama vardır.

STM32 ile başlangıç yapmak biraz sıkıcı olabilir ama devam etmekten çekinmeyin...
Gömülü Linux Notları --> http://linuxedu.xyz/

X-Fi

keil klasörlerinde example dosyalarının altındaki project dosyasını açın cevre birimleri arasındaki Systick uygulamasini entegre ederek led uygulamalarına başlayabilirsiniz ben öyle yaptım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

NaMcHo

#3
Teşekkürler cevaplar için
@X-Fi daha çok işlemcinin register larına erişipde uygulama yapmak istedim nekadar yeni başlamışda olsamda daha eğlenceli oluyor böyle  :)

Birşeyler buldum CMSIS dosyasının içinde kurcalamaya başladım sorun veya sorunlarla karşılaşırsam bu başlık altında yazıcam veya eğer ilk uygulamamı yapabilirsem yine buraya yazıcam.Şu sıralar derslerde yoğun biraz şansıma .

Registerlarada sanırım şu şekilde erişilcek GPIOx->BSSR , GPIOx->CRL şeklinde.Burdada dikkatimi -> işaret çekti sanki GPIOx den suraya git dermiş gibi birşey cağrıştırıyor fakat neden datasheetde GPIOx_BSSR şeklinde verilmiş onu hala anlamadım .Kullanıcının gereksiz yere zaman kaybetmesine yol açıyor bence bu.Datasheetde nasıl verildiyse registera erşim o yazım şekliylide erişebilmemiz zaman kaybetmemizin önüne geçer bence.

memo333

Alıntı yapılan: NaMcHo - 23 Mart 2011, 20:33:11

#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"




stm32f10x.h dosyasını açın burada #define STM32_HC #define STM32_MC gibi bazı tanımlamaların yapılmış olduğunu göreceksiniz. Bunlardan cihazınıza uygun olanını uncomment yapın diğerlerini comment.

STnin sitesinden AN2593 (indir) indirin. Burada eski kütüphaneden yeni CMSIS uyumlu kütüphaneye geçiş anlatılıyor. CMSIS ile ilgili detaylar bu dosya içerisinde var.
Gömülü Linux Notları --> http://linuxedu.xyz/

NaMcHo

#5
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif


Şu kısımda benimkisi  !defined (STM32F10X_MD_VL) oldugu icin // !defined (STM32F10X_MD_VL) yapıcam diğerleri normal  kalıcak yani değilmi?

memo333

Alıntı yapılan: NaMcHo - 24 Mart 2011, 10:10:22
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif


Şu kısımda benimkisi  !defined (STM32F10X_MD_VL) oldugu icin // !defined (STM32F10X_MD_VL) yapıcam diğerleri normal  kalıcak yani değilmi?
Evet

#define STM32F10X_MD_VL   /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
Gömülü Linux Notları --> http://linuxedu.xyz/

X-Fi

#7
bence CMSIS kütüpanelerinden yanayım herşeyi configrasyondan ayarlamak çok yavaş ve sağlaması zor genel olarak CMSIS örnekleri daha fazla örnek olarak yakınlarda yaptığım tüm portlardaki ledleri animasyonlu olarak yapkan programı ekliyorum türkçe açıklamalarda ekledim systick ve timer1 kullanımı hakkındada bilgi sahibi olabilirsiniz.

not:  ExpKits EX33DS kiti ve STM32F107VC Mcu board kullanıldı kod 8mhz internal osc ile çalışmakta dosya içinde bir video mevcut.

http://rapidshare.com/files/454118863/LED_Uygulamasi.rar

kolay gelsin.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

memo333

Alıntı yapılan: X-Fi - 24 Mart 2011, 11:37:28
bence CMSIS kütüpanelerinden yanayım herşeyi configrasyondan ayarlamak çok yavaş ve sağlaması zor genel olarak CMSIS örnekleri daha fazla örnek olarak yakınlarda yaptığım tüm portlardaki ledleri animasyonlu olarak yapkan programı ekliyorum türkçe açıklamalarda ekledim systick ve timer1 kullanımı hakkındada bilgi sahibi olabilirsiniz.

not:  ExpKits EX33DS kiti ve STM32F107VC Mcu board kullanıldı kod 8mhz internal osc ile çalışmakta dosya içinde bir video mevcut.

http://rapidshare.com/files/454118863/LED_Uygulamasi.rar

kolay gelsin.

@X-FI

Paylaştığınız uygulama için teşekkürler.

Fakat uygulamanız CMSIS değildir. STnin eski FWLIB denilen LIBi kullanılmıştır. Keil de örnek amaçlı olarak; tüm FWLIB dsoyalarını STM32F10xR.LIB dosyası içinde toplamış. AMA fena da olmamış hatta başlangıç için ideal.

* File Name          : stm32f10x_it.c
* Author             : MCD Application Team
* Version            : V2.0.1


Peki CMSIS nedir?

CMSIS ARM şirketi tarafından oluşturulmuş bir standarttır. Buna ek olarak ST firması eski FWLIB'ı CMSIS standartına göre düzenleyip Standard Peripheral Library olarak yeniden yayınlamıştır. Tabii bazı değişiklikler olmuştur. Örneğin sizin projenizde "stm32f10x.h" dosyası yoktur, "stm32f10x_lib.h" dosyası vardır.

Sonuç olarak iki sistemde FWLIB de CMSIS+STLIB de çalışır. Fakat bazı farklılıklar vardır.
Gömülü Linux Notları --> http://linuxedu.xyz/

X-Fi

peki hangisi avantajlıdır FWLIB mi CMSIS+STLIB mi, FWLIB den faklı olarak hangi yönü geliştirilmiş.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

memo333

FWLIB artık güncellenmiyor. AMA dediğim gibi başlangıç için FWLIB ve sizin düzeniniz ideal. SONUÇTA, siz led-yak söndür yapmışsınız, SYStick kullanmışsınız, interrupt kullanmışsınız vs. Bu kodlar CMSIS'te de değişmeyecek(GPIO_Setbits olduğu gibi kalacak).

CMSIS+STLIB avantajı ise yeni driverlar için ideal mesela USB driver. Birde sürekli güncelleniyor ST tarafından. Ama KEIL altında kurulması, alışma süreci vs. bunlar yorucu olabiliyor...
Gömülü Linux Notları --> http://linuxedu.xyz/

X-Fi

anladım hocam stm32 üzerine ilerledikten sonra ilgilenebileceğim bi konu o zaman.

yorumlarınız için teşekkürler.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

NaMcHo

#12
#include "stm32f10x.h"
void delay(unsigned long x)
{
	while(x--);
}
int main (void)
{
  RCC->APB2ENR |=  1 <<  2; 					/* Enable GPIOA clock          */
  RCC->APB2ENR |=  1 <<  4;                    /* Enable GPIOC clock          */
  SysTick_Config(SystemCoreClock / 100);       /* Setup SysTick Timer  (10ms) */

  GPIOA->CRL |= 0x00000004;						
  GPIOC->CRH |= 0x00000033;
  
  for(;;)
  {
  	   if((GPIOA->IDR) & 0x0001)
	   GPIOC->BSRR = 0x00000300;
	   else 
	   GPIOC->BRR = 0x0300;
  }
   
}

Bunu "Download code to flash memory" ile axf dosyasını yükledikden sonra hic bir tepki alamıyorum USER butonundan.User butonunu yani A portunun 0.   pinini GPIOA->CRL |= 0x00000004 ile giriş yaptım,GPIOC->CRH |= 0x00000033; bununlada C portunun 8. ve 9. pinlerini çıkış yaptım,bu 2 çıkış bacağıda LD4 ve LD3'e gidiyor.User butonuna bastığımda bu 2 ledin yanması gerekiyor normalde fakat hic bir değişiklik olumuyor aceba ben mi yanlış yüklüyorum axf dosyasını microcontroller'a?

Birde RST butonuna basarsam her USER butonuna bastğımda LD4 yanıyor LD3 sönüyor,veya usb kablosunu çıkarıp takıncada aynı bu şekilde oluyor sanki RST butonuna basmışım gibi halbuki yazdığım kodun bununla alakası yok.
Sorun ne olabilir?

memo333

main'de ilk önce

SystemInit(); fonksiyonunu çağırabilir misiniz? Bu CMSIS'in STM32 için clockları kurmanızı sağlar.
Gömülü Linux Notları --> http://linuxedu.xyz/

NaMcHo

#14
#include "stm32f10x.h"
void delay(unsigned long x)
{
	while(x--);
}

int main (void)
{
  SystemInit();
  RCC->APB2ENR |=  1 <<  2; 					/* Enable GPIOA clock          */
  RCC->APB2ENR |=  1 <<  4;                    /* Enable GPIOC clock          */
  SysTick_Config(SystemCoreClock / 100);       /* Setup SysTick Timer  (10ms) */

  GPIOA->CRL |= 0x00000004;						
  GPIOC->CRH |= 0x00000033;
  
  for(;;)
  {
  	   if((GPIOA->IDR) & 0x0001)
	   GPIOC->BSRR = 0x00000300;
	   else 
	   GPIOC->BRR = 0x0300;
  }
   
}

Flash->Download a bastıkdan sonra Load "C:\\Keil\\CALISMALARIM\\Blinky\\Flash\\Blinky.AXF" bu output ekranında cıkıyor.

USER butona basınca yanmıyor hala LD4 ve LD3, herhangi bir bozukluk olma olasılığı varmı kitimde?