Forum: Mikrocontroller und Digitale Elektronik Cortex M3 system tick timer läuft nicht loc


von Sylvia H. (sandy)


Lesenswert?

Hi Leute,
wenn ich den system tick timer auf meinem Cortex starten möchte, dann 
rufe ich doch nur einmal in meiner main() Methode die Methode 
SysTick_Config(72000000) auf,
1
/** \brief  System Tick Configuration
2
3
    This function initialises the system tick timer and its interrupt and start the system tick timer.
4
    Counter is in free running mode to generate periodical interrupts.
5
6
    \param [in]  ticks  Number of ticks between two interrupts
7
    \return          0  Function succeeded
8
    \return          1  Function failed
9
 */
10
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
11
{ 
12
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
13
                                                               
14
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
15
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
16
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
17
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
18
                   SysTick_CTRL_TICKINT_Msk   | 
19
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
20
  return (0);                                                  /* Function successful */
21
}

und schreiben dann in meinen Händler:

[c]
void SysTick_Handler(void)
{
  outpin_toggle(&led_4);
}

und schon müsste doch eine LED jede Sekunde getoggelt werden?

Oder hab ich irgendwas wichtiges vergessen, da meine LED nicht 
reagiert....
von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi,

**g**, das (und den NVIC Part) hab ich mal verbrochen :-)

nicht ganz, der Systick Timer ist nur ein 24Bit Timer, d.h. 1sec wirst 
damit so nicht hinbekommen.
Diese Routine ist auch im wesentlichen für OS Anwendungen gemacht, wo es 
alle 10ms, 100ms, ... einen Interrupt für den Scheduler geben soll.

Der SysTick hat noch einen zweiten Takteingang, der ist aber 
implementierungsabhängig. Der LMI3S8xx glaube ich kann den SysTick Takt 
noch mal durch 8 teilen, aber da musst mal in dein Manual schauen.

Du kannst auch in der SysTick ISR die restlichen 8Bit mit einem Zähler 
nachstellen.


VG,
/th.
von Turbo J (Gast)


Lesenswert?

Da fehlt eventuell noch das Enable am NVIC:
1
NVIC_EnableIRQ(Systick_IRQn);

Und die Interrupts müssen natürlich auch global enabled sein:
1
__enable_irq();
von Sylvia H. (sandy)


Lesenswert?

Turbo J schrieb:
> NVIC_EnableIRQ(Systick_IRQn);

es gibt kein Systick_IRQn ????

Turbo J schrieb:
> __enable_irq();

das gibt es auch nicht ???? (in der stm32f10x.h)
von Sylvia H. (sandy)


Lesenswert?

ich versuchs jetzt mal mit Timer 3, doch steig ich nicht so richtig 
dahinter, wie ich den Wert für TIM_Period einstellen muss, um auf 1 sec 
zu kommen:
das ist für 1 ms:
1
  /* Time base configuration */
2
            TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
3
            TIM_TimeBaseStructure.TIM_Period = 65535;
4
            TIM_TimeBaseStructure.TIM_Prescaler = 0;
5
            TIM_TimeBaseStructure.TIM_ClockDivision = 0;
6
            TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
7
8
            TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
9
10
11
12
             /* TIM IT enable */
13
              TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
14
15
            /* TIM2 enable counter */
16
            TIM_Cmd(TIM3, ENABLE);
schreib ich für 1 sec :
1
TIM_TimeBaseStructure.TIM_Period = 65535000;   ???
von Sylvia H. (sandy)


Lesenswert?

doofe Frage, ich gebs zu......
muss das Datenblatt durchforsten, dann weis ich (hoffentlich) wie`s 
einzustellen ist.....

aber noch am Rande:
muss
1
/*  TIM3  clocks enable */
2
    RCC_APB2PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);
vor oder nach der Timer initialisierung aufgerufen werden?
von friedrich (Gast)


Lesenswert?

Hallo sylvia,

um die Timer zum laufen zu bringen musst Du sie mit Takt versorgen.
Der angeführte Code schaltet diesen frei, sonst geht der Timer nicht.

Grüße
von Uwe (Gast)


Lesenswert?

Versuchs mal mit Prescaler. Bei 72MHz ohne Prescaler mit einem 16 Bit 
Counter kannst du als längste Periode (1/72MHz)*65536 = 0.91ms 
hinbekommen.
Du brauchst also mindestens einen Prescaler von 2048 oder nimmst einen 
32 Bit Counter.

72MHz/2048 = 35156,25 Hz
wenn ich nun bis 35156 zähle ist genau 1 Sekunde vergangen.

bzw.
(1/72MHz)*2048 = 28,444µs (ein tick)
1s/28,444µs=35156,25 (eine Sekunde besteht aus 35156 ticks)
von Sylvia H. (sandy)


Lesenswert?

ah, jetzt klingelts wieder, da war doch was in der 
Mikrocontrollervorlesung......
Danke für den Tip!! Jetzt weis ich wieder bescheid.
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.