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?
Réponses:
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:
la source