Hallo,
ich besitze ein Keil Cortex-M3 Eval-Board (MCBSTM32 Vers1.1) inkl. Keil
uVision Compiler. Ich möchte gerne einen Timer (Tim3) nutzen um eine
Delay-Funktion zu generieren. Doch scheint es mir so als ob der Timer
nicht richtig läuft. Ich hoffe Ihr könnt mir weiterhelfen. Ich löse die
Timerfunktion aus und warte auf das Setzen des TIM_FLAG_Update-Flags, es
wird aber gar nicht auf die Flag-Änderung gewartet sondern mein
restlicher nachfolgender Code ausgeführt...
1 | void Timeout10usIntConfiguration(void) // wird in main ausgeführt
|
2 | {
|
3 | NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
|
4 | NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
|
5 | NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
|
6 | NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
|
7 | NVIC_Init(&NVIC_InitStruct);
|
8 | }
|
9 | // initialisierung der delay funktion
|
10 | void Timeout10usConfiguration(unsigned short Value)
|
11 | /*~-*/
|
12 | {
|
13 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
14 | /*~+:Configure TIM3 for clock generation*/
|
15 | TIM_DeInit(TIM3);
|
16 | /*~+:Time base configuration*/
|
17 | TIM_TimeBaseStructure.TIM_Period = 10*Value-1;
|
18 | TIM_TimeBaseStructure.TIM_Prescaler = 71;
|
19 | TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
20 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
|
21 | TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
|
22 | TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
|
23 | TIM_ClearFlag(TIM3, TIM_FLAG_Update);
|
24 | TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
|
25 |
|
26 | TIM_ClearFlag(TIM3, TIM_FLAG_Update);
|
27 | TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // enable Update Interrupt
|
28 |
|
29 | TIM_ClearFlag(TIM3, TIM_FLAG_Update); /* clear int flag */
|
30 | TIM_Cmd(TIM3, ENABLE); /* start timer */
|
31 | }
|
32 |
|
33 | void TIM3_IRQHandler(void)
|
34 | {
|
35 | TIM_Cmd(TIM3, DISABLE); /* stop timer */
|
36 | TIM_ClearFlag(TIM3, TIM_FLAG_Update); /* clear int flag */
|
37 | boTim3End = TRUE;
|
38 | }
|
Timeout10usConfiguration wird mit entsprechendem Wert aufgerufen und
danach wird auf das Flag gewartet:
1 | while(TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) == SET);
|
Da dies nicht half habe ich es mit dem Setzen von boTim3End versucht,
was in einem Deadlock endet:
1 | while(boTim3End == FALSE);
|
Wie bereits geschrieben wird das Flag bei TIM_GetFlagStatus nicht
beachtet und einfach der nachfolgende Code ausgeführt.
Woran könnte das liegen bzw. wo ist mein Fehler oder kann ich keine
Flags/Variablen, die innerhalb der Interruptroutine gesetzt werden
ausserhalb der abfragen?
Gruß domi_