Comment déplacer vecteur de table et de changer de départ addressin cortexm3 à l'aide de uvision(Keil)?
Je suis en utilisant STM32F107 cortex m3 contrôleur. Je suis à l'aide de uvision IDE pour le projet. J'ai une application qui fonctionne correctement à partir de l'emplacement que j'.e 0x0800 0000. Si je change d'emplacement de départ à 0x0800 4000 l'application ne fonctionne pas correctement. J'ai fait des modifications pour le vecteur de l'emplacement de la table à l'aide de cette fonction
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000) j'.e changé SCB->VTOR = 0x8004000 à cet emplacement.
Mais même après avoir fait cette interruption n'est pas le cas. Dois-je faire quelque chose de plus pour ce projet?
Ce qui concerne
Suraj
Je soupçonne que vous êtes en train de dire que le vecteur de table dans votre application est re-situé à 0x0800.0000 après le démarrage, et maintenant vous essayez de le déplacer à 0x0800.4000? Avez-vous vérifié que le vecteur de la table est en fait situé par votre ensemble d'outils à la nouvelle adresse? Et vous dites "l'interruption n'est pas le cas" - qu'est-ce exactement est-ce à dire? Beaucoup de choses entre un périphérique à faire valoir un d'interrompre et de vous votre ISR - pile de l'installation, activer les interruptions de la CPU, de la NVIC d'interruption de priorité, bon vecteur d'interruption installé, périphérique d'interruption démasqué, etc.
Quand j'ai regardé le fichier map ,vecteur de la table est situé à 0x0800 4000 lui-même. Je pense qu'il ya une erreur d'initialisation. la vérification que
Ce n'est pas la réponse à votre question, mais je suggère que vous faites un mondial ou un tableau statique, qui est assez grand pour contenir une copie de la table vectorielle et en pointant le vecteur pour cela, au lieu de définir l'adresse directement. La raison de ma suggestion est que votre programme se développe, il peut allouer des variables de remplacer le vecteur de la table, que les variables sont alloués. Une autre solution consiste à modifier le linker script et de réserver suffisamment d'espace pour une table vectorielle.
Quand j'ai regardé le fichier map ,vecteur de la table est situé à 0x0800 4000 lui-même. Je pense qu'il ya une erreur d'initialisation. la vérification que
Ce n'est pas la réponse à votre question, mais je suggère que vous faites un mondial ou un tableau statique, qui est assez grand pour contenir une copie de la table vectorielle et en pointant le vecteur pour cela, au lieu de définir l'adresse directement. La raison de ma suggestion est que votre programme se développe, il peut allouer des variables de remplacer le vecteur de la table, que les variables sont alloués. Une autre solution consiste à modifier le linker script et de réserver suffisamment d'espace pour une table vectorielle.
OriginalL'auteur suraj | 2013-02-07
Vous devez vous connecter pour publier un commentaire.
Vous ne devez pas utiliser
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000)
, utilisezNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000)
. Le deuxième argument est le "décalage", et non pas l'adresse absolue.OriginalL'auteur Grissiom
Ajouter les instructions ci-dessous juste après la HAL_Init();
SCB->VTOR = (FLASH_BASE | 0x4000);
Vous devez également mettre à jour le vecteur d'interruption de l'adresse dans le STM32F1xc_flash.icf fichier comme ci-dessous.
définir symbole ICFEDIT_intvec_start = 0x08004000;
OriginalL'auteur Rajesh Pappireddy
Je l'ai fait pour mon STM32L496, et il est important de définir le nouveau vecteur de la table avant d'appeler HAL_Init(), parce qu'il appelle HAL_MspInit(), qui peuvent utiliser le SysTick pour mesurer les délais d'attente lors de la configuration de certains périphériques.
OriginalL'auteur Ricardo Hassan