Basic Bilenlerin Kütüphane ile Kullanımı İle Alakalı Soruları

Başlatan muhittin_kaplan, 15 Ekim 2012, 00:08:49

muhittin_kaplan

Örneğin ben. Basic biliyorum. C# ı Vb.net i Asp den sql den de anlarım. Html ile istediğimi yapar Üstüne bir kat ta elbise dikerim.
Ama velakin şu Cortex in Kütüphane kullanımı ile alakalı örneklerinden pek birşey anlamıyorum. ( yeteri kadar beslenemediği düşünüyorum :))

Buradan ilerleyerek Soru cevap şeklinde Kahve muhabbeti kıvamında "Ula sende bunu bilmiyorsan" demeden konuyu öğrensek iyi olur sanırım.


evet ilk soruyu sorayım.

stm32f4discovery yada stm32FVLdiscovery kartı mevcut elimde. bu kartları kullanarak istediğim pin i nasıl toggle yaparım ? (stm32f10x_gpio.c yada stm32f4x_gpio.c kullanarak)




GreeN

STM32F4xx_StdPeriph_Driver dosyalarını keil klasöründe bir yere attım. inc ve scr klasörlerini oluşturduğum projeye "target1" özelliklerinden c/c++ sekmesinde include paths kısmından ekledim. Burada proje klasörünüde ekledim.
aynı sekmede USE_STDPERIPH_DRIVER da eklenmeli.
projede lazım olacak StdPeriph_Driver  dosyalarını Target1 üzerinde sağ tık addgroup (grup adına bir isim verin : stm_drv) bu grubun altına add files to... ile stm32f4xx_gpio.c , stm32f4xx_rcc.c ,stm32f4xx_adc.c gibi kullanacağımız driver'ları ekleriz.aşağıdaki örnekte rcc ve gpio lazım sadece. Aşağıdaki kodu hatasız derlerseniz proje bu hali ile STDPERIPH_DRIVER'lar ile çalışmaya hazır. ADC kullanımı çok daha kolay bu kodlar ile.





#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   
 	 }

void Delay(__IO uint32_t nCount);
GPIO_InitTypeDef  GPIO_Ayar;

int main(){
	
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);	
	
	GPIO_Ayar.GPIO_Pin = GPIO_Pin_15 ;    
  GPIO_Ayar.GPIO_Mode = GPIO_Mode_OUT; 
  GPIO_Ayar.GPIO_OType = GPIO_OType_PP; 
  GPIO_Ayar.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Ayar.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_Ayar);
	
	while(1){
		
		Delay(10000000);
		GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
		
}

}
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}
Terörü Lanetliyoruz.

muhittin_kaplan

deneyemedim nöbetten dolayı. yanlız bir sorum daha var.
kullanılan kütüphanenin içerisinde olan fonksiyonları nasıl biliyorsunuz ?

örneğin  ben visual studio da yazarken "math" i dahil ettiğim anda math. yazdığımda math in içerdiği fonksiyonları görebiliyorum.
böyle bir durum mevcut mu yoksa dosyayı açıp bakmak mı gerek?

GreeN

Hocam projeye eklediğiniz dosyaların içeriğindeki fonksiyonları Proje sekmesinin yanında "functions" sekmesinde görebilirsiniz. Listedeki fonksiyonlara tıklayıp dosyadaki yerine ulaşabilir kullanımına dair kısa notları görebilirsiniz.
Terörü Lanetliyoruz.

muhittin_kaplan

komutlarda neden 32f......_gpio.c veya diğerini dahil etmedik.
komtlarlada dahil edebilirmiydik ?

mesaj birleştirme:: 16 Ekim 2012, 16:01:22

STM32F4xx.h den mi dahil ediliyor
(şu an bakamıyorum STM32F4xx.h içeriğine)

GreeN

Proje ağacına ekledim.  stm32f4xx_conf.h dosyasıda isteyebilir , onuda proje klasörüne attım. Onun içeriğinde de bak anlarsın.
Terörü Lanetliyoruz.

muhittin_kaplan

tamam hocam dosyanın proje ağacında olması fonksiyonu  çağırmam için yeterli mi ?
bir sürü dosya eklesem tümünü derleyip gereksiz yermi kaplar? yoksa bu işi linker mi halleder ? yani sadece kullandığım fonksiyonlarımı derler ?

GreeN

Misal dac ile örnek yapacağım. bana dac , timer , gpio , misc (nvic interruptlar için) , rcc kütüphaneleri lazım. Proje ağacına onları eklemem yeterli , bu zaten bu dosyaları projeye dahil etmek demektir. Kütüphanelerin yerlerini zaten c/c++ sekmesinde gösterdim.

Tüm STM32F4xx_StdPeriph_Driver dosyalarını ekleyebilirsiniz ama derlerken ekli tüm dosyalar elden geçiriyilor. Baya uzun sürüyor. (benim pc yavaş olabilir.)
Terörü Lanetliyoruz.

burak ozturk

hocam madem konu konusuluyor benimki biraz basit olacak ama bu STM32F4xx_StdPeriph_Driver dosyaları derleyici içinde hazır gelmiyor değil mi ? http://tech.munts.com/MCU/Frameworks/ARM/stm32f4/libs/STM32F4xx_DSP_StdPeriph_Lib_V1.0.1/Project/STM32F4xx_StdPeriph_Examples/Library_Examples.html gibi bir kaynaktan mı klasöre atmam gerekiyor.
happy coding.


muhittin_kaplan

neresi olmuyor anlamıyorum. bir türlü derleyemedim. ; eksik hatasından tekrarlı tanımlama ya bir çok hata alıyorum.

mesaj birleştirme:: 16 Ekim 2012, 21:33:10

Hata Yaptığım yeri anlamadım. Ama Oldu Sonunda.
1.Bir Proje Klasörü Oluştur.
2. İçerisine MCU ile alakalı Driverları inc ve src klasörlerini kopyala
3.Yei Proje Aç ve işlemci seçimini yap (startup dosyasını kopyalamasına müsade et)
4.gerekli olan driverları keilin proje ağacına ekle (src klasörünün altından)
5.target i ters tıklayarak bu klasörleri tanıt (c/c++ sekmesinden)
6.USE_STDPERIPH_DRIVER sözcüğünü ekle.


Peki Hocam F4 için bu şekilde ,stm32f1vl discovery kit için nasıl olacak aynı yöntem mi ?
(32f100rb chip i mevcut kartın üzerinde.)



mesaj birleştirme:: 16 Ekim 2012, 22:59:33

Hocam Pekala sizin verdiğiniz örnekle aşağıdaki #include ile kullanım arasındaki farklar nelerdir ?

#include "STM32F4xx.h" 
#include "stdio.h" 
#include "STM32F4xx_adc.h"
#include "STM32F4xx_GPIO.h"
 
unsigned char WAdr,RAdr;
char RxBuf[128];
char TxBuf[128];
unsigned char timer_update=0; 
uint16_t adc_val[4];
uint8_t ch_index =0;
/*********************************************************************************
 CPU frekansi 168Mhz
 AHB frekansi 84 Mhz
 APB frekansi 42 Mhz
*********************************************************************************/
 
void SystemInit()
{

                ...  // diğer başlangıç kodları

     PB->MODER.p0 = PORT_ANALOG;
     PB->MODER.p1 = PORT_ANALOG;
     PC->MODER.p4 = PORT_ANALOG;
     PC->MODER.p5 = PORT_ANALOG;

                RCC->APB2ENR|=0x00000100;  // ADC saat kaynağını aktif ettik. 
     AD1->CR1.SCAN = ADC_SCAN_ENABLE;  // scan modunu açtık
     AD1->CR1.EOCIE = ADC_INTERRUPT_ENABLE; // interrupt izni verdik.

     NVIC_EnableIRQ(ADC_IRQn); // NVIC ADC kesmesini aktif ettik. 

     AD1->SQR1.L = 3;  //4 kanal tarayacağız
     AD1->SQR3.SQ1 = 8;  //Çevrime ilk girecek kanal 8. (PB0)
     AD1->SQR3.SQ2 = 9;  //Çevrime 2. sırada girecek kanal 9. (PB1)
     AD1->SQR3.SQ3 = 14;  //Çevrime 3. sırada girecek kanal 14. (PC4)
     AD1->SQR3.SQ4 = 15;  //Çevrime 4. sırada girecek kanal 15. (PC5)
      
     AD1->SMPR2.SMP8 = ADC_SMPTIME_480_CYCLES; // 8. kanal en düşük hız 
     AD1->SMPR2.SMP9 = ADC_SMPTIME_480_CYCLES; // 9. kanal en düşük hız 
     AD1->SMPR1.SMP14 = ADC_SMPTIME_480_CYCLES; // 14. kanal en düşük hız 
     AD1->SMPR1.SMP15 = ADC_SMPTIME_480_CYCLES; // 15. kanal en düşük hız 
    
     AD1->CR2.ADON = ADC_ON; // ADC'yi açtık
     AD1->CR2.CONT = ADC_CONTINIOUS_CONVERSION; // sürekli çevirim yapacağız. 
     AD1->CR2.EOCS =  ADC_EOC_MODE_CHANNEL;  // EOC biti her kanalın çevrimi bittiğinde set edilecek.
} 
 
/********************************************************************************************************
                                ADC KESME RUTİNİ
**********************************************************************************************************/
void ADC_IRQHandler()
{
      	if(AD1->SR.EOC){
           	AD1->SR.EOC=0;
            adc_val[ch_index] = AD1->DR;
            if(++ch_index > 3)ch_index=0;
        }

}


kodlar klein hocanın dır.

GreeN

Hocam stm32f4xx.h içeriğinde USE_STDPERIPH_DRIVER tanımlandıysa stm32f4xx_conf.h dosyasını soruyor. Dosya içeriğine bakarsanız STDPERIPH_DRIVER 'a ait bütün headerler tanımlanmış.

Muhtemelen klein usta USE_STDPERIPH_DRIVER ve stm32f4xx_conf.h ile uğraşmak istemedi. (belkide hiç gerek yok ben uzatıyorum olayı)
Edit;tanımlanan bu kütüphaneler klein hocanın kendi kütüphaneleri olabilir.
#include "STM32F4xx_adc.h"
#include "STM32F4xx_GPIO.h" bunlar stm32f4xx_conf.h içeriğinde tanımlı , ben bu dosyaya yol gösteriyorum sadece.

src ve inc klasörlerini sabit bir yere at. farklı projelerde sadece yol göster. her proje klasörüne ayrı ayrı  atıp şişirme.
5.target i ters tıklayarak bu klasörleri tanıt (c/c++ sekmesinden) bu adımda src ve inc klasörlerine yol göster.
include paths sonundaki "...." ya tıkla ve kütüphane klasörlerinin yerini göster.

Diğerişlemciler farklı kütüphane dosyası olsa gerek. Diğer işlemler aynı ...
Terörü Lanetliyoruz.

muhittin_kaplan

Neden BilmiyorumAma Register Programlamak Daha Kolay Geldi Bana.
Ama Bu işi de Kotarmam Gerek.
Bu lib lerle en kolay nasıl çalışırım ı araştırıyorum.
(Keil de başka GCC de başka vs de başka olursa işime gelmez. Standart yazmalıyım Kütüphanaleri taşımalı derleyebilmeliyim.)

GreeN

Aslinda benimde içime sinmiyor , biraz rahatsız hissetiriyor ama eğlenceli şeyler biraz alışmak lazım :)


int main(){
	
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	GPIO_Ayar.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14 ;  //mavi ve kirmizi led PD15 , PD14 cikis  
  GPIO_Ayar.GPIO_Mode = GPIO_Mode_OUT; 
  GPIO_Ayar.GPIO_OType = GPIO_OType_PP; 
  GPIO_Ayar.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Ayar.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_Ayar);
	
	GPIO_Ayar.GPIO_Pin = GPIO_Pin_0 ; //buton PA0 giris   
  GPIO_Ayar.GPIO_Mode = GPIO_Mode_IN; 
  GPIO_Ayar.GPIO_OType = GPIO_OType_PP; 
  GPIO_Ayar.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Ayar.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_Ayar);
	
	while(1){ 
		while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1) // buton basili iken kirmizi led
		{
		 GPIO_ResetBits(GPIOD,GPIO_Pin_15);
		 Delay(10000000);
		 GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
		}
			GPIO_ResetBits(GPIOD,GPIO_Pin_14); // buton basili degiliken mavi led
			Delay(10000000);
			GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
	       }

}
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}


Terörü Lanetliyoruz.

serhat1990

 Muhittin Hocam benzer bir konuda ben açtım , bu hazır kütüphaneleri kullanmak banada çok karmaşık geliyor . Özellikle STM32F serilerinde . Bende hata olabilir  pek kullanmaya ısınamadım . Kütüphaneler bana sanki al bu yay , bu da ok . Bu yayı kullanarak oku bu deliğe atacaksın diyor sanki :) Bırak da biraz kurcalayayım! ( Örnek biraz saçma oldu ama bu saatte böyle olabiliyor ... )