STM32F4 Discovery, blinky.c 1ms interrupt

OP #2968820
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++;
}
Gast #2968841
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.
OP #2968843
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.
#2968856
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
#3104150
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
Gast #3104654
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren