Comment déboguer des réinitialisations inattendues dans un périphérique STM32?
Je fais du développement en C avec un STM32F107 puce et, à un certain point, l'appareil a commencé à se réinitialiser lorsque j'appelle une fonction spécifique. Je n'ai pas de débogueur et mon débogage est tout simplement du texte sur un port série.
J'ai utilisé certains autres microcontrôleurs dans lequel j'ai été en mesure d'accéder à un registre pour voir la cause de la réinitialisation, mais je n'arrive pas à trouver un équivalent de cette appareil. Je suis conscient du matériel exceptions du Cortex-M3, mais je ne sais pas si l'un d'entre eux est déclenché depuis je n'arrive pas à envoyer du texte sur usart quand je suis à l'intérieur de ces gestionnaires (peut-être parce que mon TX fonctions interruptions d'utilisation?).
Alors, j'ai décidé de demander à des gens avec plus d'expérience que moi dans ce dispositif: ce qui est généralement fait pour déboguer des situations comme celles-ci?
MODIFIER
L'un des développeurs activé le WWDG chien de garde et il a été de mettre à zéro le matériel avant que je puisse obtenir mon info de la faute des gestionnaires. C'était une erreur matérielle en raison de l'appel d'une fonction par un pointeur qui pointait à la mauvaise place. Cependant, je vais garder cette question dans l'espoir que quelqu'un va donner plus de détails (ou matériel) pour les renvoyant à du code C à partir de l'registres informatisés, conservés dans, disons, une erreur matérielle (@dwelch idée).
source d'informationauteur ivarec | 2012-01-10
Vous devez vous connecter pour publier un commentaire.
Le Cortex M3 a une excellente gestion des pannes fonctionnalités qui rendront votre vie plus facile. Sur la frappe de la faute, il automatiquement les piles de plusieurs registres comme PC et LR, et élimination des registres de l'état va vous dire des choses telles que l'adresse de l'erreur de bus, etc.
Vous devez mettre en œuvre un bon gestionnaire de panne (par exemple, le disque dur de gestionnaire de panne ici: http://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/) pour imprimer la pile de registres et de débogage faute registres de l'état civil.
Vous devez utiliser l'UART pour l'impression, il suffit d'écrire votre propre simple version personnalisée de printf pour une utilisation à partir de votre gestionnaire de défauts, qui ne dépend pas d'interruptions. Il suffit d'écrire les octets directement à uart Tx d'enregistrement de données et de sondage pour octet d'achèvement.
L'écart de ce qui a été mentionné sur les gestionnaires d'interruption pour le débogage, certains ST micros ont aussi un reset de la source de registre que vous pouvez lire sur les power-up (qui est, après un reset). Pour le cortex M de famille (m0/m3/m4) le registre est RCC_CSR. http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf
Malheureusement, vous ne seriez pas en mesure de savoir si les détails, tels que difficile faute, mais il vous dira si le chien de garde (fenêtre ou indépendant) avait déclenché.
Étant donné que vous n'avez pas de débogueur, je voudrais vous suggérer de trouver certains périphériques du microcontrôleur pour vous aider. Peut-être que vous avez une LED vous pouvez basculer d'un simple broches GPIO qui n'est pas utilisé que vous pouvez brancher jusqu'à un oscilloscope. Si vous mettez un pin GPIO assez lentement (pas plus vite que 1 Hz et peut-être plus lentement en fonction de l'appareil), vous pouvez utiliser un voltmètre au lieu d'un champ. Mettre le code pour basculer la LED ou broches GPIO dans chacun des gestionnaires d'exception, une à une, jusqu'à le retrouver. Si vous avez plus d'un pin GPIO disponibles, vous pouvez accélérer le processus. Vous pouvez également écrire un wrapper pour la fonction spécifique qui est à l'origine de la réinitialisation. La fonction wrapper enverrait une liste des interruptions qui sont activés juste avant la rupture de la fonction est exécutée. De cette façon, vous n'avez pas perdre de temps à tester ceux qui ne sont pas activés.
Un avantage de broches GPIO dans ce cas, c'est qu'ils ne nécessitent pas une interruption. Il est préférable de rester à l'écart de tout ce qui nécessite une interruption (comme votre USART dans ce cas). Si la réinitialisation est causé par une priorité plus élevée exception de votre débogage de code ne s'exécutera jamais.
Il est également fréquent que le reset est causée par un pointeur non initialisé. Un pointeur de fonction définie à zéro serait de provoquer l'exécution de regarder un peu comme une remise à zéro. Si c'est le cas, l'USART du code d'initialisation est sans doute d'être exécuté avant un octet peut être intégralement transmis par l'USART, ce qui rendrait le USART inutile comme un outil de débogage dans cette instance.
Quand vous dites reset, je pense en termes de vous frapper le vecteur de reset, pas l'un des interruptions ou des gestionnaires. Vous dites qu'il ne fait réinitialiser la puce et de démarrer votre logiciel encore ou bien dites-vous qu'il est accroché quelque part? ou avez-vous des la table vectorielle tout point au vecteur de reset?
La façon de procéder dépend de ce que vous êtes vraiment voir, vous avez besoin pour être plus clair et précis, ou peut-être vous voulez aider à le comprendre.
Normalement je carte le solde non utilisé des vecteurs à une simple accrocher ligne de code qui a des succursales à lui-même. Plus tard, j'ai peut reconfigurer certains d'entre eux à du code réel.
le cortex-m est très agréable que vous pouvez point C du code. Si vous pensez que vous avez trouvé une exception pointer à une routine qui saisit quelque chose qui vous permet de déterminer dans quel mode vous êtes, le lien s'inscrire pourrait avoir cette info, ou un rse quelque part, l'imprimer et aller dans une boucle infinie. Remplir la partie non utilisée de la table vectorielle avec l'adresse de ce générique des fonctions de débogage.
À partir de là, vous devez comprendre pourquoi vous sont frapper cette exception, il pourrait être quelque chose comme un non alignés d'accès par exemple. Il pourrait être que vous avez généré une interruption lors de la tentative de initalize un appareil avant d'être complètement la configuration du gestionnaire, qui sait.
de modifier une question avec plusieurs réponses ou des informations que vous travaillez dans cette.
La "bonne" chose à faire, c'est, malheureusement, pas pratique avec un STM32. C'est de les mettre dans un grand gestionnaire d'exception qui a connaissance de son code source, et détendre la pile et de vous donner la pleine pile d'appel et le numéro de ligne qui cause l'erreur. Cela nécessiterait l'ajout de toutes les informations de débogage de votre application dans la mémoire flash du microcontrôleur STM32, et ce n'est pas pratique.
Il y a des façons de tromper votre IDE pour parfois vous donner la pile d'appel. Je donnerais plus de détails, mais j'ai oublié de l'écrire, donc je l'ai oublié. Je pense qu'il doit modifier manuellement le pointeur de pile d'une ombre registre à un autre.
Ce que j'ai l'habitude de faire, c'est mettre un point d'arrêt à la faute matérielle exception vecteur, et puis regardez tous les registres lorsque le point de rupture hits. Considérer les preuves médico-légales d'un meurtre, fait avec des explosifs plastiques et en feuilles. Les valeurs des registres de vous donner des idées. Enregistrer les valeurs de départ avec 0x20000000 sont de RAM adresses. Enregistrer les valeurs de départ avec 0x08000000 sont Flash adresses. Ouvrir le désassembleur et le type de ces adresses. Il faudra probablement aller directement à la variable ou de la fonction à ces emplacements de mémoire. Si cela ne fonctionne pas, puis regarder le pointeur de pile. Regardez les emplacements de mémoire dans le pointeur de pile, et ne la même truc. J'ai toujours trouvé assez d'éclats d'obus, à l'emplacement de la fonction où l'exception a été passe.
Vous pouvez utiliser le code ci-dessous à des fins de débogage.
Également l'ajouter également.
Je suis en utilisant ce obtenir n'importe quelle valeur du registre avant d'aller dans hardfault. Vous pouvez également ajouter plus de registres si vous le souhaitez.