Hallo, bin gerade dabei das ich mir einen Timer bastle, welcher nach 5sec einen Interrupt auslöst. TIM_DeInit(TIM1); TIM_TimeBaseStructure.TIM_Period = 50000; TIM_TimeBaseStructure.TIM_Prescaler = 24; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); TIM_Cmd(TIM1, ENABLE); Jetzt bin ich mir aber nicht sicher, wie das mit dem Prescaler und der Period funktioniert. Also Prescaler mal auf 24 damit ich von 24MHz -> 1MHz komme. Period habe ich auf 50000 für 5sec. Die 50000 sind bestimmt falsch. Nur versteh nicht ganz wie das mit dem umrechnen funktioniert. lg m1011
1 Hz = 1 tick pro sekunde 24 Mhz = 24MHz * 1000 KHz /MHz * 1000 Hz/KHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2; Lies dir auch noch mal durch was das bedeutet. Für so große Sachen hat der STM übrigens auch nen Real Time Counter. mfg Jan
Solch lange Zeiten realisiert man normaler Weise nicht direkt mit einen Timer. So könnte es aber gehen, nicht getestet. (Geht von SystemCoreClock = 24MHz aus!)
1 | #define TIMER_TAKT 10000 // Timer wird mit 10KHz getaktet
|
2 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; |
3 | uint16_t PrescalerValue; |
4 | |
5 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIMER 2 Takt freigeben, Bsp. |
6 | PrescalerValue = (uint16_t) (SystemCoreClock / TIMER_TAKT) - 1; // Vorteiler berechnen |
7 | |
8 | // Timer Grundkonfiguration
|
9 | TIM_TimeBaseStructure.TIM_Period = 50000; // Timer zählt von 0 .. 50000, = 0,2Hz |
10 | TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; |
11 | TIM_TimeBaseStructure.TIM_ClockDivision = 0; |
12 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // Zählrichtung (hoch) |
13 | TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Timer einstellen |
Interrupt dazu für Überlauf konfigurieren.
thx erst mal. es ist so, ich bekomme vom ADC einen wert. unterschreitet der eine gewisse grenze, dann soll ein timer ausgelöst werden (5sec lang). nach weiteren 5sec soll noch ein interrupt kommen. weiters soll ein anderer timer eine LED steuern. also im grunde brauche ich zwei timer (2x 5sec & LED). wie soll ich da jetzt am besten vorgehen? soll ich die 5sec jeweils mit dem "Real Time Counter" machen und nur die LED mit einem timer? lg m1011
Die STM32 haben genug flexible Timer. Ich würde es aber in konkreten Fall anders lösen, indem ich den SysTick-Timer in einem konstanten Raster (zB. 10ms) laufen lassen würde. In der dazugehörigen Interruptroutine kannst Du dann bei Bedarf andere Variablen hoch- oder runterzählen und dann entsprechende Reaktionen ausführen.
Max Mustermann schrieb: > unterschreitet der eine > gewisse grenze, dann soll ein timer ausgelöst werden (5sec lang). Diesen Satz kapier ich nicht so ganz. Du bekommst vom ADC einen Wert und wenn diese eine bestimmte Grenze unterschreitet dann soll 5 Sekunden lang was passieren? Ich persönlich würd es abhängig machen: Wenn du sowieso einen Timer brauchst, dann kannst du ja gleich in der ISR eine Variable für die 5 Sekunden Zeitspanne hochzählen. Wenn du eine Art delay Funktion haben möchtest, die einfach nur 5 Sekunden wartet, dann würde ich das mit dem Systick Timer lösen.
über ein potentiometer kann ich einen wert einstellen, mit der RTC wird dieser jede sekunde abgefragt und mittels ADC umgewandelt. nehmen wir an unserer grenzwert liegt bei 15, stellt man den poti jetzt auf 12 so soll ein timer von 5sec ausgelöst werden. wird der wert innerhalb der 5sec nicht wieder auf min. 15 erhöht so beginnt wieder ein 5sec. timer welcher am ende einen alarm auslöst.
Max Mustermann schrieb: > nehmen wir an unserer grenzwert liegt bei 15, stellt man den poti jetzt > auf 12 so soll ein timer von 5sec ausgelöst werden. wird der wert > innerhalb der 5sec nicht wieder auf min. 15 erhöht so beginnt wieder ein > 5sec. timer welcher am ende einen alarm auslöst. Das zu lösen ist keine wirkliche Herausforderung. Alles leicht über SysTick oder einen Universal-Timer zu machen.
danke erstmals! hatte in letzter zeit viel um die ohren und konnte mich deshalb nicht der thematik stm32 wittmen. wie würde das mit der SysTick aussehen? weiß jetzt nicht ganz wie ich da an die sache rangehen soll. lg m1011
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.