当前位置:网站首页>2021 - 06 - 16 stm32f103 exti interruption identification using firmware Library

2021 - 06 - 16 stm32f103 exti interruption identification using firmware Library

2022-06-21 07:41:00 Drmivet Stone

Cet article montreSTM32 Interruption externeEXTIDe Opérations d'identification
Le contenu concerne: :
Interruption externeEXTIIdentification
IOPort I / o
Traitement des interruptions externes des touches
Méthode de capture d'interruption externe


Préface

Voici le Code de la partie centrale,Les paramètres de certaines variables,L'inclusion de fichiers d'en - tête, etc., peut ne pas impliquer, Pour le code complet, veuillez consulter les travaux connexes de ce chapitre. . Pour rendre le projet plus organisé,On met LED Les codes liés à la commande de la lampe sont stockés séparément ,Facile à transplanter plus tard. In“Modèles d'ingénierie”Nouveau sur“RCC_book.c”Et“RCC_book.h” Documents et documents antérieurs “Led_book.c”Et“Led_book.h”Documentation

Git Code

Un.、 Points clés de la programmation

Interruption externe:
1) Initialiser le GPIO , Activer une interruption périphérique
2) Initialisation EXTI
a:Initialisation NVIC_InitTypeDef Structure,Configurer le Groupe de priorité d'interruption,Définir la priorité de préemption et la Sous - priorité,Activer la demande d'interruption
b:NVIC_IROChannel: Utilisé pour définir la source d'interruption
c:NVIC_IRQChannelPreemptionPriority:Priorité de préemption
d:NVIC_IRQChannelSubPriority
e:NVIC_IRQChannelCmd:Activer l'interruption(ENABLE) Ou incapacité (DISABLE)
3) Configuration NVIC
4) Écrire une fonction de service d'interruption

2.、Utiliser les étapes

1.Comprendre le schéma

Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

Insérer la description de l'image ici

Les codes sont les suivants::
: STM32F103ZET6 Le port de sortie est PB5 Le point de bas niveau est actif
: STM32F103ZET6 Key Le pied d'essai est PA8

2.ÉtablissementEXTI Le clavier est cassé Fichier d 'en - tête Exit_book.h

Les codes sont les suivants:(Exemple):

#ifndef __EXIT_BOOK_H_
#define __EXIT_BOOK_H_

#include "stm32f10x.h"

#define _KEY_EXTI_IN_GPIO_Port GPIOA
#define _KEY_EXTI_IN_GPIO_Pin GPIO_Pin_0
#define _EXTI_IN_GPIO_PortSource GPIO_PortSourceGPIOA
#define _EXTI_IN_GPIO_PinSource GPIO_PinSource0
#define _EXTI_IN_EXTI_Line EXTI_Line0 
#define _EXTI_IN_EXTI_Trigger EXTI_Trigger_Rising
#define _EXTI_IN_GPIO_Clock RCC_APB2Periph_AFIO
#define _EXTI_IN_EXTI_Mode EXTI_Mode_Interrupt
#define _EXTI_IN_EXTI_LineCmd ENABLE

#define _NVIC_IN_EXTI_IRQChannel EXTI0_IRQn
#define _NVIC_IN_EXTI_IRQChannelCmd ENABLE


#define _KEY2_EXTI_IN_GPIO_Port GPIOC
#define _KEY2_EXTI_IN_GPIO_Pin GPIO_Pin_13
#define _EXTI_IN2_GPIO_PortSource GPIO_PortSourceGPIOC
#define _EXTI_IN2_GPIO_PinSource GPIO_PinSource13
#define _EXTI_IN2_EXTI_Line EXTI_Line13
#define _EXTI_IN2_EXTI_Trigger EXTI_Trigger_Falling
#define _EXTI_IN2_GPIO_Clock RCC_APB2Periph_AFIO
#define _EXTI_IN2_EXTI_Mode EXTI_Mode_Interrupt
#define _EXTI_IN2_EXTI_LineCmd ENABLE

#define _NVIC_IN2_EXTI_IRQChannel EXTI15_10_IRQn
#define _NVIC_IN2_EXTI_IRQChannelCmd ENABLE



void  fn_EXTI_GPIO_Config(void);
void  fn_NVIC_Config(void);
void  EXTI0_IRQHandler(void);

#endif

3.ÉtablissementEXTI Le clavier est cassé Fichier d 'en - tête Exit_book.c

Les codes sont les suivants:(Exemple):

#include "Exit_book.h"
#include "Led_book.h"

/************************************************************** * @brief * void fn_EXTI_GPIO_Config(void) * @param * * #define _KEY_EXTI_IN_GPIO_Port GPIOA * #define _KEY_EXTI_IN_GPIO_Pin GPIO_Pin_0 * #define _EXTI_IN_GPIO_PortSource GPIO_PortSourceGPIOA * #define _EXTI_IN_GPIO_PinSource GPIO_PinSource0 * #define _EXTI_IN_EXTI_Line EXTI_Line0 * #define _EXTI_IN_EXTI_Trigger EXTI_Trigger_Rising * #define _EXTI_IN_GPIO_Clock RCC_APB2Periph_AFIO * #define _EXTI_IN_EXTI_Mode EXTI_Mode_Interrupt * #define _EXTI_IN_EXTI_LineCmd ENABLE * * #define _KEY2_EXTI_IN_GPIO_Port GPIOC * #define _KEY2_EXTI_IN_GPIO_Pin GPIO_Pin_13 * #define _EXTI_IN2_GPIO_PortSource GPIO_PortSourceGPIOC * #define _EXTI_IN2_GPIO_PinSource GPIO_PinSource13 * #define _EXTI_IN2_EXTI_Line EXTI_Line13 * #define _EXTI_IN2_EXTI_Trigger EXTI_Trigger_Falling * #define _EXTI_IN2_GPIO_Clock RCC_APB2Periph_AFIO * #define _EXTI_IN2_EXTI_Mode EXTI_Mode_Interrupt * #define _EXTI_IN2_EXTI_LineCmd ENABLE * @retval *************************************************************/ 
void  fn_EXTI_GPIO_Config(void){
    
  EXTI_InitTypeDef   EXIT_InitStruck;
  RCC_APB2PeriphClockCmd(_EXTI_IN_GPIO_Clock , ENABLE);  
  //Attention!: On n'a qu'à conduire.  GPIO  En dehors de l'horloge du port pour , On l'a ouvert.  AFIO L'horloge de
  GPIO_EXTILineConfig(_EXTI_IN_GPIO_PortSource | _EXTI_IN2_GPIO_PortSource , _EXTI_IN_GPIO_PinSource | _EXTI_IN2_GPIO_PinSource);
  /* Sélectionner EXTI La source du signal */
  // GPIO_EXTILineConfig  Fonction utilisée pour spécifier l'interruption / Source d'entrée de la ligne d'événement , C'est en fait une configuration d'interruption externe 
  //  Registre  AFIO_EXTICRx Valeur,Cette fonction reçoit deux arguments,Le premier paramètre spécifie GPIO  Source du port ,No
  //  Les deux paramètres correspondent à la sélection  GPIO  Pin Source Number .
  
  
  EXIT_InitStruck.EXTI_Line = _EXTI_IN_EXTI_Line ; /* Sélectionner EXTI La source du signal */
  EXIT_InitStruck.EXTI_Mode = _EXTI_IN_EXTI_Mode;   /* EXTI Mode d'interruption */
  EXIT_InitStruck.EXTI_Trigger = _EXTI_IN_EXTI_Trigger ; /* Rupture du bord ascendant */
  EXIT_InitStruck.EXTI_LineCmd = _EXTI_IN_EXTI_LineCmd; /* Activer l'interruption */
  EXTI_Init(&EXIT_InitStruck);
  // EXTI Initialiser les variables configurées 
  // fn_NVIC_Config();
  // Appelez NVIC_Configuration La fonction complète la paire de touches  1、Appuyez sur la touche 2  Configurer les priorités et permettre l'interruption des canaux 
  
  EXIT_InitStruck.EXTI_Line = _EXTI_IN2_EXTI_Line; /* Sélectionner EXTI La source du signal */
  EXIT_InitStruck.EXTI_Mode = _EXTI_IN2_EXTI_Mode;   /* EXTI Mode d'interruption */
  EXIT_InitStruck.EXTI_Trigger = _EXTI_IN2_EXTI_Trigger; /* Le bord de descente est interrompu */
  EXIT_InitStruck.EXTI_LineCmd = _EXTI_IN_EXTI_LineCmd;/* Activer l'interruption */
  EXTI_Init(&EXIT_InitStruck);
  
  fn_NVIC_Config();
}

/************************************************************** * @brief * void fn_NVIC_Config(void) * @param * #define _NVIC_IN_EXTI_IRQChannel EXTI0_IRQn * #define _NVIC_IN_EXTI_IRQChannelCmd ENABLE * #define _NVIC_IN2_EXTI_IRQChannel EXTI15_10_IRQn * #define _NVIC_IN2_EXTI_IRQChannelCmd ENABLE * @retval *************************************************************/ 
void  fn_NVIC_Config(void){
    
  NVIC_InitTypeDef NVIC_InitStruct;
  /* Configuration NVIC Pour les groupes prioritaires 1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* Configurer la source d'interruption: */
  NVIC_InitStruct.NVIC_IRQChannel = _NVIC_IN_EXTI_IRQChannel; //EXTI0_IRQn;
  /* Configurer la priorité de préemption:1 */
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  /* Configurer les sous - priorités:1 */
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  /* Activer l'interruption du canal */
  NVIC_InitStruct.NVIC_IRQChannelCmd = _NVIC_IN_EXTI_IRQChannelCmd; //ENABLE
  NVIC_Init(&NVIC_InitStruct);
  
  /* Configurer la source d'interruption: */
  NVIC_InitStruct.NVIC_IRQChannel = _NVIC_IN2_EXTI_IRQChannel; //EXTI0_IRQn;
  NVIC_Init(&NVIC_InitStruct);
}

/************************************************************** * @brief * void fn_NVIC_Config(void) * @param * #define _KEY_EXTI_IN_GPIO_Port GPIOA * #define _KEY_EXTI_IN_GPIO_Pin GPIO_Pin_0 * @retval *************************************************************/ 
void EXTI0_IRQHandler(void){
    
// EXTI_GetITStatus  Fonction utilisée pour obtenir  EXTI  État du BIT d'interruption pour ,Si EXTI  La ligne a une fonction d'interruption 
//Le compte revient“SET”Sinon, retournez à“RESET”.En fait,,EXTI_GetITStatus  La fonction est lue 
//EXTI_PR Valeur du registre à juger  EXTI Linéaire .
  if(EXTI_GetITStatus(_EXTI_IN_EXTI_Line)!= RESET){
    
    if(GPIO_ReadInputDataBit(_KEY_EXTI_IN_GPIO_Port, _KEY_EXTI_IN_GPIO_Pin)==1){
    
      __LED_Change__;
    }
  }
  EXTI_ClearITPendingBit(_EXTI_IN_EXTI_Line);  //  Effacer les drapeaux d'interruption importants  
}


void EXTI15_10_IRQHandler(void){
    
 if(EXTI_GetITStatus(_EXTI_IN2_EXTI_Line)!= RESET){
    
    if(GPIO_ReadInputDataBit(_KEY2_EXTI_IN_GPIO_Port, _KEY2_EXTI_IN_GPIO_Pin)==0){
    
      __LED_Change__;
    }
  }
  EXTI_ClearITPendingBit(_EXTI_IN2_EXTI_Line);  //  Effacer les drapeaux d'interruption importants  
}

4.ÉtablissementKeyAcquis Fichier d 'en - tête Key_book.h

Les codes sont les suivants:(Exemple):

#ifndef __KEY_BOOK_H_
#define __KEY_BOOK_H_


#include "stm32f10x.h"
#include "Led_book.h"

#define KEY_IN_GPIO_Port GPIOA
#define KEY_IN_GPIO_Clock RCC_APB2Periph_GPIOA
#define KEY_IN_GPIO_Pin GPIO_Pin_0
#define KEY_IN_GPIO_Pin_Bit 0
#define Key_IN_GPIO_Modle GPIO_Mode_IN_FLOATING //Entrée flottante


#define KEY2_IN_GPIO_Port GPIOC
#define KEY2_IN_GPIO_Clock RCC_APB2Periph_GPIOC
#define KEY2_IN_GPIO_Pin GPIO_Pin_13
#define KEY2_IN_GPIO_Pin_Bit 13
#define Key2_IN_GPIO_Modle GPIO_Mode_IN_FLOATING //Entrée flottante


typedef union {
    
  struct{
    
    unsigned char BIT0:1;unsigned char BIT1:1;unsigned char BIT2:1;unsigned char BIT3:1;
    unsigned char BIT4:1;unsigned char BIT5:1;unsigned char BIT6:1;unsigned char BIT7:1;
    //unsigned char BIT8:1;unsigned char BIT9:1;unsigned char BIT10:1;unsigned char BIT11:1;
    //unsigned char BIT12:1;unsigned char BIT13:1;unsigned char BIT14:1;unsigned char BIT15:1;
  }DATA_BIT;
  uint8_t DATA_BYTE;
}Per_key_type;

extern volatile  Per_key_type key_flag;
  #define bkey_10ms key_flag.DATA_BIT.BIT0
  #define bkey_judge key_flag.DATA_BIT.BIT1
  #define bkey_judge_long key_flag.DATA_BIT.BIT2
  #define bkey_Effect key_flag.DATA_BIT.BIT3
  #define bkey_LongEffect key_flag.DATA_BIT.BIT4
  #define bkey_Effect_Lose key_flag.DATA_BIT.BIT5
  #define bkey_Effect_LLose key_flag.DATA_BIT.BIT6
void  fn_Key_GPIO_Config( GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock , uint16_t _GPIO_Pin_x , GPIOMode_TypeDef  _GPIOMode_TypeDef );
void  fn_Key_Init(void);
void  fn_key_judge(void);
void  fn_key_Effect(void);  
void  fn_key_Check(void);
#endif

5.ÉtablissementKeyAcquis Fichier d 'en - tête Key_book.c

Les codes sont les suivants:(Exemple):

#include "Key_book.h"
 
volatile  Per_key_type key_flag;

/************************************************************** * @brief * void fn_Key_GPIO_Config( GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock , * uint16_t _GPIO_Pin_x , GPIOMode_TypeDef _GPIOMode_TypeDef ); * @param * #define KEY_IN_GPIO_Port GPIOA * #define KEY_IN_GPIO_Clock RCC_APB2Periph_GPIOA * #define KEY_IN_GPIO_Pin GPIO_Pin_0 * #define KEY_IN_GPIO_Pin_Bit 0 * #define Key_IN_GPIO_Modle GPIO_Mode_IN_FLOATING //Entrée flottante * * #define KEY2_IN_GPIO_Port GPIOC * #define KEY2_IN_GPIO_Clock RCC_APB2Periph_GPIOC * #define KEY2_IN_GPIO_Pin GPIO_Pin_13 * #define KEY2_IN_GPIO_Pin_Bit 13 * #define Key2_IN_GPIO_Modle GPIO_Mode_IN_FLOATING //Entrée flottante * @retval *************************************************************/ 
void  fn_Key_GPIO_Config( GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock , uint16_t _GPIO_Pin_x , GPIOMode_TypeDef  _GPIOMode_TypeDef ){
    
    GPIO_InitTypeDef  GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = _GPIOMode_TypeDef;
    GPIO_InitStruct.GPIO_Pin = _GPIO_Pin_x;
    RCC_APB2PeriphClockCmd(_GPIO_Clock,ENABLE);
    GPIO_Init(_GPIO_x , &GPIO_InitStruct);  
}

/************************************************************** * @brief * void fn_Key_Init(void); * @param * @retval *************************************************************/ 
void  fn_Key_Init(void){
    
    fn_Key_GPIO_Config(KEY_IN_GPIO_Port,KEY_IN_GPIO_Clock,KEY_IN_GPIO_Pin,Key_IN_GPIO_Modle);
    fn_Key_GPIO_Config(KEY2_IN_GPIO_Port,KEY2_IN_GPIO_Clock,KEY2_IN_GPIO_Pin,Key2_IN_GPIO_Modle);
}

/************************************************************ * @brief * void fn_key_judge(void); * @param * @retval **************************************************************/ 
#define _LONG_key 30
static uint16_t count_key ;
void  fn_key_judge(void){
    
   
   if(!bkey_10ms){
    return;}
   bkey_10ms = 0;
   if(GPIO_ReadInputDataBit(KEY_IN_GPIO_Port,KEY_IN_GPIO_Pin)){
    
     if(count_key++<3){
    return;}
     if(!bkey_judge){
    
       bkey_judge = 1;
       bkey_Effect = 1; 
     }else{
    
       if(count_key>_LONG_key){
    
          bkey_judge_long = 1;
          bkey_LongEffect = 1;
       }
     }
   }
   else{
    
     count_key = 0;
     if(bkey_judge){
    
        bkey_judge = 0;
        if(bkey_judge_long){
    
            bkey_judge_long = 0;
            bkey_Effect_LLose = 1;
        }else{
    
            bkey_judge_long = 0;
            bkey_Effect_Lose = 1;
        }
     }else{
    
        bkey_judge = 0;         
     }
  }
}

/************************************************************ * @brief * void fn_key_Effect(void); * @param * @retval *************************************************************/ 
void  fn_key_Effect(void){
    
  if(bkey_Effect){
    
    bkey_Effect = 0;
    fn_LED_Corporate(LED_OUT_GPIO_Port,LED_OUT_GPIO_Pin,LED_Corporate_Toggle);
  }
}

/************************************************************** * @brief * void fn_key_Check(void); * @param * @retval *************************************************************/ 
void fn_key_Check(void){
    
  fn_key_judge();
  fn_key_Effect();
}

6.Profitez de l'ancienLEDSortie Fichier d 'en - tête Led_book.h

Les codes sont les suivants:(Exemple):

#ifndef __LED_BOOK_H_
#define __LED_BOOK_H_

#include "stm32f10x.h"
 

#define LED_OUT_GPIO_Port GPIOB //GPIO Point
#define LED_OUT_GPIO_Clock RCC_APB2Periph_GPIOB //GPIO clock
#define LED_OUT_GPIO_Pin GPIO_Pin_5 
#define LED_OUT_GPIO_Pin_Bit 5
#define LED_OUT_GPIO_Modle GPIO_Mode_Out_PP

typedef enum {
    
		LED_Corporate_On = 1,
		LED_Corporate_OFF = 2,
		LED_Corporate_Toggle = 3, 
} LED_Corporate_state_t;

void fn_LED_GPIO_Config(GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock ,\
          uint16_t _GPIO_Pin_x , GPIOMode_TypeDef _GPIOMode_TypeDef);
void fn_Led_Init(void);
void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , \
          LED_Corporate_state_t _LED_Corporate_state_t );
  
#define __LED_Change__ fn_LED_Corporate(LED_OUT_GPIO_Port,LED_OUT_GPIO_Pin,LED_Corporate_Toggle)
#endif

7.Profitez de l'ancienLEDSortie Fichier d 'en - tête Led_book.c

Les codes sont les suivants:(Exemple):

#include "Led_book.h"

/************************************************************** * @brief * void fn_LED_GPIO_Config(GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock , * uint16_t _GPIO_Pin_x , GPIOMode_TypeDef _GPIOMode_TypeDef); * @param * @retval *************************************************************/ 
#define LED_GPIO_Speed GPIO_Speed_10MHz 
void fn_LED_GPIO_Config(GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock ,uint16_t _GPIO_Pin_x , GPIOMode_TypeDef _GPIOMode_TypeDef){
    
  GPIO_InitTypeDef  GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Mode = _GPIOMode_TypeDef;
  GPIO_InitStruct.GPIO_Pin = _GPIO_Pin_x;
  GPIO_InitStruct.GPIO_Speed = LED_GPIO_Speed;
  RCC_APB2PeriphClockCmd(_GPIO_Clock ,ENABLE); 
  GPIO_Init(_GPIO_x , &GPIO_InitStruct) ; 
  GPIO_SetBits(_GPIO_x,_GPIO_Pin_x);
}

/************************************************************** * @brief * void fn_Led_Init(void); * @param * @retval *************************************************************/ 
void fn_Led_Init(void){
    
  fn_LED_GPIO_Config (LED_OUT_GPIO_Port,LED_OUT_GPIO_Clock,LED_OUT_GPIO_Pin,LED_OUT_GPIO_Modle);
}

/************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * @retval *************************************************************/ 
void fn_LED_Corporate(GPIO_TypeDef*  _GPIO_x , uint16_t  _GPIO_Pin_x , LED_Corporate_state_t  _LED_Corporate_state_t ){
    
  switch(_LED_Corporate_state_t){
    
    case  LED_Corporate_On :
      GPIO_SetBits(_GPIO_x,_GPIO_Pin_x);
      break;
		case  LED_Corporate_OFF:
      GPIO_ResetBits(_GPIO_x,_GPIO_Pin_x);
      break;
		case  LED_Corporate_Toggle:
      GPIO_ReadOutputDataBit(_GPIO_x,_GPIO_Pin_x)?GPIO_ResetBits(_GPIO_x,_GPIO_Pin_x):GPIO_SetBits(_GPIO_x,_GPIO_Pin_x);
      break;    
  }
}


//practice
//fn_LED_GPIO_Config (LED_OUT_GPIO_Port,LED_OUT_GPIO_Clock,LED_OUT_GPIO_Pin,LED_OUT_GPIO_Modle);
// while(1){
    
// delay(10000);
// fn_LED_Corporate(LED_OUT_GPIO_Port,LED_OUT_GPIO_Pin,LED_Corporate_Toggle); 
// } 

8.ÉtablissementSysticks KeySortie Procédure principale main.c

Les codes sont les suivants:(Exemple):

/** ****************************************************************************** * @file GPIO/JTAG_Remap/main.c * @author MCD Application Team * @version V3.5.0 * @date 08-April-2011 * @brief Main program body ****************************************************************************** * @attention * * ****************************************************************************** */ 

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "PROJ_book.h" 

/* Private functions ---------------------------------------------------------*/

/** * @brief Main program. * @param None * @retval None */
void delay(int x);
void fn_Main_Init(void);
int main(void)
{
     
      fn_Led_Init();
      fn_Key_Init();
      fn_Main_Init();     
      fn_EXTI_GPIO_Config();
      while(1){
    
       // fn_key_Check();
        delay(10000);
      }
}

void fn_Main_Init(void){
    
  uint16_t  count_Init = 2;
  while(count_Init-->0){
    
    __LED_Change__;
    fn_Systick_Delay(500,_Systick_ms);
    __LED_Change__;
    fn_Systick_Delay(100,_Systick_ms);
    __LED_Change__;
    fn_Systick_Delay(100,_Systick_ms);
    __LED_Change__;
    fn_Systick_Delay(500,_Systick_ms);
  } 
}

void delay(int x){
    
	int y = 0xFFFFF;
	while((x--)>0){
    
		while((y--)>0){
    
			__NOP();
			__NOP();
			__NOP();
			__NOP();
			__NOP();
		}
	}
}
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

www.firebbs.cn.


Notes de référence.
_STM32f103 Interruption Et EXT

STM32 EXIT – LED Procédure

STM32 EXIT – EXIT Procédure

STM32 EXIT – Key Procédure

STM32 RCC – Procédure principale

Résumé

EXTI(External interrupt/event controller)—Interruption externe/Contrôleur d'événements,Géré par le Contrôleur 20
Interruptions/Ligne d'événements.Chaque interruption/Chaque ligne d'événement correspond à un détecteur de bord, Le bord ascendant du signal d'entrée peut être réalisé 
 Détection et détection des bords de descente .EXTI Chaque interruption peut être réalisée/Les lignes d'événements sont configurées individuellement, Peut être configuré individuellement comme 
 Interruption ou événement ,Et les propriétés qui déclenchent l'événement.

Insérer la description de l'image ici

EXTI  Le diagramme de bloc fonctionnel contient  EXTI Le contenu de base,Maîtrise du schéma de bloc fonctionnel,C'est exact. EXTI  Il y a un tout. 
De, La programmation est très claire .EXTI  Voir la figure pour le diagramme de bloc fonctionnel  18-1. Dans la figure 18-1  Vous pouvez voir beaucoup de Slash sur la ligne de signal et marquer “20”Mots, Ceci est indiqué dans le Contrôleur 
 Les lignes de signalisation internes similaires sont:  20 - Oui.,Ceci est lié à EXTI En tout. 20 Interruptions/ La ligne de l'événement correspond . C'est pourquoi nous ne faisons que 
 Pour comprendre le principe de l'un d'eux ,Les autres. 19  Un principe de câblage. 

EXTI0 à EXTI15 Pour GPIO,N'importe lequel peut être réalisé par le contrôle de programmation GPIO En tant que EXTI La perte de
 Source .Par tableau 18-1 C'est clair.,EXTI0 Peut passer AFIO Registre de configuration d'interruption externe pour 1(AFIO_EXTICR1)De
EXTI0[3:0]La sélection de bits est configurée pour PA0、PB0、PC0、PD0、PE0、PF0、PG0、PH0 Ou

 EXTI Initialisation des détails structurels
La fonction Bibliothèque standard établit une structure d'initialisation pour chaque périphérique,Par exemple, EXTI_InitTypeDef,Structure
 Les membres sont utilisés pour définir les paramètres de travail périphériques , Et initialiser la fonction de configuration par périphérique ,Par exemple, EXTI_Init()Appelez,Ces paramètres
 Le paramètre définit le registre périphérique correspondant ,Pour configurer l'environnement de travail périphérique

typedef struct {
2 uint32_t EXTI_Line; // Interruption/Ligne d'événements
3 EXTIMode_TypeDef EXTI_Mode; // EXTI Mode
4 EXTITrigger_TypeDef EXTI_Trigger; // Type de déclenchement
5 FunctionalState EXTI_LineCmd; // EXTI Activer
6 } EXTI_InitTypeDef;
1. D'abord. Les touches et EXTI  Macro definition utilise la méthode macro definition pour spécifier les configurations liées à la conception du circuit matériel , Ceci est utile pour la migration ou la mise à niveau des programmes . Dans la définition de macro ci - dessus , On n'a qu'à conduire.  GPIO  En dehors de l'horloge du port pour , On l'a ouvert.  AFIO L'horloge de,Voilà. - Oui. Cause Pour Attendez. En bas. Appariement Position EXTI  La source du signal doit être utilisée  AFIO  Registre externe de contrôle des interruptions pour AFIO_EXTICRx
2. Contrôleur d'interruption vectorielle imbriqué NVIC Configuration, Configurer deux priorités logicielles d'interruption 
3. EXTI Configuration d'interruption
4. Utiliser GPIO_InitTypeDef Et EXTI_InitTypeDef  La structure définit deux  GPIO EtEXTI  Initialiser les variables configurées , Les deux structures ont été expliquées en détail plus tôt. .
Utiliser GPIO  Doit être ouvert avant  GPIO Horloge du port;Oui. EXTI Doit être allumé AFIO Horloge.
Appelez NVIC_Configuration  La fonction complète la configuration de la priorité de la clé et permet d'interrompre le canal .
Comme interruption/ La ligne d'entrée de l'événement doit être  GPIO Configurer comme mode d'entrée, Entrée flottante spécifique , L'état de la goupille est entièrement déterminé par le circuit externe .GPIO_EXTILineConfig  Fonction utilisée pour spécifier l'interruption / Source d'entrée de la ligne d'événement , Il définit en fait le registre de configuration d'interruption externe  AFIO_EXTICRx Valeur,Cette fonction reçoit deux arguments,Le premier paramètre spécifie GPIO  Source du port , Le deuxième paramètre correspond à la sélection  GPIO  Pin Source Number .
 Notre but est de créer une interruption ,Exécuter la fonction de service d'interruption,EXTI Sélectionner le mode d'interruption,Appuyez sur la touche 1  Utiliser le mode de déclenchement du bord ascendant ,Et activer EXTI Ligne.Appuyez sur la touche 2  Essentiellement avec les touches  1 Configuration des paramètres connexes, Changez simplement le mode de déclenchement du bord de descente 
原网站

版权声明
本文为[Drmivet Stone]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/172/202206210737470749.html