STM32F10X Çalışmalarım

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

Mucit23

Hocam timer ile kullanarak yapayım diyorum. Yanlız bu verdiğiniz değerleri nasıl hesapladınız. OSC frekansına göre değişmezmi bu?

Klein

Değişir tabiki.  STM32F103 için, 72Mhz kullanıldığı ve APB bölücüsünün 1 olduğunu varsaydım. Genellikle hep en yüksek hızda kullanmaya meyilliyizdir diye.

Hesap basit.

Timer kesme süresi = (PSC * (ARR+1)) /  APB frekansı.

APB Frekansı =  72MHz olsun
PSC  =72
ARR = 19999

Önce 72000000 Hz frekansımız  Prescaler tarafından 72 ye bölünür.
Timer girişine uygulanacak saat frekansı 1MHz  olacak demekki.
Yani Counter bir saniyede 1 Milyon sayacak. Veya 1 mikrosaniyede bir sayacak.
Counter değeri ARR değerine geldiğinde kesme üretilecek.

20mS istediğimize göre ve 1 mikrosaniyede 1 arttığımıza göre, 20000 kez sayarsa 20mS edecek.

Neden 1 eksik değer verdik?
Sayıcı ARR değerine ulaştığında kesme üretilir. Ancak sayıcının sıfırlanması bir sonraki saat darbesinde gerçekleşir. Yani fazladan 1 saat darbesi süre geçer. İşte bu süreyi ARR değerinden çıkarıyoruz.

Mucit23

Hocam Sizin Hesap Benim ölçümlerime uymuyor

İşlemciyi Harici 8Mhz osc ile Çalıştırdım. Sonra PLLMull değerini 9 yaptımki PLLCLK Değeri 72Mhz Olsun. Sonra AHB ve ABP2 Bölücüsünün değerinide 1 yaptım Dolayısıyla Timer1 giriş Frekansı 72 Mhz olması gerekir.

Bu durumda Timer1 Taşma değerini ve Bölücüsünü sizin verdiğiniz değerlerde yapınca yaklaşık 500ms de bir kesme oluşuyor. Bi yerde hata yapıyorum mutlaka.
Kesme frekansını anlamak için kesme içerisinde 1 pini sürekli toggle yapıp osiloskopla çıkış frekansına bakıyorum.

Nerde hata yapıyor olabilirim.

Main.C programım bu şekilde
#include "stm32f107.h"
#include "stdio.h"
#include <rtl.h>
#define arraySize(array) (sizeof(array)/sizeof(*array))

#define ServoPin 11
#define Servo(x) ((x) ? (GPIO_SetBits(portC,(1<<ServoPin)))  : (GPIO_ResetBits(portC,(1<<ServoPin))) );

void sendUSART1(char *array);

int tx_c=0;

BOOL i=0;

int main()
{
/***********BASLANGIC AYARLARI************/	
	SystemInit(1);
//	initADC1();
	setTimer1(19999,72,1);	
	//initRS232(9600);

/***************KS0108 INIT********************/	
	 setOutMode(portD,0xFFFF);//glcd data pinleri PortD nin agirlikli ilk 8 bitine bagli
	 setOutMode(portE,0xFFFF);
	 setOutMode(portC,0xFFFF);
/**********************************************/	

	while(1)
	{	
	//DelayUs(500);
    }
}

void sendUSART1(char *array){
	int size=strlen(array);
	for(tx_c=0;tx_c<=size;tx_c++){
		rs232SendData(array,size);
		//delayMs(1);
	}
}


void Timer1_Interrupt()
{ 
	i=1-i;
	Servo(i);  
}


Buda İşlemcinin genel ayarlarını yaptığım stm32F107.h dosyası
////////////////////////////////////////////////////////////////////////////////
//  Author   : [FERHAT YOL]											
//  Notice   : Copyright (c) 2012
//           : All Rights Reserved
//  Date     : 
//  Version  : 1.0.0
//  MCU 	 : STM32F107VC
//  Notes    : DEFAULT AYARLAMALAR
////////////////////////////////////////////////////////////////////////////////

#include "stm32f10x_lib.h"	
#include "port.h"
#include "main.h"
//#include "ks0108.h"
#include "com.h"
#include "adc.h"
#include "stdio.h"
//#include "ds18b20.h"
//#include "ds1302.h"
//#include "keypad.h"


//#define arraySize(array) (sizeof(array)/sizeof(*array))
void SystemInit(int clockMull);
void RCC_Configuration(int clockMull);
void NVIC_Configuration(void);
void setTimer1(u32 period,u32 prescaler,u32 clockdivision);
void delayMs(vu32 ms);
static vu32 TimingDelay;
/********************************SYSTEMINIT************************************/
void SystemInit(int clockMull){//clockMull clock carpani 1 veya 2 olabilir=> 2 olursa 64 mhz, 1 olursa 32 mhz de calisir
		/* System Clocks Configuration */
  	RCC_Configuration(clockMull); 
  	/* NVIC Configuration */
  	NVIC_Configuration();
  	/* SysTick clock 1ms için 4MHz (HCLK/8, default) */
  	SysTick_SetReload(4000);
  	/* SysTick Kesmesi Aktif */
	
  	SysTick_ITConfig(ENABLE);
		
}

/*******************************************************************************/
void setTimer1(u32 period,u32 prescaler,u32 clockdivision){
	
		TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
		/* TIM1 clock enable */
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 
		/* TIM1 ayarlari */
  	TIM_TimeBaseStructure.TIM_Period = period;
  	TIM_TimeBaseStructure.TIM_Prescaler = prescaler;
  	TIM_TimeBaseStructure.TIM_ClockDivision = clockdivision;
  	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);
			//GPIO_Write(GPIOB,0x00FF);
}


/*******************************************************************************/
void RCC_Configuration(int clokMull)
{
    /* RCC system reset(for debug purpose) */
    RCC_DeInit();
    /*Osilatör Seçimi buradan Yapilir.  */
    RCC_HSEConfig(RCC_HSE_ON);
    /* Prefetch Buffer aktif */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash ulasimi 2 clock */
    FLASH_SetLatency(FLASH_Latency_2);
    /* AHB Clock Divided*/
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    /* ABP2 Clock Divided */
    RCC_PCLK2Config(RCC_HCLK_Div1);
    /* ABP1 Clock Divided */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    /* PLLCLK = (8MHz External OSC) * 8 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, clokMull*RCC_PLLMul_9);
    /* 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);
 
}


/***********************************delayMs**************************************/
void delayMs(u32 ms)
{
  /* SysTick Counter aktif */
  SysTick_CounterCmd(SysTick_Counter_Enable);
  
  TimingDelay = ms;

  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--;
  }
}
/*******************************************************************************/


Servo süremeye çalışıyorum aslında Bir türlü 20ms lik kesme süresini tutturamadık.

Birde Kesme içerisinde beklersem ne olur? Dediğim gibi Servo sürmeye çalışıyorum 20ms de bir 1-2ms arası clock palsi çıkarmam lazım.

Klein

#63
Muhtemelen 72MHz hızına çıkamıyorsunuz.  8MHz'de kalıyorsa  180 milisaniyede bir kesme gelir.
Kesme içerisinde beklemek (Hatta kesme dışında herhangi bir yerde beklemek) hiç bir zaman yapmadığım, kimseye de yap demeyeceğim bir uygulama. 

Eğer 20 milisaniyede bir  darbe ihtiyacınız varsa , Zamanlayıcıyı PWM modunda çalıştırıp darbe genişliğini istediğiniz gibi ayarlarsınız.

Sistemin clock ayarlarını ben yapmıyorum. Kütüphanedeki start kodları yapıyor. STM32F4 denemelerinde de hep @bunalmıs hocanın ayarlarını kullandım. Dolayısıyla bu işlemcide RCC konusuna hiç bir zaman hakim olamadım.  Bu sebeple Clock ayarlarınızda hata olup olmadığını anlayamıyorum.
sitedeki örneklerde muhakkak bununla ilgili bir şeyler vardır.

TIMER NVIC ayarlarında da bir sorun var sanırım. (Kullandığımız kütüphaneden kaynaklı bir fark olabilir)
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;
satırı şu şekilde olmalıydı. 
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;

Benim konfigürasyonum bu.

TIM_TBInitStruct.TIM_Prescaler =72 ;
	 TIM_TBInitStruct.TIM_Period =20000;
	 TIM_TimeBaseInit(TIM2,&TIM_TBInitStruct);

	 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	 
	 NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	 NVIC_Init(&NVIC_InitStruct);
	 TIM_Cmd(TIM2, ENABLE);


void TIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
GPIOA->ODR ^= 0x100;
}

Klein

1-2 yıl kadar önce Bir arkadaş getirtirken yanında 50 Adet STM32F103C8T6 getirtmiştim. Adet fiyatı 1.6 Dolara gelmişti.
Aliexpres'ten baktım 1.6$ civarı bulunabiliyor.   Buraya maliyeti 2 doları bulur.

muhittin_kaplan

#65
tekrar, kendi adıma ,mçip e boşuna öpülmüşüz

Mucit23

#66
@Gerbay,

Hocam Çinden alışveriş yapıyorsanız inanın herşey olabilir. Aliexpress den ise bende alıveriş yapmıştım. Ürünün gelip gelmemesinde bir problem olmuyor. Ürünün Problemli gelmesi düşük bir ihtimal ama olabilir sonuçta. Güvenilen satıcılardan ürün alınmalı.

Bu işlemcilerde Hazır Kütüphane kullanırken Bende dediğiniz gibi zorluk çekiyorum işlerin nasıl yürüdüğünü gerçekten anlayamıyorum. En son internetten RCC ayarlarının yapıldığı stm32f10x_rcc.c dosyasını indirip neyin ne işe yaradığını hangi bölücünün neyi böldüğünü öğrendim. Bundan sonra gerekli ayarları yaptığımda işler dahada berbatlaştı. Olmadı Bülent Hocamızın yaptığı yöntemle yapacağım. Eğer işlemci 72Mhz de çalışıyorsa yukarıda verdiğim kodlarda timer içerisinde yaptığım işlemi main içerisinde yaparsam kaç Khz lik bir çıkış sinyali almam gerekir?

Servo sürmek  için önerebileceğiniz iyi bir yöntem varmı? PWM ile yapabileceğimi düşünüyorum. Öyle olursa hem pwm donanımını öğrenirim hemde işimi görürüm. 
Normalde Piclerde yaklaşık 4mhz osc için CCP  donanımında 250Hz den düşük pwm frekansı alınamıyor. ARM de bu durum nasıl? 50Hz pwm sinyali  alabilirmiyim? Bu konuyu öğrenmek istiyorum. Yol gösterirseniz sevinirim.

mesaj birleştirme:: 22 Kasım 2012, 18:47:17

Alıntı yapılan: muhittin_kaplan - 22 Kasım 2012, 18:42:21
tekrar, kendi adıma ,mçip e boşuna öpülmüşüz

Hocam Doğru söylüyorsunuzda bu ARM nin de bin türlü derdi var.  :o :o

muhittin_kaplan

#67
1 haftadır pcb ye monte (ki lehimlemek de sıkıntı yarattı) mcu ya stlink üzerinden prog atmaya çalışıyorum. neyse benim iş halloldu, sıra bunda bilinky.

mesaj birleştirme:: 22 Kasım 2012, 18:56:09

ben olsam PWM ile hallederim

Klein

Alıntı YapServo sürmek  için önerebileceğiniz iyi bir yöntem varmı? PWM ile yapabileceğimi düşünüyorum. Öyle olursa hem pwm donanımını öğrenirim hemde işimi görürüm. 
Normalde Piclerde yaklaşık 4mhz osc için CCP  donanımında 250Hz den düşük pwm frekansı alınamıyor. ARM de bu durum nasıl? 50Hz pwm sinyali  alabilirmiyim? Bu konuyu öğrenmek istiyorum. Yol gösterirseniz sevinirim.

APB frekansın max = 72MHz. olsun.
Bölücümüz 16 bit  = max 65535 olabilir. (Bölme ile ilgili bir kısıtlama görmedim)
Reload değerimiz  16 bit = max 65535 olabilir.  (Yeniden yükleme için de bir kısıtlamaya rastlamadım)
Saatimizi bölücüden geçirelim.
72000000 / 65535 = 1098  Sayıcımız saniyede 1098 kez sayacak ve ARR değerine ulaştığında sıfırlanacak.
1098 / 65535 = yaklaşık 0.017 Yani PWM frekansımız en düşük 0.017Hz olabiliyormuş. neredeyse 1 dakika süren darbe uzunluğu mümkün. 50 Hertzin lafı bile olmaz.

Bundan sonra gerekli ayarları yaptığımda işler dahada berbatlaştı. Olmadı Bülent Hocamızın yaptığı yöntemle yapacağım.


Bu kod CooCox  ile gelen Startup dosyasındaki SystemInit() fonksiyonu.
void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;

#ifdef STM32F10X_CL
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= (uint32_t)0xEBFFFFFF;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;      
#else
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
    
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
  #ifdef DATA_IN_ExtSRAM
    SystemInit_ExtMemCtl(); 
  #endif /* DATA_IN_ExtSRAM */
#endif 

  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
  /* Configure the Flash Latency cycles and enable prefetch buffer */
  SetSysClock();

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
}


Bu da 4 kanallı pwm

void init_rcc(void){
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | \
						   RCC_APB1Periph_TIM4 | RCC_APB1Periph_USART3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |\
						   RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_CRC,ENABLE);

}

void init_tim2(void){
TIM_TimeBaseInitTypeDef TIM_TBInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;


	 TIM_TBInitStruct.TIM_Period = 7200;
	 TIM_TBInitStruct.TIM_Prescaler =199;
	 TIM_TBInitStruct.TIM_ClockDivision = 0;
	 TIM_TBInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	 TIM_TimeBaseInit(TIM3, &TIM_TBInitStruct);

	 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
	 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;


	 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
	 TIM_OCInitStruct.TIM_Pulse = 0;
	 TIM_OC1Init(TIM3, &TIM_OCInitStruct);
	 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);


	 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
	 TIM_OCInitStruct.TIM_Pulse = 0;
	 TIM_OC2Init(TIM3, &TIM_OCInitStruct);
	 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

	 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
	 TIM_OCInitStruct.TIM_Pulse = 0;
	 TIM_OC3Init(TIM3, &TIM_OCInitStruct);
	 TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

	 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
	 TIM_OCInitStruct.TIM_Pulse = 0;
	 TIM_OC4Init(TIM3, &TIM_OCInitStruct);
	 TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

	 TIM_ARRPreloadConfig(TIM3, ENABLE);
	 TIM_Cmd(TIM3,ENABLE);
}

/*********   PWM Duty oranını değiştirmek ************************************/

// Burada kütüphane fonksiyonlarını kullanmadım.
	TIM3->CCR4 = 126;
	TIM3->CCR3 = 185;
	TIM3->CCR2 = 99;
	TIM3->CCR1 = 36;






Mucit23

#69
Yarın Hocam PWM üzerine bir çalışma yapacağım. Pek Zor Görünmüyor.

mesaj birleştirme:: 23 Kasım 2012, 09:40:39

Bu işlemci 72Mhz ve üzerinde de çalışıyor

OSC ye bağlı Kristal 8mhz. Bu frekansı hiç bölmeden 14 ile çarptım. Normalde 112 Mhz de çalışması gerekir. Bunu tam doğrulayamıyorum ama Mail içerisinde Aşağıdak kodu çalıştırdığımda
   while(1)
   {   
   i=1-i;
   Servo(i);
    }
Çıkış pininde 1,790Mhz sinyal alıyorum. 72Mhz de çalıştırdığımda aynı pinden aldığım sinyal 757.94 Khz Alıyorum.

Klein Hocam bence sizin timer hesaplamalarında bir problem var. Çünkü Dediğiniz gibi yapınca pwm frekansı Timerden aldığım frekans çok çok düşük değerler.


Klein

Timer hesaplamalarında bir hata yok.emin olabilirsin.  Verdiğim kodu birisi çalıştıramadığı zaman muhakkak denerim.
Netekim denedim ve verdiğim hesaplamalarda bir hata olmadığını gördüm.

Mucit23

İlginç bir durum. Geriye birtek soru işareti kalıyor. Oda Timer bölücüsünde. Acaba onumu yanlış yapıyoruz? Gerçi sizin verdiğiniz gibi bir değerde yaptım ama olmuyor.

Sizin verdiğiniz Timer Hesabında PSC değeri Timer bölücüsü değilmi? Bu konuda birtek bu takıldı aklıma.

Neyse Artık bu konuda uğraşmayacağım.

Servoyu çalıştırdım ama main içerisinde sadece 50Hz sinyali çıkardım. kesme içerisidede buton vs okudum. Pek iyi bir yöntem olmadı.

Son olarak 2 soru daha sormak isterim.

PWM'i tekrar deneyeceğim ama aklıma takıldı. Datasheette direk belirtilmemiş. Bu işlemcide PWM çıkışları hangisi?

Birde Systick donanımında ms cinsinden bekleme yapabiliyorum. us cinsinden bekleme yapabilmek için işlemciyi boş döndüren bir fonksiyon kullanıyorum ama nedense ondada lineerliği yakalayamadım. Çok garip bir durum.
Mesela 32Mhz için 100us bekleme için aldığım delay değerini 6 ile çarpıp elde edilen değer kadar işlemciyi boşta döndürüyorum. Osiloskopla baktığımda tam istediğim gibi .
Ama Diyelim işlemcinin hızını 64Mhz ye çıkardığımda 100us için bekleme yukarıda verdiğim delay katsayılarınıda iki katına çıkardığımda bu sefer işlemci 100 bekleyecekse 150 bekliyor. Bu konuda çok saçma geldi bana.

Gerçekten işlemciye hakim olmadan program yazmak zor birşey. Heleki ARM de

Hem uS cinsinden Hemde Ms cinsinden bekleme yapmak için SyStick donanımı kullanılabilirmi?

Klein

İşlemcide PWM çıkışları, Timer çıkışları.
TIM4_CH1 , TIM3CH2, TIM2_CH2  gibi pinler var. Bunlar timer çıkışları. Aynı zamanda PWM çıkışları. Her Timerin 4 tane çıkış ya da girişi var.

Evet PSC değeri bölücü değeri. Bölücü değerinin hesaplamasında da sorun yok. 50Hz için denedim.

SysTick ile 1uS elde edemiyorsun.  Girişi 9Mhz 9'a bölünce 1uS elde etmek lazım. Ama 10 mikrosaniyenin altına inmedi. Datasheetlere bakmak lazım.  Ama diğer Timerler oraya iniyor.  Tim2 için denedim sorun yok. İnebiliyor. Ama 1uS oldukça iddialı bir değer. Başka kesmeler içerisinde yapılan işler 1uS'den uzunsürüyorsa, stabil bir değer alması oldukça zor.
Eğer başka kesmeler içerisinde Timer kesmesini bekletecek bir şey yosa şöyle yapabilirsin.
volatile uint32_t delay_counter;

void init_tim2(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TBInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;

	 TIM_TBInitStruct.TIM_Prescaler =34;
	 TIM_TBInitStruct.TIM_Period =1;
	 TIM_TimeBaseInit(TIM2,&TIM_TBInitStruct);

	 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

	 NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	 NVIC_Init(&NVIC_InitStruct);
	 TIM_Cmd(TIM2, ENABLE);
}

void TIM2_IRQHandler(void)
{
delay_counter--;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

void delay(uint32_t delay)
{
delay_counter = delay;
while(delay_counter);
}

//****************  çağırma  *************************
delay(10);   // 10uS + çağırma, geri dönme vs.. zamanı
delay(100); //100uS + "
 

Mucit23

Hocam birşey sormak isterim. Keil ile birlikte gelen örnek kodları deney kitine yükediğim zaman program otomatikmen çalışmaya başlıyor. Fakat benim yazdığım programları yükledikten sonra elle reset atmam gerekiyor. Keilde bunun bir ayarı olması lazım. Bende otomatikmen başlamasını istiyorum. Nasıl yapabilirim?

Klein

Ayarların içerisinde var. 
U-Link kullanıyorsanız : utilities sekmesinden, U-Link ayarları butonu ile  açılan pencereden  "Flash Download" sekmesine.
orada "Reset and Run" kutucuğunun tikini kaldırmak gerek.

ST-Link için
omut satırına girdiğimiz parametrelerin en sonundaki  "-Rst -Run " komutlarını kaldırmak gerek.   

(hiç denemedim.)