Question

Je voudrais avoir deux applications dans mon flash STM32, l’une est essentiellement un démarrage et l’autre, l’application "principale". J'ai découvert comment charger chacune d'elles dans différentes zones de mémoire flash. Après une sauvegarde de la mémoire, tout semble être à la bonne place.

Ainsi, lorsque je réinitialise le système, celui-ci charge le démarrage, mais tout ce qu’il fait pour le moment est de passer à l’application. En déboguant le démarrage, tout cela semble fonctionner correctement. Cependant, les problèmes surviennent une fois que j'ai effectué le saut dans l'application, il ne fait qu'exécuter une instruction (assemblage), puis revient au démarrage. Il devrait rester dans l'application indéfiniment.

Ma question est alors, où devrais-je «sauter» dans l'application?

Il semble qu'il existe quelques zones potentielles, telles que les vecteurs d'interruption, le gestionnaire de réinitialisation, la fonction principale de l'application. En fait, j’ai essayé tous ceux qui n’ont pas réussi.

J'espère que cela a du sens, je mettrai à jour la question sinon.

merci pour votre aide! Richard

Mises à jour:

  • J'ai joué dans le débogueur et modifié manuellement le compteur de programme par rapport à la partie principale de l'application. Cela a fonctionné, mais cela m'a fait penser que quelque chose n'allait pas avec mon saut. Pourquoi le programme ne fonctionne-t-il pas? le compteur continue après le saut?
  • En fait, il semble que ce soit le PSR, le "T" est réinitialisé sur le saut. Si je le redéfinis après le saut, il continue avec l'application comme je le souhaite
  • Ok a trouvé une solution. Il semble que le PC LSB doit être réglé sur 1 lorsque vous faites une branche ou il passe en mode "ARM" (instruction 32 bits au lieu d'instructions 16 bits comme dans le mode "pouce"). C'est un petit problème assez obscur, merci de me l'avoir fait partager!
Était-ce utile?

La solution

Assurez-vous de passer à une adresse où le LSB est 1. Consultez ce site pour une explication: http://www.embedded.com/columns/beginerscorner/15200241?_requestid=162471

Autres conseils

Vous pouvez rechercher l’IAP (programmeur intégré à l’application), ce qui vous permet d’amorcer le code à partir du psort RS232 sur le stm32. J'ai commencé à utiliser et comme il fournit le code source, il est très simple de le modifier pour répondre à vos besoins. En gros, après une réinitialisation, vous pouvez coder l'IAP pour amorcer le chargement à partir de l'adresse 0x08002000 ou de l'adresse 0x08003000. tout ce que vous avez à faire est de définir un indicateur dans le code de votre application, puis de dire redémarrer. La nouvelle application fonctionnera ensuite. J'espère que cela vous aidera.

Richard,

J'essayais de faire la même chose que vous aviez réussi, mais avais des problèmes. J'utilisais l'IDE IAR et mis à jour le fichier * .icf (dans le répertoire "proj") pour placer mon application à 0x08002000 et chargé un projet séparé à 0x08000000 qui effectue un saut vers l'adresse du vecteur de réinitialisation à 0x08002004. Le code de démarrage a démarré et semble sauter au démarrage de l’application, mais celle-ci a échoué au cours de l’initialisation de l’IRA et a abouti à une interruption ILLEGAL INSTRUCTION.

Après avoir parcouru en une seule fois le code de l'application, j'ai constaté que j'avais oublié de définir l'adresse de base du vecteur d'interruption sur celle de l'application. Il pointait toujours vers 0x08000000 et le code devenait fou. Ajouter un appel pour définir l’adresse vectorielle avant d’activer les interruptions a résolu mon problème et est indispensable si vous souhaitez faire basculer une application en flash.

Ira.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top