Rileva quale interruttore momentaneo ha causato la riattivazione di una CPU STM32


10

Modifica : questa domanda è sbagliata. Stm325105 ha solo un pin di riattivazione. Ma altre parti ST hanno più di un pin di riattivazione, quindi la risposta fornita è valida per quelle.


Ho uno stm32f105 che ha due pulsanti momentanei collegati agli ingressi di sveglia. Il processore viene messo in MODALITÀ STANDBY. Quando viene premuto uno qualsiasi dei pulsanti o il timer RTC si attiva, la CPU si riattiva.

Il problema è che voglio che la CPU faccia cose diverse a seconda dell'input di attivazione attivato. Secondo la 5.3.5 del manuale di riferimento ST stm32f105xx , nessun registro viene conservato ad eccezione di un registro di stato che indica che siamo stati svegliati (ma non da chi) e 42 registri di backup.

La modalità Standby consente di ottenere il minor consumo energetico. Si basa sulla modalità deep-sleep Cortex ® -M3, con il regolatore di tensione disabilitato. Di conseguenza, il dominio da 1,8 V viene spento. Anche il PLL, l'oscillatore HSI e l'oscillatore HSE sono disattivati. La SRAM e i contenuti dei registri vengono persi ad eccezione dei registri nel dominio Backup e dei circuiti di standby.

Dopo essersi svegliato dalla modalità Standby, l'esecuzione del programma viene riavviata come dopo un reset (viene recuperato il campionamento dei pin di avvio, il ripristino del vettore, ecc.). L'indicatore di stato SBF nel registro di controllo / stato dell'alimentazione (PWR_CSR) indica che l'MCU era in modalità Standby.

Questo post sul forum ST, Come determinare l'origine di Wakeup da Standby? , suggerisce che non riesco a rilevare quale attivazione attivata nel software. Non ho trovato altri post lì che hanno dato ulteriore illuminazione.

Come posso utilizzare software o hardware per determinare, dopo il risveglio, quale input di sveglia è stato attivato?


1
Chiedi al pulsante di caricare un cappuccio e leggilo
PlasmaHH,

1
Ho cercato alcune varianti STM32F105, hanno solo UN PIN di sveglia. Quale parte intendi esattamente e quali pin?
berendi - protestando contro il

@berendi Il mio STM32F105 ha, come dici tu, un solo perno di riattivazione. È configurato in STOP MODE, non in modalità STANDBY come ho affermato nella mia domanda. Utilizza gli eventi EXTI per svegliarsi. Avevo confuso il significato di quegli "eventi EXTI" con "wakeup pin". Ma immagino che la risposta fornita da Olin sia ancora utile se qualcuno ha bisogno di distinguere tra "svegliato da RTC" o "svegliato da sveglia" in MODALITÀ STANDBY. Qualcuno ha suggerimenti su come modificare questa domanda per abbinare la risposta di Olins? Una piccola nota all'inizio che descrive cosa c'è che non va? En intero re-edit? O dovrei semplicemente eliminare l'intera domanda?
Daniel Näslund,

1
Esistono controller ST con più di un pin di riattivazione, come F0, F3, L0 o L1, in cui la sorgente non può effettivamente essere determinata dopo l'uscita dallo standby, perché hanno un singolo flag di input di riattivazione. ST ha corretto questa supervisione per prima nelle ultime serie F7 e L4, che hanno flag separati per ciascun ingresso di riattivazione.
berendi - protestando contro il

Risposte:


11

Non conosco i dettagli di questa parte ST, quindi suppongo che la tua descrizione sia corretta.

Il processore dovrebbe svegliarsi molto presto dopo aver premuto uno dei due pulsanti. Questo dovrebbe essere particolarmente vero se ha un oscillatore RC interno. Anche se alla fine è necessario correre da un cristallo per motivi di precisione, forse è possibile far iniziare la parte da un RC interno, quindi passare al cristallo in un secondo momento. Ci sono micro che possono fare queste cose, anche se non so se il tuo è uno di questi.

In ogni caso, dopo il risveglio leggi entrambi gli ingressi il prima possibile. A meno che non ci sia qualcosa di insolito in questo micro ST, che dovrebbe essere compreso tra un ms e qualche decimo di ms dalla pressione del pulsante.

Per garantire che la linea sia ancora bassa, utilizzare un condensatore per mantenere la linea bassa fino a 100 ms dopo il rilascio del pulsante.

Ad esempio, supponiamo che il livello di ingresso basso logico garantito sia del 20% della tensione di alimentazione. La linea è tirata su con un resistore e ha un condensatore a terra. Il pulsante accorcia la linea a terra. La linea quindi galleggia in alto e viene attivamente forzata a terra quando viene premuto il pulsante. Quando il pulsante viene rilasciato, la tensione decade esponenzialmente verso l'alimentazione.

Il decadimento al 20% del valore finale avviene in 0,22 costanti di tempo. Diciamo che vuoi garantire che la linea appaia bassa per 100 ms dopo aver premuto un pulsante. Ciò significa che la costante di tempo RC deve essere 450 ms. Con un pullup di 100 kΩ, la capacità dovrebbe essere di 4,5 µF. Quindi un tappo da 10 µF da 10 V andrebbe bene.

In sintesi, ecco il circuito:


1
Dovrebbe essere il contrario, gli STM32 si svegliano sul fronte di salita. Inoltre, iniziano sempre con l'orologio interno, passando al cristallo esterno e il software viene eseguito. Il problema è con il codice di avvio fornito o generato dallo strumento CubeMX, il che rende un po 'difficile eseguire il codice utente prima della configurazione della struttura ad albero.
berendi - protesta il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.