Ynt: STM32f103 Timer sorunum

Başlatan camby, 02 Haziran 2013, 18:41:12

camby

STM32f103CB ile timer kurmaya çalışıyorum ancak sorunum var.

Sysclock 64MHz de çalışıyor ve MCO'dan ölçümü yapıyorum sorun yok.

Timer'ı ( TIM1 TIM2 TIM3) denedim hepsini , 10ms periyodik kesme almaya çalışıyorum , kesme fonksiyonu içinde de bir çıkış pininin durumunu değiştiriyorum.

Ne yaptıysam istediğim süreyi alamadım. Ölçtüğüm süre sürekli 11ms ( 45Hz ) , 2 katı fazla yada 1/2 si olsa diyecem bölücülerden birinde hata yapıyorum ama yok 11ms : ) Tick timer da mco 'da sorun yok ama timer'lar bu şekilde.

Nedir bunun sebebi ? Kodlarım aşağıdaki gibi

//====== TIM1 Init ==========================================================
void TIM1_Init(void) 
{
	// Timer1 clock 64 MHZ , Prescaler 48.000 -> 1 ms'de bir deger 1 artar.
	
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;				// Struct
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);		// Clock Enable
	TIM_DeInit(TIM1);
	
	TIM_TimeBaseStructure.TIM_Period = 10;						// Ayarlar
	TIM_TimeBaseStructure.TIM_Prescaler = 64000-1;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 				//TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
	
	TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);					// Interrupt
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;			// NVIC Ayarlari
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM1, ENABLE);										// Enable TIM1
}//============================================================================


Belki STLib'de sıkıntı vardır dedim kendi kodlarımda denedim yine aynı 11ms..

//====== Timer2 Init ==========================================================
void Timer2_Init(void) 
{
	// Timer2 clock 64 MHZ , Prescaler 64.000 -> 1 ms'de bir deger 1 artar.
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC->APB1ENR |= (1UL << 0);               	// Enable Timer7 clock   ( 84 MHz )
	TIM2->CR1 = 0x0080;              			// 1: TIMx_ARR register is buffered
	TIM2->PSC = 64000-1;           				// Prescaler : 42000
	TIM2->ARR = 10;	            	    		// Auto-Reload : 10
	TIM2->DIER = 0x0001;                    	// Update interrupt enabled.0;       
	TIM2->CR1|=0x0001;                    		// Counter Enable
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				// NVIC Ayarlari
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}//============================================================================


mesaj birleştirme:: 02 Haziran 2013, 18:48:27

Yüzde 10 sapma olması çok garibime gitti , çözemedim gitti.


Timer1'e ve Timer2'ye de 64MHz clock gidiyor.

RCC aşağıdaki gibi :

void SetToHSI64Mhz(void)
{
    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_OFF);
    RCC_HSICmd(ENABLE);
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_2);
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PLLConfig(RCC_CFGR_PLLSRC_HSI_Div2,RCC_CFGR_PLLMULL16);
    RCC_PLLCmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while (RCC_GetSYSCLKSource() != 0x08);
	SystemCoreClockUpdate();
}

Klein

Bölücüyü değil , period registerini -1 ayarlamak gerek.
bölücü = 64000
periyot = 10-1;

camby

Evet o şekilde kullanılacak sanırım..

Örneklerde Bölücü için -1 yapıldığını görmüştüm ben de o şekilde kullanıyordum.

Şimdi tekrar başka örneklere de baktığımda farklı farklı kullanımlar gördüm.

Çıkardığım sonuç : Her ikisi için de gerekiyor.

Örneğin 50khz için :

TIM_TimeBaseStructure.TIM_Period = 10-1;						// Ayarlar
	TIM_TimeBaseStructure.TIM_Prescaler = 64-1;


gerekli.