Détectez quel commutateur momentané a provoqué le réveil d'un processeur STM32

10

Edit : Cette question est fausse. Le stm325105 n'a qu'une seule broche de réveil. Mais d'autres pièces ST ont plus d'une broche de réveil, donc la réponse donnée est valable pour celles-ci.


J'ai un stm32f105 qui a deux boutons momentanés connectés aux entrées de réveil. Le processeur est mis en MODE VEILLE. Lorsque l'un des boutons est enfoncé ou que la minuterie RTC se déclenche, l'unité centrale se réveille.

Le problème est que je veux que le processeur fasse des choses différentes selon l'entrée de réveil qui a été déclenchée. Selon 5.3.5 du manuel de référence ST stm32f105xx , aucun registre n'est conservé sauf un registre d'état indiquant que nous avons été réveillés (mais pas par qui) et 42 registres de sauvegarde.

Le mode veille permet d'atteindre la plus faible consommation d'énergie. Il est basé sur le mode de veille profonde Cortex ® -M3, avec le régulateur de tension désactivé. Le domaine 1,8 V est donc hors tension. Le PLL, l'oscillateur HSI et l'oscillateur HSE sont également désactivés. La mémoire SRAM et le contenu des registres sont perdus, à l'exception des registres du domaine de sauvegarde et des circuits de secours.

Après s'être réveillé du mode veille, l'exécution du programme redémarre de la même manière qu'après une réinitialisation (échantillonnage des broches de démarrage, réinitialisation vectorielle est récupéré, etc.). L'indicateur d'état SBF dans le registre de contrôle / état de l'alimentation (PWR_CSR) indique que le MCU était en mode veille.

Cet article du forum ST, Comment déterminer l'origine du réveil en mode veille? , suggère que je ne peux pas détecter le réveil déclenché dans le logiciel. Je n'ai trouvé aucun autre poste qui a donné plus d'éclaircissements.

Comment puis-je utiliser un logiciel ou du matériel pour déterminer, après le réveil, quelle entrée de réveil a été déclenchée?

Daniel Näslund
la source
1
Demandez au bouton de charger une casquette et lisez cela
PlasmaHH
1
A recherché quelques variantes du STM32F105, elles n'ont qu'une SEULE broche de réveil. Quelle partie voulez-vous dire exactement et quelles broches?
berendi - protestant le
@berendi Mon STM32F105 n'a, comme vous le dites, qu'une seule broche de réveil. Il est configuré en MODE STOP, pas en mode STANDBY comme je l'ai dit dans ma question. Il utilise des événements EXTI pour se réveiller. J'avais mélangé le sens de ces "événements EXTI" avec des "épingles de réveil". Mais je suppose que la réponse fournie par Olin est toujours utile si quelqu'un a besoin de faire la différence entre "réveillé par RTC" ou "réveillé par broche de réveil" en MODE STANDBY. Quelqu'un a-t-il des suggestions sur la façon de modifier cette question pour qu'elle corresponde à la réponse d'Olins? Une petite note au début décrivant ce qui ne va pas? Une réédition complète? Ou devrais-je simplement supprimer toute la question?
Daniel Näslund
1
Il existe des contrôleurs ST avec plus d'une broche de réveil, comme F0, F3, L0 ou L1, où la source ne peut en effet pas être déterminée après la sortie du mode veille, car ils ont un seul drapeau d'entrée de réveil. ST a corrigé cette erreur d'abord dans les dernières séries F7 et L4, qui ont des drapeaux séparés pour chaque entrée de réveil.
berendi - manifestant

Réponses:

11

Je ne connais pas les détails de cette partie ST, donc je suppose que votre description est correcte.

Le processeur devrait se réveiller très peu de temps après avoir appuyé sur l'un des boutons. Cela devrait être particulièrement vrai s'il a un oscillateur RC interne. Même si vous devez éventuellement exécuter un cristal pour des raisons de précision, vous pouvez peut-être faire démarrer la pièce à partir d'un RC interne, puis passer au cristal plus tard. Il existe des micros qui peuvent faire de telles choses, même si je ne sais pas si le vôtre en fait partie.

Dans tous les cas, vous lisez les deux entrées dès que possible après le réveil. Sauf s'il y a quelque chose d'inhabituel dans ce micro ST, cela devrait être de quelques ms à quelques 10s de ms à partir de la pression du bouton.

Pour garantir que la ligne est toujours faible, utilisez un condensateur pour maintenir la ligne basse jusqu'à 100 ms après le relâchement du bouton.

Par exemple, supposons que le niveau d'entrée logique bas garanti soit de 20% de la tension d'alimentation. La ligne est tirée vers le haut avec une résistance et a un condensateur à la terre. Le bouton raccourcit la ligne au sol. La ligne flotte donc haut et est activement forcée à la terre lorsque le bouton est enfoncé. Lorsque le bouton est relâché, la tension diminue de façon exponentielle vers l'alimentation.

La décroissance à 20% de la valeur finale se produit dans des constantes de temps de 0,22. Disons que vous voulez garantir que la ligne semble basse pendant 100 ms après une pression sur un bouton. Cela signifie que la constante de temps RC doit être de 450 ms. Avec un pullup de 100 kΩ, la capacité devrait être de 4,5 µF. Un bouchon de 4,7 µF 10 V ferait donc l'affaire.

En résumé, voici le circuit:

Olin Lathrop
la source
1
Cela devrait être l'inverse, les STM32 se réveillent sur le front montant. De plus, afaik ils commencent toujours par l'horloge interne, la commutation vers le cristal externe et le PLL se fait par le logiciel. Le problème vient du code de démarrage fourni ou généré par l'outil CubeMX, ce qui rend quelque peu difficile l'exécution du code utilisateur avant la configuration de l'arborescence d'horloge.
berendi - manifestant le