Interruption exterieure STM32F103C8T6
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Interruption exterieure STM32F103C8T6



  1. #1
    galou32

    Interruption exterieure STM32F103C8T6


    ------

    Bonjour,

    j'ai un soucis avec une interuption entrante sur STM32F103C8T6

    le but étant aprés appui sur un bouton (équipé d'un condo, monté en input push pull sur PA2) de lancer un programme d'affichage

    dans mon premier cas ci dessous le programme d'affichage se lance 2 fois comme ci un rebond était pris en compte ou,
    que le bit 2 du pending register reste haut (si j'ai bien compris le RM0008)

    Code:
    void EXTI2_IRQHandler(void){ // IRQ du BP2
    
    	NVIC_DisableIRQ (EXTI2_IRQn); // disable Interrupt EXTI BP2
    
    	// Gestion de IRQ BP2
    	if (EXTI->PR & (1<<2)){// If the PA2 triggered the interrupt, the pending bit is set 1
    		EXTI->PR |= (1<<2);// reset by writing a ‘1’ in the pending register P208 RM0008
    
    		*************
    	programme d'affichage (s'effectue en 2 secondes)
    		***********
    	}
    
    	NVIC_EnableIRQ (EXTI2_IRQn);  // Enable Interrupt EXTI 2
    }
    dans ce deuxieme cas le fonctionnement est correct (jamais de rebond)
    mais je ne comprend pas pourquoi????

    Code:
    void EXTI2_IRQHandler(void){ // IRQ du BP2
    
    	NVIC_DisableIRQ (EXTI2_IRQn); // disable Interrupt EXTI BP2
    
    	// Gestion de IRQ BP2
    	
    		*************
    	programme d'affichage (s'effectue en 2 secondes)
    		***********
    	
    	if (EXTI->PR & (1<<2)){ // If the PA2 triggered the interrupt, the pending bit is set 1
    		EXTI->PR |= (1<<2);// reset by writing a ‘1’ in the pending register P208 RM0008
    	}
    	
    	NVIC_EnableIRQ (EXTI2_IRQn);  // Enable Interrupt EXTI 2
    }
    si vous pouviez m'expliquer,
    Merci

    -----

  2. #2
    galou32

    Re : Interruption exterieure STM32F103C8T6

    Bonjour,

    Après plusieurs essai de debugge je ne soupçonne plus le EXTI->PR.

    je pense qu'il se passe quelque chose au niveau du NVIC que je n'ai pas compris (p127 du PM0056).
    j'ai fait une fonction délais avec le TIM4 (car HAL_delay(...) ne fonctionne pas dans les IRQ à cause du Systick), et j'ai intégrée un delais de 200ms juste avant :

    NVIC_DisableIRQ (EXTI2_IRQn); // disable Interrupt EXTI BP2

    l'absorption du rebond fonctionne très bien avec cela.

    Mais je suis preneur de toute explication...

  3. #3
    piep62110

    Re : Interruption exterieure STM32F103C8T6

    Bonjour, je n'ai pas encore travaillé sur cette plateforme, donc je ferai juste une remarque sur le fond générale à tous les processeurs.

    Le traitement sous interruption externe de signaux est utile si l'on à besoin d'une grande réactivité sur des signaux rapides et éphémère. Cependant il faut toujours la libérer le plus rapidement possible pour ne pas rater le prochain événement.

    Dans votre exemple je vois que l'affichage dure 2 secondes. Bloquer une It pendant un tel temps est du gâchis et cela peut bloquer d'autres It de priorité plus faible notamment.
    -> Dans les systèmes multi-tâche, l'interruption d'horloge qui cadence le scheduler du noyau n'a pas la priorité la plus élevée.

    Si vous souhaitez utiliser pour une réactivité importante une it, l'it doit prévenir une autre partie du logiciel pour filtrer et déclencher les actions souhaitées. Ce peut être un objet de synchronisation, si vous utilisez un noyau multi-tâches, ou simplement une variable si c'est une boucle de fond qui anime le logiciel. C'est cette boucle qui scrutera cette variable. Cette variable pouvant facilement servir au filtrage anti-rebond.

    Une autre possibilité est de faire une lecture de l'entrée cycliquement (pooling) dans une boucle sans utiliser une interruption.

  4. #4
    piep62110

    Re : Interruption exterieure STM32F103C8T6

    Concernant votre question sur les deux versions du codes:
    Tant que l'it n'est pas acquittée ou réarmée (EXTI->PR) la même interruption ne peut être relancée par le contrôleur d'interruption.

    Dans le premier cas, vous le réarmez de suite. Le contrôleur d'interruption peut redéclencher l'it immédiatement avant que vous ayez terminé l'affichage et donc le rebond.
    L'interruption originale est interrompue par le rebond.
    Certainement que l'affichage commence avec la première it, la deuxième it qui interromp l'affichage de la première it recommence l'affichage au début et se termine, au retour la première interruption termine l'affichage commencé.


    Dans le deuxième cas, le réarmement de l'IT se fait après l'affichage (2s), donc pas de réentrance, le rebond est ignoré.

    J'ai illustré le cas d'un seul rebond. En réalité il peut y en avoir plus.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Interruption sur un AVR
    Par invitef4c6670c dans le forum Électronique
    Réponses: 7
    Dernier message: 29/11/2014, 22h28
  2. Interruption sur pic 18F
    Par invite45df8790 dans le forum Électronique
    Réponses: 30
    Dernier message: 02/05/2014, 17h05
  3. PIC : interruption externe et interruption on change ?
    Par invitea3277f60 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 13h41
  4. interruption sur pic
    Par invite3a1051d7 dans le forum Électronique
    Réponses: 4
    Dernier message: 02/08/2009, 21h13
  5. Interruption
    Par invited59ff025 dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2008, 15h05