2016-11-26 4 views
1

J'ai essayé d'obtenir une interruption SysTick pour travailler sur un TM4C123GH6PM7. C'est un microcontrôleur à base de cortex m4. Lorsque j'utilise le débogueur Keil, je peux voir que l'interruption Systick est en attente de NVIC mais elle n'exécutera pas le gestionnaire. Aucune autre exception n'est activée et j'ai effacé le registre PRIMASK. Le code ci-dessous comment je l'interruption INITIALISER:SysTick Interruption en attente mais ne s'exécutera pas, problème de masquage d'interruption de débogage?

systck_init LDR R0,=NVIC_ST_CTRL_R 
      LDR R1,=NVIC_ST_RELOAD_R 
      LDR R2,=NVIC_ST_CURRENT_R 
      MOV R3,#0 
      STR R3,[R0] 
      STR R3,[R2] 
      MOV R3,#0x000020 
      STR R3,[R1] 
      MOV R3,#7 
      STR R3,[R0] 
      LDR R3,=NVIC_EN0_R 
      LDR R4,[R3] 
      ORR R4,#0x00008000 
      STR R4,[R3] 
      CPSIE I 
      MOV R3,#0x3 
      MSR CONTROL,R3 

Après beaucoup de recherches, je trouve qu'il peut être le débogueur masquer toutes les interruptions. Le bit pour contrôler ceci est dans un registre appelé le registre d'état et de contrôle d'arrêt de débogage. Bien que je ne peux pas sembler l'afficher dans le débogueur ni lire/écrire avec les commandes de débogage. J'ai utilisé les Startups fournis par Keil et, pour autant que je sache, les vecteurs/étiquettes sont corrects.

Et oui je sais. Pourquoi prendre la peine de tout faire en assemblée.

Toutes les idées seraient grandement appréciées. Première publication :)

Répondre

0

je peux voir que l'interruption sysTick est en attente int NVIC

sysTick n'a ni Activer ni attente bits de registre dans le NVIC. C'est spécial de cette façon, étant étroitement couplé au noyau MCU lui-même.

L'utilisation de 0x20 pour la valeur de rechargement est également dangereusement faible. Vous risquez de vous «coincer» dans le Systick Handler, incapable de le laisser car l'interruption suivante se déclenche trop tôt. Rappelez-vous que Cortex M4 nécessite au moins 12 horloges pour entrer et sortir d'un gestionnaire d'interruptions - ce qui consomme 24 des 32 cycles.

Indice supplémentaire: Votre dernière instruction change le registre utilisé pour le SP de MSP à PSP, mais je ne vois pas votre code configurer la PSP en premier. Veillez à implémenter Hardfault_Handler - votre code le déclenche probablement.

+0

Merci pour l'aide! Si systick n'est pas couplé via le NVIC, alors il s'agit d'une exception, donc il ne peut pas être préempté par des interruptions matérielles? Je suis désolé de ne pas afficher tout mon code mais il y en a beaucoup. Mais je configure la PSP ailleurs. J'ai utilisé 0x20 juste pour le faire sauter directement dans le gestionnaire Aujourd'hui, j'ai utilisé le simulateur de keil et le gestionnaire s'exécute correctement, mais je ne peux toujours pas le faire fonctionner avec le débogueur dans le circuit. – MHilton

+0

Vous pouvez configurer la priorité pour Systick (et d'autres interruptions du système) en utilisant les registres 'SHP' dans' SCB'. –

+0

J'ai seulement lu rapidement le code alors peut-être mal (commentez votre code!) Mais vous ne semblez pas effacer le compteur avant de le démarrer. Je pense que la valeur du compteur est indéfinie au démarrage (mais l'émulateur peut la réinitialiser). Si le compteur est 0x21 et que vous définissez le rechargement sur 0x20, vous devrez attendre qu'il se déclenche avant de déclencher. Cela dit, ce ne serait pas si long que le compteur SysTick est seulement 24 bits. –