-1
votes

Comment changer SCB-> VTOR dans l'application (STM32F4 HAL)?

I Construire le chargeur de démarreur pour STM32F4 et construire une application utilisateur avec les modifications de la valeur Vect_Tab_Offset manuellement pour SCB-> VTOR dans le fichier System_STM32F4XX.C, mais si je le fais dans l'application. Cela ne fonctionne pas correctement.

J'ai appelé le scb-> vttor = 0x8040000 au début de la principale () mais cela n'a pas fonctionné. bootloader Application utilisateur


3 commentaires

Je ne pense pas qu'il soit nécessaire de définir SCB-> VTOR en principal (). Recherchez vect_tab_offset dans system_stm32f4xx.c. Votre valeur SCB-> VTOR peut être écrasée dans la fonction Systeminit ().


Alors, comment puis-je l'appeler après Systeminit ()? Où dois-je mettre la déclaration SCB-> VTOR pour que l'exécution fonctionne?


Utilisez l'affectation SCB-> VTOR qui existe déjà dans Systeminit (). Modifiez la valeur de vect_tab_offset pour répondre à vos besoins.


3 Réponses :


2
votes

Les appels de code de démarrage STM32 Systeminit () Code> Avant Main () Code>. Systeminit () Code> Définit la valeur SCB-> VTOR CODE> (entre autres choses). Systeminit () CODE> est implémenté dans le fournisseur fourni Fichier System_STM32F4XX.C CODE>. Vous pouvez personnaliser la valeur qui est attribuée à SCB-VTOR code> en modifiant la valeur de vect_tab_offset code>, qui est également défini dans system_stm32f4xx.c code>. (Il devrait y avoir une copie de system_stm32f4xx.c code> dans votre dossier de projet que vous pouvez personnaliser pour votre projet.)

Si vous avez besoin de valeurs différentes de vect_tab_offset code> pour votre démarrage et programmes d'application Vous pouvez alors utiliser une déclaration de préprocesseur comme celle-ci. (Cela permet aux programmes de démarrage et d'application d'utiliser la même copie de system_stm32fxx.c code>. Alternativement, vous pouvez utiliser différentes copies du fichier pour chaque programme.) P>

#ifdef BOOT
#define VECT_TAB_OFFSET  0x00 /*!< Vector Table base offset field.
                                   This value must be a multiple of 0x200. */
#else
#define VECT_TAB_OFFSET  0x80000
#endif


5 commentaires

Merci pour votre suggestion, mais j'ai un chargeur de démarrage et deux espaces d'application qui sont App1 et App2. Application de travail initialement était dans APP1 et Bottes de démarrage sur App1 lorsque la nouvelle mise à jour arrive, elle stocke dans l'APP2 puis des bottes à l'APP2 et une autre mise à jour vient des magasins dans APP1 et ainsi de suite. C'est pourquoi je dois changer le VTor en temps d'exécution, pas à l'heure de la compilation.


@suriyameras est votre application vraiment relocattable comme ça? Comment pouvez-vous relier votre application telle qu'elle est relocatoire? Typiquement, la liaison doit savoir à la limite de la construction où l'application va s'exécuter.


Oui, j'ai compris. Je demande: "Puis-je construire pour travailler dans deux places de mémoire?" I.e 0x08020000 & 0x08060000. Parce que je ne sais pas quel endroit le chargeur de démarrage écrira la nouvelle application mise à jour.


@suriyameras Je ne sais pas comment vous aider avec la conception du chargeur de démarrage que vous avez décrite. Mais peut-être devriez-vous repenser votre conception de chargeur de démarrage. L'application est liée / située pour fonctionner à partir d'un emplacement prédéfini. Je pense donc que la mise à jour doit être copiée à cet emplacement prédéfini avant de pouvoir être exécuté. Je télécharge généralement la mise à jour sur un emplacement temporaire en Flash. Et ensuite, une fois le téléchargement terminé et vérifié correctement, le chargeur de démarrage efface l'ancienne application et copie l'application de mise à jour à l'emplacement exécutable.


d'accord. Merci. Comme tu as dit que je dois repenser ma structure de bootloader.



1
votes

Ajoutez simplement ce code dans Main, première ligne avant toute autre initialisation, avant Hal_init ou entre / * Code utilisateur Début 1 / / em> code d'utilisateur fin 1 * /

FLASH    (rx)    : ORIGIN = 0x8008000,   LENGTH = 2048K - 0x8000


2 commentaires

Très mauvaise idée de le changer en main. Le chargeur de démarrage doit le faire avant de passer la commande à l'application.


Mauvais ou bon, les modèles de STM32CUBEMX / STM32CUBEIDE n'ont pas de sections utilisateur pour changer cela sans douleur. Le fichier de démarrage * .S n'a que la relocalisation des variables de Flash au code RAM avant principale () et tout fonctionne tout simplement bien.



0
votes

Supprimez l'ensemble VTOR dans le fichier de démarrage. Il ne devrait pas être là.

Définir le VTOR dans le chargeur de démarrage avant de passer la commande à l'application


0 commentaires