Hallo Hat sich damit schon mal jemand beschäftigt? ich würde gerne meinen Controller in den Sleep Mode versetzen und bei nem Interrupt (CAN-Nachricht) wieder aufwecken. Super währe, wenn ich ein Bsp. für die Konfiguration usw. irgendwo finden würde, aber g...gle usw. hat mir noch nichts gegeben danke
Reicht da nicht ein
1 | __asm__ volatile ( "wfi\n" ) |
? Grüße Sven
Hi Ich programmiere den in C, und das alleine reicht denk ich nicht... aber ich habe auch noch nicht weiter probieren können
"The Insider’s Guide To The STM32 ARM®Based Microcontroller" sagt:
1 | The WFI and WFE instructions are not reachable from the C language, |
2 | but compilers for the Thumb-2 instruction set provide intrinsic |
3 | macros that can be used inline with standard C commands: |
4 | __WFI |
5 | __WFE |
Welchen Compiler verwendes Du? Grüße Sven
Hi, P. Ostrich schrieb: > hmmmm klingt komplizierter > > codesourcery G++ lite
1 | __asm volatile("wfi"); |
entspricht soweit ich weiss dem GNU Standard. Gruß
Hi, P. Ostrich schrieb: > hmmmm klingt komplizierter > > codesourcery G++ lite
1 | #define __WFI asm volatile("wfi")
|
sollte bei GNU klappen. Gruß
hallo ich bin leider noch nicht so fit in der ganzen geschichte. Das ist ja dann quasi nur die definition. Aber wie rufe ich das im code auf? Danke
Hallo J das habe ich probiert, aber bekomme es nicht so richtig hin.. kurz zur Erklärung... ich habe in meiner stm32f10x_it.c
1 | else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) |
2 | {
|
3 | |
4 | /* Toggle green LED with 1Hz */
|
5 | if (ticks < 500) GPIO_ResetBits(GPIOB, GPIO_Pin_11); |
6 | else GPIO_SetBits(GPIOB, GPIO_Pin_11); |
7 | |
8 | if (ticks < 1000) ticks++; |
9 | else
|
10 | {
|
11 | seconds++; |
12 | |
13 | ticks = 0; |
14 | off ++; |
15 | }
|
16 | |
17 | |
18 | TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); |
19 | |
20 | }
|
Ich lasse also nur die LED blinken. jetzt möchte ich, wenn kein verkehnr mehr auf dem CAn ist den controller via wfi in den sleep schicken. dann solte die LED ja auch aufhören zu blinken Ich habe den int off einfach mal hochzählen lassen und in meiner main dies eingefügt. dann sollte der controllier doch nach 10 Sec. in sleep gehe oder nicht?
1 | if (off>10) |
2 | __WFI; |
P. Ostrich schrieb: > off ++; Ich hoffe, du fährst mit dem Auto nicht, wenn da noch mehr solche Dinger drin sind... ;-) Bei den meisten Controllern holt ein Interrupt den Controller auch wieder aus dem Sleep-Mode - wie genau das beim STM32 ist, habe ich noch nie nachgeschaut.
du das mit der sache ist gerade nur ein test... und wieso auto???? hehe ja wfi steht ja dafür, das er durch nen interrupt aufwacht. und das ist ja nur ein simpler code aufbau... wenn man hier mehr postet, wird ja immer alles mögliche gefragt, was aber nicht zum Thema hilft. dem wollte ich entgehen Aber danke Jan(GAST) !!!!!
Du hattest vor ein paar Wochen mal was zum KFZ-Bordnetz gefragt. Zusammen mit CAN deutet das sehr auf Elektronik für das Auto hin. ;-) Wenn der Controller aus dem Sleep immer durch den Interrupt aufgeweckt wird, blinkt die LED aber immer munter weiter. Der Timer zählt ja weiter im Sleep. Daher verstehe ich deine Frage nicht wirklich.
geschafft :-) PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE); damit klappt es... jetzt muss ich nur noch das drum herrum schreiben dank euch
Problem aufgetaucht
bei
P. Ostrich schrieb:
1 | PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); |
geht er in sleep, aber er sollte bei CAN Aktivität wieder aufwachen.... zählt anscheinen nicht zu den kriterien um ihn wieder zu erwecken... Jemand eine Lösungs Idee? Laut RM0008 Seite 66 verweis auf Table 61: Vector table for other STM32F10xxx devices ist das heir ein aufwachgrund CAN_RX1 CAN RX1 interrupt Adresse0x0000_0094
P. Ostrich schrieb: > PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); > geht er in sleep Dem Namen nach gehts so nicht in den Sleep-Mode sondern in den Stop-Mode. > aber er sollte bei CAN Aktivität wieder aufwachen.... > zählt anscheinen nicht zu den kriterien um ihn wieder zu erwecken... Im Stop-Mode ist die gesamte 1,8V Domain taktlos, folglich dürfte der CAN Controller tot sein. Ebenso die meisten anderen internen Interrupt-Quellen. > Jemand eine Lösungs Idee? Wenn der Sleep-Mode nicht reicht, dann kannst du den CANRX Pin als EXTI definieren. Ein externer Interrupt weckt auch aus dem Stop-Mode auf.
A. K. schrieb: > Dem Namen nach gehts so nicht in den Sleep-Mode sondern in den > Stop-Mode. hast du recht ich hab mich nur nach dem WFI gerichtet. aber nach dem hier aus der stm3110x_pwr.c
1 | /**
|
2 | * @brief Enters STOP mode.
|
3 | * @param PWR_Regulator: specifies the regulator state in STOP mode.
|
4 | * This parameter can be one of the following values:
|
5 | * @arg PWR_Regulator_ON: STOP mode with regulator ON
|
6 | * @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode
|
7 | * @param PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction.
|
8 | * This parameter can be one of the following values:
|
9 | * @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction
|
10 | * @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction
|
11 | * @retval None
|
12 | */
|
13 | void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) |
ist es doch der Stop mode. aber den gibt es eigentlich nicht mit WFI oder WFE siehe Anhang. Wie komme ich sonst in den Sleep Mode bzw. kannst du mir hierbei helfen? A. K. schrieb: > den CANRX Pin als EXTI > definieren
P. Ostrich schrieb: > ist es doch der Stop mode. aber den gibt es eigentlich nicht mit WFI > oder WFE Doch, natürlich, du hast in deiner Table das "+ WFI or WFE" übersehen. Was helfen angeht: Was die StdPeriphLib angeht bist du bei mir an der falschen Adresse und die WFI/WFE-Befehle dürften sich im CMSIS finden - mehr brauchts für den Sleep-Mode wohl auch nicht.
ohh hehe ja hate recht.. man man man ... Sollte echt ned so viel auf einmal machen. ok dann shau ich mir mal die CMSIS an
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.