Forum: Compiler & IDEs STM32F2xx - Timer Probleme


von Elektroniker (Gast)


Lesenswert?

Hallo,

mit dem STM32F2xx benötige ich eine Ethernetkommunikation zum PC. 
Hierfür nutze ich den LwIp Stack ohne Betriebssystem (Standalone).
Das Empfangen von Daten über die Ethernetschnittstelle soll über den 
Timer3 erfolgen. In dem anderen Teil der Applikation
habe ich eine Schedulerfunktionalität mit dem Timer2 realisiert. In der 
Initialisierungsphase der Ethernetschnittstelle werden die beiden
Funktionen ETH_BSP_Config(); LwIP_Init(); ausgeführt. Nachdem 
funktioniert der Scheduler nicht mehr so wie er sollte.
1
// Timer2 für Scheduler
2
void Timer2_Init(void)
3
{
4
  TIM_TimeBaseInitTypeDef     TIM2_TimeBaseInitStructure; 
5
  NVIC_InitTypeDef NVIC_TIM2InitStructure;
6
 
7
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
8
9
  TIM_DeInit(TIM2);
10
11
  TIM_InternalClockConfig(TIM2); 
12
13
  NVIC_TIM2InitStructure.NVIC_IRQChannel = TIM2_IRQn;
14
  NVIC_TIM2InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
15
  NVIC_TIM2InitStructure.NVIC_IRQChannelSubPriority = 2;
16
  NVIC_TIM2InitStructure.NVIC_IRQChannelCmd = ENABLE;
17
  NVIC_Init(&NVIC_TIM2InitStructure);
18
  
19
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
20
  
21
  TIM2_TimeBaseInitStructure.TIM_Period = 10;    
22
  TIM2_TimeBaseInitStructure.TIM_Prescaler = 12000;  // für SYSCLK_FREQ_120MHz          
23
  TIM2_TimeBaseInitStructure.TIM_ClockDivision = 0; 
24
  TIM2_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
25
  
26
  TIM_TimeBaseInit(TIM2, &TIM2_TimeBaseInitStructure); 
27
 
28
  TIM_Cmd(TIM2, ENABLE); 
29
}
30
31
void TIM2_IRQHandler(void)
32
{    
33
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
34
  Tick();
35
}
1
// Timer3 für Ethernetkommunikation
2
void Timer3_Init(void)
3
{
4
  TIM_TimeBaseInitTypeDef     TIM3_TimeBaseInitStructure; 
5
  NVIC_InitTypeDef NVIC_TIM3InitStructure;
6
 
7
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 
8
9
  TIM_DeInit(TIM3);
10
11
  TIM_InternalClockConfig(TIM3); 
12
13
  NVIC_TIM3InitStructure.NVIC_IRQChannel = TIM3_IRQn;
14
  NVIC_TIM3InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
15
  NVIC_TIM3InitStructure.NVIC_IRQChannelSubPriority = 2;
16
  NVIC_TIM3InitStructure.NVIC_IRQChannelCmd = ENABLE;
17
  NVIC_Init(&NVIC_TIM3InitStructure);
18
  
19
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
20
  
21
  TIM3_TimeBaseInitStructure.TIM_Period = 1000;    
22
  TIM3_TimeBaseInitStructure.TIM_Prescaler = 12000;  // für SYSCLK_FREQ_120MHz          
23
  TIM3_TimeBaseInitStructure.TIM_ClockDivision = 0; 
24
  TIM3_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
25
  
26
  TIM_TimeBaseInit(TIM3, &TIM3_TimeBaseInitStructure); 
27
 
28
  TIM_Cmd(TIM3, ENABLE); 
29
}
30
31
void TIM3_IRQHandler(void)
32
{    
33
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
34
  STM_EVAL_LEDToggle(LED2);
35
  if (ETH_CheckFrameReceived())
36
  { 
37
    STM_EVAL_LEDToggle(LED4);
38
  }
39
}

Prinzipiell müsste doch dies mit den beiden Timern funktionieren. Wo 
könnte hier möglicherweise das Problem liegen ?

von Elektroniker (Gast)


Lesenswert?

Ich habe nun das Problem für dieses Verhalten gefunden. Das Problem lag 
in der Initialisierungsroutine "ETH_BSP_Config" für das 
Ethernetinterface. Hier wurde der SysTick-Handler aufgerufen. Die 
nötigen Zeile habe ich zunächst auskommentiert.

von Elektroniker (Gast)


Lesenswert?

Um den LwIp-Stack auf dem STm32 in Betrieb zu nehmen, braucht man ja 
zwangsläufig kein Betriebssystem. Deshalb möchte ich einen zusätzlichen 
Hardwaretimer (Timer3) für ankommende Ethernetpacket einsetzen. Die 
Schedulerfunktionalität braucht ebenfalls einen eigenen Hardwaretimer 
(Timer2 oder SysTick). Ist diese Vorgehensweise sinnvoll oder verbirgt 
diese ein Problem ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.