Forum: Mikrocontroller und Digitale Elektronik STM32F4 Discovery, blinky.c 1ms interrupt


von Helmut S. (helmuts)


Lesenswert?

Hallo,

Ich habe gerade mit der limitierten Keil-Version das Programm Blinky auf 
dem STM32F4 Discovery Board ausprobiert.
Dieses blinky-Programm hat laut Kommentar alle 1ms einen Interrupt.
Ich gehe mal davon aus, dass SysTick_Config(SystemCoreClock / 1000) den 
1ms Interrupt konfiguriert und startet.

1.
Warum kommt mit SystemCoreClock/1000 ein Wert von 1ms heraus, da der 
Prozessor doch mit 168MHz arbeitet?

Ich habe den relevanten Code unten angehängt.

2.
Wo findet man eine ausführliche Doku über diese Funktion 
SysTick_Config() und andere wichtige Funktionen?

Gruß
Helmut

Anhang:

blinky.c
--------

  SystemCoreClockUpdate();   /* Get Core Clock Frequency   */
  if (SysTick_Config(SystemCoreClock / 1000)) {
                             /* SysTick 1 msec interrupts  */
       while (1);            /* Capture error */
  }


led.c
......

volatile uint32_t msTicks;  /* counts 1ms timeTicks       */
                            /*-----  SysTick_Handler -*/
void SysTick_Handler(void) {
  msTicks++;
}

von Dr. Sommer (Gast)


Lesenswert?

Helmut S. schrieb:
> 1.
> Warum kommt mit SystemCoreClock/1000 ein Wert von 1ms heraus, da der
> Prozessor doch mit 168MHz arbeitet?
SystemCoreClock = 168000000
also
SystemCoreClock/1000 = 168000 . Die Interrupt-Frequenz ist dann 
F_CPU/168000 = 16800000 Hz /168000 = 1000 Hz = 1/1ms


> Wo findet man eine ausführliche Doku über diese Funktion
> SysTick_Config() und andere wichtige Funktionen?
Ausführliche gibts nicht, eine kurze findet sich als Kommentar über der 
Funktion in der ST Standard Periphal Library, die beim Code dabei sein 
müsste oder auch auf der ST Seite über den STM32407 downloadbar ist.

von Helmut S. (helmuts)


Lesenswert?

Ah, danke. Ich hatte gedacht 1000 wäre der Clock-Teiler. So wie du das 
beschrieben hast macht das natürlich mehr Sinn.

Ich muss schon sagen, dass selbst die Konfiguration eines I/O pins bei 
ARM eine komplizierte Sache ist. Das ist bei den 8-Bit Mikrocontrollern 
noch deutlich einfacher. An Assembler will ich bei ARM schon gar nicht 
mehr denken.

von Heiko J. (heiko_j)


Lesenswert?

Helmut S. schrieb:

> Ich muss schon sagen, dass selbst die Konfiguration eines I/O pins bei
> ARM eine komplizierte Sache ist.
Also ich empfinde das nicht so. mit der StdPeriph- und CMSIS-Library ist 
das auf dem stm32 eigentlich ganz einfach. z.B. zwei LEDs an PC6 & PC7 
in ein paar Zeilen

#define LED1_PIN GPIO_Pin_6
#define LED2_PIN GPIO_Pin_7
#define LED_GPIO GPIOC

#define led1_on() GPIO_SetBits(LED_GPIO, LED1_PIN);
#define led2_on() GPIO_SetBits(LED_GPIO, LED2_PIN);

#define led1_off() GPIO_ResetBits(LED_GPIO, LED1_PIN);
#define led2_off() GPIO_ResetBits(LED_GPIO, LED2_PIN);

#define led1_get() GPIO_ReadOutputDataBit(LED_GPIO, LED1_PIN);
#define led2_get() GPIO_ReadOutputDataBit(LED_GPIO, LED2_PIN);

#define LED_APB2_RCC RCC_APB2Periph_GPIOC

void LEDInit() {
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    RCC_APB2PeriphClockCmd(LED_APB2_RCC, ENABLE);
    GPIO_Init(LED_GPIO, &GPIO_InitStructure);
}


> Das ist bei den 8-Bit Mikrocontrollern
> noch deutlich einfacher. An Assembler will ich bei ARM schon gar nicht
> mehr denken.
Die ekligen Sachen sind IMHO eigentlich eher in den Errata zu finden. 
z.B. I2C mit dem stm32 ist aufgrund der Einschränkungen so komplex, dass 
ich das  mitlerweile mit GPIO & TIM per Bitbanging mach. Bei komplexen 
Szenarien mit IRQ-Priorisierung und IRQ-Preemption in kombination mit 
Einschränkungen wie bei HW-I2C ist es ein Wunder nicht durcheinander zu 
kommen.

Nichts desto trotz sind die Ärmchen ein sehr schönes Spielzeug.

Gruß Heiko

von Helmut S. (helmuts)


Lesenswert?

Hallo Heiko,
Vielen Dank für deine ausführliche Erklärung. Ich werde morgen dein 
Beispiel ausprobieren.

Wichtig sind für mich auch priorisierte Interrupts, z. B. einer alle 
100us, 1ms und 10ms. Mal sehen ob ich da Beispiele finde.

Gruß
Helmut

von Helge K. (bassman)


Lesenswert?

Hallo,
um (unnötige) Denkarbeit bei der Konfiguration zu vermeiden hat ST nun 
ein Update von ihrem MicroXplorer herausgebracht (V3.0, 
http://www.st.com/web/en/catalog/tools/PF251717). Damit kann man einfach 
die Funktionen und GPIOs konfigurieren und den entsprechenden Code 
erzeugen. Der Vorteil hiervon ist, dass es auch Kollisionen bei der 
Konfiguration erkennt.
Und ich glaube, es gibt keinen embedded Programmierer, der nicht schon 
Stunden mit der Suche nach so einem Phänomen verbracht hat...

Gruß,
bassman

von Bill (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Ausführliche gibts nicht, eine kurze findet sich als Kommentar über der
> Funktion in der ST Standard Periphal Library, die beim Code dabei sein
> müsste oder auch auf der ST Seite über den STM32407 downloadbar ist.

Doch, sicher gibt es die. In der CMSIS Dokumentation. 
Core->Reference->Systick Timer

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.