Arduino DUE et WaitMode

Bonjour,

Dans mon projet, j’utilise une carte arduino DUE, elle passe en WaitMode pour économiser au maximum l’énergie quand elle n’est pas utilisée. Je voudrais savoir si quelqu’un sait est-ce qu’il est possible d’activer le démarrage rapide en fixant un bouton poussoir sur une broche. C’est-à-dire que si j’appuie sur le bouton poussoir, la carte détecte l’état haut de la broche et déclenche le démarrage rapide pour sortir du WaitMode.
J’ai fait beaucoup de recherches, mais ne trouve pas de d’éléments me permettant de résoudre mon problème. La datasheet parle de « WKUP0-15 » mais je n’arrive pas à savoir lesquelles ce sont avec certitude.

Merci d’avance pour votre aide !

Bonne journée :slight_smile:

Pour sortir d'un WAIT MODE suivant le niveau de l'un des 16 WKUPn pins, 2 registres sont à utiliser (cf Sam3X datasheet, pages 40, 558, 559). Il faut donc signaler d'abord que le uc doit rentrer en mode Sleep option Wait Mode, puis autoriser la sortie du WAIT MODE suivant le niveau de l'une des broches (WKUPn) choisie via PMC_FSMR et PMC_FSPR.

J'avais fourni un exemple d'entrée/sortie du mode WAIT MODE en utilisant le périphérique RTT dans ce topic, réponse #4:

Il faudra donc modifier la programmation avec PMC_FSMR et PMC_FSPR.

Super merci beaucoup @ard_newbie je vais regarder tout ça alors et faire des tests !

Bonjour,

Est-ce que par hasard quelqu'un sait s'il est possible d'utiliser des librairies telles que <avr/sleep.h> avec arduino Due ?

Merci d'avance et bonne journée ! :slight_smile:

Clément

avr/sleep.h est un fichier à inclure pour avr.
Pour un AT91SAM3X8E j'ai bien peur qu'il faille retrousser les manches.

D'accord merci @hbachetti pour ta réponse ! Il vaut mieux utiliser la librairie pmc.h pour l'arduino Due donc ?

Les fonctions pmc_enable_sleepmode(), pmc_enable_waitmode, etc. manipulent effectivement le registre PMC_FSMR.
L'idéal serait de trouver un tutoriel.
J'aurais plus de facilité pour t'aider s'il s'agissait d'un µcontrôleur ARM ST Microelectronics.

Le code suivant (cependant non testé donc à voir...) devrait permettre d'entrer en mode WAIT et d'en sortir sur un passage de la WKUP pin 0 (PA1) de 0 à 1 pendant une durée d'au moins 3 slow clocks (il y a un debounce dans le code pour éviter les parasites):

void setup() {

  Serial.begin(250000);
  printf("\n Last software update  : %s   %s\n", __DATE__, __TIME__);

  Serial.println("\n\rHELLO ALL !!");

  PMC->PMC_PCER0 |= PMC_PCER0_PID11;  // PIOA power ON

  //WKUP0 pin is PA1
  PMC->PMC_FSMR = PMC_FSMR_LPM     //The(WFE) instruction of the processor makes the system to enter in Wait Mode.
                  | PMC_FSMR_FSTT0; // The corresponding wake up input enables a fast restart signal to the Power Management Controller

  PMC->PMC_FSPR = PMC_FSPR_FSTP0; //Fast start up at WKUP pin level 1

  SUPC->SUPC_WUMR |= SUPC_WUMR_FWUPEN | SUPC_WUMR_WKUPDBC_3_SCLK; //Wake up pin enable and wkup0 debounce 3 clock cycles

  SUPC->SUPC_WUIR |= SUPC_WUIR_WKUPEN0 | SUPC_WUIR_WKUPT0; //the corresponding wake-up input forces the wake up of the core power supply
  // and a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply.
}

void loop() {

  Serial.println("Entering Wait mode ");
  delay(3);

  clock_system(1);

  EFC0->EEFC_FMR = EEFC_FMR_FWS(0); //1 wait state flash access
  EFC1->EEFC_FMR = EEFC_FMR_FWS(0);

  __SEV(); // Set Event Register (force a 1 on the Event register regardless of its initial value)
  __WFE(); // Clear Event Register

  __WFE(); // Enter Low Power Mode with Wait Mode selected

  while (!(PMC->CKGR_MOR & CKGR_MOR_MOSCRCEN));
  clock_system(13);

  Serial.println("Exit from Wait mode");

}

void clock_system (uint32_t clock_num) {

  EFC0->EEFC_FMR = EEFC_FMR_FWS(3); //3+1 wait states flash access
  EFC1->EEFC_FMR = EEFC_FMR_FWS(3);


  PMC->CKGR_PLLAR =  CKGR_PLLAR_ONE
                     | CKGR_PLLAR_MULA(clock_num)
                     | CKGR_PLLAR_PLLACOUNT(0x3fUL)
                     | CKGR_PLLAR_DIVA(0x1UL);
  while (!(PMC->PMC_SR & PMC_SR_LOCKA));

  PMC->PMC_MCKR = PMC_MCKR_PRES_CLK_2
                  | PMC_MCKR_CSS_PLLA_CLK;
  while (!(PMC->PMC_SR & PMC_SR_MCKRDY));

}


Bonjour @ard_newbie

Dans ton exemple avec le réveil RTT tu utilises la PLLA alors que la documentation donne :

• Select the 4/8/12 MHz Fast RC Oscillator as Main Clock
• Set the LPM bit in the PMC Fast Startup Mode Register (PMC_FSMR)
• Execute the Wait-For-Event (WFE) instruction of the processor

Je voudrais savoir pourquoi tu prends la PLL plutôt que la Fast RC ?
De mon côté j'ai utilisé ce qui est dans la doc mais cela ne fonctionne pas, aurais-tu une idée stp ?

Merci beaucoup @hbachetti pour ta réponse !

Bonne fin de journée !

La doc est très incomplète et peu explicite.

De base lorsque le uc démarre, il se met sur le 4 MHz oscillateur interne, puis il passe sur le 12 MHz oscillateur externe (le crystal), puis le PLLA est programmé pour obtenir (par exemple sur la DUE) le 84 MHz. Donc avant de basculer en Wait Mode on tourne normalement à 84 MHz. C'est pourquoi je réduis la fréquence juste avant de passer en Wait Mode. Comme je le dis, il doit aussi être possible , juste avant de passer en Wait Mode de basculer sur le 4 MHz interne pour une économie supérieure, il faudrait chercher comment.

Comme après le setup() le uc tourne à 84 MHz, je le ramène d'abord sur une fréquence plus faible pour réduire la consommation d'énergie, ceci juste avant d'entrer en Wait Mode. En effet, je pense que pendant qu'il est en Wait Mode, une partie du UC continue à pédaler à la dernière fréquence appliquée, donc à consommer à cette fréquence. A la sortie du Wait Mode, il faut alors repasser sur 84 MHz.

Le mode WAIT n'économise toutefois pas grand chose, c'est le mode back up qui économise vraiment l'énergie ( à condition de virer les leds de la DUE qui consomment). Ces 2 modes Low Power sont toutefois différents.

Sans une lecture attentive du datasheet du Sam3x, voire des Applications Notes (il y en a une pour le Low Power Mode (chercher AT03498: Low Power Modes in SAM3 Family) , il est normalement impossible d'arriver à un résultat.

Merci beaucoup @ard_newbie je vais regarder tout cela et le mode Back up pour voir s'il peut convenir à mon utilisation. Tes explications sont super claires merci.

Je vais continuer à me pencher sur le problème avec tout cela alors !

Il faut aussi tenir compte de la consommation des autres composants de la carte.

La carte LOLIN32 par exemple alimentée par sa broche 3.3V consomme 1.7mA en veille, par contre un module ESP32 nu consomme 5µA.

Effectivement, l'ensemble des composants de la carte est à prendre en compte.

Pour le Sam3x, la consommation en mode back up est de 2,5 uA (page 26, Sam3x datasheet) et la sortie de ce mode peut être faite via l'une des brochess WKUP.

La principale différence d'avec le mode WAIT est que le programme redémarre depuis le setup() (mémoire RAM remise à zéro). Il est cependant possible de sauvegarder des données dans les 8 registres 32 bits GPBR (General Purpose Back Up Register) juste avant de rentrer en mode back up.