Soft Reset sur Arduino Uno R4

Bonjour à tous.
J'ai l'habitude d'utiliser un Soft Reset sur Uno R3 et Nano, voir code. Cela fonctionne très bien.
Malheureusement, cela ne fonctionne pas sur le Uno R4. Je suppose que cela est dû à la différence de microprocesseur.
Merci par avance pour une éventuelle solution.
Mon code.

//
void(* resetFunc) (void) = 0;             // soft reset function
int pb=0;                                 // start/stop/reset button

void  setup() {
  delay(400);                             // for reset consideration
  Serial.begin(9600);
  pinMode(pb,INPUT_PULLUP);               // start/stop/reset button attachment
  
  Serial.print("\n\n\t To start, click on the Start button");
  while( digitalRead(pb) ); delay(400);
  Serial.print("\n\t Started");
}

void loop() {
  if (! digitalRead(pb)){
    Serial.print("\n\t Soft reset"); delay(400);
    resetFunc();
  }
}


R5 ?? :thinking:

vous êtes déjà dans le futur là... on n'en est qu'au UNO R4 non ?

sur ce genre d'architecture c'est plus complexe qu'un jump à l'adresse 0.

la doc dit qu'un software reset se fait comme cela

5.3.6 Software Reset

The software reset is an internal reset generated by a software setting of the SYSRESETREQ bit in the AIRCR register in the Arm core. When the SYSRESETREQ bit is set to 1, a software reset is generated. When the internal reset time (tRESW2) elapses after the software reset is generated, the internal reset is canceled and the CPU starts the reset exception handling.

For details on the SYSRESETREQ bit, see the ARM® Cortex®-M4 Technical Reference Manual.

le core arduino inclut un type qui reprend tous les registres du System Control Block dans lequel on retrouve AICR

le bit SYSRESETREQ est aussi dans le core

ils ont cette fonction qui semble faire ce qu'il faut

__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
{
  __DSB();                                                          /* Ensure all outstanding memory accesses included
                                                                       buffered write are completed before reset */
  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */
  __DSB();                                                          /* Ensure completion of memory access */

  for(;;)                                                           /* wait until reset */
  {
    __NOP();
  }
}

Ce fil n'a rien à faire dans les Tutoriels et cours.
Déplacé dans la racine du forum francophone.

1 Like

Désolé, oui, bien sûr, il s'agit du R4 et non du R5. J'ai modifié le titre et le corps du fil.
Merci d'avoir déplacé le fil au bon endroit.

Merci pour ces informations que je vais essayer de mettre à profit.
Je ne manquerai pas de vous donner le résultat.

Un grand merci !
Voilà le résultat.

//
int pb=2;                                 // start/stop/reset button

void  setup() {
  delay(400);                             // for reset consideration
  Serial.begin(9600);
  pinMode(pb,INPUT_PULLUP);               // start/stop/reset button attachment
  delay(400);
  Serial.print("\n\n\t To start, click on the Start button");
  while( digitalRead(pb) ); delay(400);
  Serial.print("\n\t Started");
}

void loop() {
  if (! digitalRead(pb)){
    Serial.print("\n\t Soft reset"); delay(400);
    __NVIC_SystemReset();
  }
}


:wink: bravo

(Encore mieux si vous rajoutez == HIGH ou LOW aux tests sur digitalRead)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.