Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Generare un reset su un Cortex-M3

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Generare un reset su un Cortex-M3

Messaggioda Foto Utenteboiler » 8 ago 2017, 9:49

Ciao a tutti

Negli ultimi giorni ho avuto grossi problemi con l'implementazione di un sistema basato su un'architettura Cortex-M3.
Ad un certo punto ho la necessità di generare un reset da software.

Per farlo ho scritto il valore 0x05FA0004 nel registro AIRCR.
I primi 16 bit sono una chiave di sblocco del registro (altrimenti la scrittura viene ignorata). Il resto scrive un 1 nel secondo bit, SYSRESETREQ.
Questo dovrebbe generare un software reset (sì, dipende dall'implementazione, ma il produttore del chip -Analog Devices- conferma che questo è come si ottiene un softreset del microcontroller).
In realtà non succede niente!

Riesco ad ottenere un softreset se ci scrivo 0x05FA0001, settando quindi il bit VECTRESET.

Ora, questa informazione ce l'ho da The Definitive Guide to the ARM Cortex-M3 di Yiu, mentre la documentazione ufficiale di ARM dice di non scriverci nulla: http://infocenter.arm.com/help/topic/co ... ehdge.html

Che fare?... ?%

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5600
Iscritto il: 9 nov 2011, 12:27

1
voti

[2] Re: Generare un reset su un Cortex-M3

Messaggioda Foto UtenteAjeieBrazov » 8 ago 2017, 9:54

Io uso la funzione
Codice: Seleziona tutto
NVIC_SystemReset();

Che si trova nelle funzioni del core del CMSIS
Avatar utente
Foto UtenteAjeieBrazov
1.460 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

0
voti

[3] Re: Generare un reset su un Cortex-M3

Messaggioda Foto Utenteboiler » 8 ago 2017, 10:02

Bello ed elegante, ma non funziona ;-)

Non mi stupisce, visto che l'implementazione è questa:
Codice: Seleziona tutto
/** \brief  System Reset

    The function initiates a system reset request to reset the MCU.
*/
__STATIC_INLINE void NVIC_SystemReset(void)
{
  __DSB();                                                     /* Ensure all outstanding memory accesses included
                                                                  buffered write are completed before reset */
  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                 SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
  __DSB();                                                     /* Ensure completion of memory access */
  while(1);                                                    /* wait until reset */
}


È la stessa cosa che facevo io e che non portava ad alcun risultato!

A questo punto sembrerebbe che Analog Devices abbia fatto un errore da qualche parte... adesso li contatto e vediamo cosa mi dicono.

Grazie comunque, ho sempre usato il registro e adesso non c'è piú bisogno che me ne ricordi l'indirizzo, la chiave di scrittura e quant'altro :ok:

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5600
Iscritto il: 9 nov 2011, 12:27

0
voti

[4] Re: Generare un reset su un Cortex-M3

Messaggioda Foto UtenteAjeieBrazov » 8 ago 2017, 10:28

Non saprei se AD ha commesso qualche errore.
Io uso questa funzione perché ho letto da diverse fonti la raccomandazione di utilizzare le funzioni del CMSIS (che in teoria dovrebbero essere uno standard) invece che lavorare direttamente sui registri.
Non uso AD ma questa me la segno, non si sa mai. :ok:
Avatar utente
Foto UtenteAjeieBrazov
1.460 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

0
voti

[5] Re: Generare un reset su un Cortex-M3

Messaggioda Foto Utenteboiler » 8 ago 2017, 10:47

AD è eccellente se serve un processore che abbia anche un front-end analogico serio. Lo svantaggio è che sono processori parecchio complicati. Vedi per esempio: http://www.analog.com/media/en/technica ... uCM350.pdf

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5600
Iscritto il: 9 nov 2011, 12:27

0
voti

[6] Re: Generare un reset su un Cortex-M3

Messaggioda Foto Utenteluxinterior » 8 ago 2017, 19:21

Cavoli che makumbe. Se capitasse a me non saprei come uscirne, potrei solo suicidarmi. Fortunatamente tu hai la possibilità di chiedere ai prdouttori. (Io sono il tipo dei 100pezzi giustamente un produttore non può perdere tempo anche con me)
Pensavo a un possibile workaround:
configurare il watchdog e aspettare che scatti.
Avatar utente
Foto Utenteluxinterior
4.311 3 4 9
Master EY
Master EY
 
Messaggi: 2690
Iscritto il: 6 gen 2016, 17:48

0
voti

[7] Re: Generare un reset su un Cortex-M3

Messaggioda Foto UtenteAjeieBrazov » 8 ago 2017, 19:47

Mah, magari è solo un problema della Analog Devices. Sugli STM32 funziona bene.
Avatar utente
Foto UtenteAjeieBrazov
1.460 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

0
voti

[8] Re: Generare un reset su un Cortex-M3

Messaggioda Foto Utenteboiler » 8 ago 2017, 20:10

Piú probabilmente solo di quel modello. Sull'ADuCM320 funziona correttamente.

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5600
Iscritto il: 9 nov 2011, 12:27

0
voti

[9] Re: Generare un reset su un Cortex-M3

Messaggioda Foto UtenteAjeieBrazov » 8 ago 2017, 21:15

"Se la fortuna è cieca, la sfiga ci vede benissimo". :mrgreen:

LA mia solidarietà, per quel che può valere.
Avatar utente
Foto UtenteAjeieBrazov
1.460 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

1
voti

[10] Re: Generare un reset su un Cortex-M3

Messaggioda Foto Utenteboiler » 11 set 2017, 10:09

Svelato l'arcano.
Il micro può usare con main clock il suo oscillatore HF interno o un clock generato esternamente. Poiché l'applicazione è estremamente sensibile alle variazioni di frequenza, abbiamo un quarzo termostatato esterno.

Durante l'inizializzazione del sistema imposto il MUX del clock sull'ingresso e disattivo l'oscillatore interno.

A quanto pare (assistenza tecnica di Analog Devices) per generare un reset l'oscillatore interno deve essere attivo, altrimenti non vengono resettate tutte le periferiche. In effetti riattivando HFOSC prima del reset tutto funziona a dovere :ok:

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5600
Iscritto il: 9 nov 2011, 12:27


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti