Comment passer d’un programme à l’autre dans Stellaris

Je travaille sur un chargeur de démarrage pour la puce Stellaris LM3S1607. J’utilise le compilateur Keil MicroVision4 C. L’idée est de créer 2 micrologiciels indépendants que l’on mettra à jour. Dans firmware1, j’ai téléchargé le fichier firmware2 et l’écris en flash à l’adresse 0x3200. Jusque là ça marche. J’ai également vérifié que les données sont en cours d’écriture sur Flash correct. Maintenant, j’ai deux applications en flash. le premier est mon chargeur de démarrage UIP et le second est mon projet principal. Je veux savoir comment puis-je passer du premier programme au deuxième programme situé dans 0x3200.

Si quelqu’un peut m’aider à sauter, ce sera génial. Merci

Cela fonctionnera sur toutes les pièces Cortex-M …

Créez une fonction assembleur comme:

__asm void boot_jump( uint32_t address ) { LDR SP, [R0] ;Load new stack pointer address LDR PC, [R0, #4] ;Load new program counter address } 

La syntaxe de l’assembleur en ligne varie; Cet exemple est Keil ARM-MDK / ARM RealView.

Puis à la fin de votre chargeur de démarrage:

 // Switch off core clock before switching vector table SysTick->CTRL = 0 ; // Switch off any other enabled interrupts too ... // Switch vector table SCB->VTOR = APPLICATION_START_ADDR ; //Jump to start address boot_jump( APPLICATION_START_ADDR ) ; 

Notez que APPLICATION_START_ADDR est dans ce cas l’adresse de base ou d’emplacement de votre code d’application lié (0x3200 dans ce cas), et non le point d’entrée indiqué dans la carte de liens. La table de vecteurs d’application est située à cette adresse et le début de la table de vecteurs contient l’adresse initiale du pointeur de stack de l’application et le compteur de programme (le point d’entrée de code actuel).

La fonction boot_jump () charge un pointeur de stack et un compteur de programme à partir de la table de vecteurs de l’application, en simulant ce qui se produit lors de la réinitialisation lorsqu’ils sont chargés à partir de la base de la mémoire Flash (table de vecteurs du chargeur de démarrage).

Notez que vous devez avoir défini l’adresse de début dans les parameters de l’éditeur de liens de votre code d’application de la même manière que celle utilisée par le chargeur de démarrage pour copier l’image. Si vous utilisez le débogueur Keil, vous ne pourrez pas charger et exécuter l’application dans le débogueur sans le chargeur d’amorçage présent (ou au moins sans configurer manuellement le SP et le PC ou utiliser un script de débogueur), car le débogueur charge le réinitialiser les adresses vectorielles plutôt que les adresses vectorielles de l’application.

Il est important que les interruptions soient désactivées avant de changer de table des vecteurs. Dans le cas contraire, toute interruption survenant avant l’initialisation de l’application sera transmise au gestionnaire de l’application et risque de ne pas être prête.

Faites attention aux périphériques que vous utilisez à la fois dans l’application et le code de démarrage. Toute hypothèse concernant les conditions de réinitialisation peut ne pas être vérifiée si les registres de périphériques ont déjà été définis par le code de démarrage.