Forum: Mikrocontroller und Digitale Elektronik STM32F105 Low Power Modees (Sleep Mode)


von P. O. (neop13)


Lesenswert?

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

von Sven Wagner (Gast)


Lesenswert?

Reicht da nicht ein
1
__asm__ volatile ( "wfi\n" )
?

Grüße
Sven

von P. O. (neop13)


Lesenswert?

Hi
Ich programmiere den in C, und das alleine reicht denk ich nicht... aber 
ich habe auch noch nicht weiter probieren können

von Sven Wagner (Gast)


Lesenswert?

"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

von P. O. (neop13)


Lesenswert?

hmmmm klingt komplizierter

codesourcery G++ lite

von Jean P. (fubu1000)


Lesenswert?

Hi,

P. Ostrich schrieb:
> hmmmm klingt komplizierter
>
> codesourcery G++ lite
1
__asm volatile("wfi");
entspricht soweit ich weiss dem GNU Standard.
Gruß

von Jean P. (fubu1000)


Lesenswert?

Hi,

P. Ostrich schrieb:
> hmmmm klingt komplizierter
>
> codesourcery G++ lite
1
  #define __WFI   asm volatile("wfi")
sollte bei GNU klappen.
Gruß

von P. O. (neop13)


Lesenswert?

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

von Sven Wagner (Gast)


Lesenswert?

P. Ostrich schrieb:
> Aber wie rufe ich das im code auf?
Mit
1
__WFI
vielleicht ?!

Grüße
Sven

von P. O. (neop13)


Lesenswert?

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;

von Jan (Gast)


Lesenswert?

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.

von P. O. (neop13)


Lesenswert?

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) !!!!!

von Jan (Gast)


Lesenswert?

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.

von P. O. (neop13)


Lesenswert?

geschafft :-)

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);

damit klappt es... jetzt muss ich nur noch das drum herrum schreiben

dank euch

von P. O. (neop13)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von P. O. (neop13)


Angehängte Dateien:

Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von P. O. (neop13)


Lesenswert?

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
Noch kein Account? Hier anmelden.