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++; }
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.
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.