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 ?