当前位置:网站首页>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
Catalogue des articles
- Préface
- Un.、 Points clés de la programmation
- 2.、Utiliser les étapes
- 1.Comprendre le schéma
- 2.ÉtablissementEXTI Le clavier est cassé Fichier d 'en - tête Exit_book.h
- 3.ÉtablissementEXTI Le clavier est cassé Fichier d 'en - tête Exit_book.c
- 4.ÉtablissementKeyAcquis Fichier d 'en - tête Key_book.h
- 5.ÉtablissementKeyAcquis Fichier d 'en - tête Key_book.c
- 6.Profitez de l'ancienLEDSortie Fichier d 'en - tête Led_book.h
- 7.Profitez de l'ancienLEDSortie Fichier d 'en - tête Led_book.c
- 8.ÉtablissementSysticks KeySortie Procédure principale main.c
- Résumé
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
、




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.

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
边栏推荐
- JS knowledge blind spot | understanding of async & await
- Detailed explanation of deep learning technology for building an image search engine that can find similar images
- Golang Sync. Use and principle of waitgroup
- How to start wireless network service after win10 system installation
- MATLAB 三维图(非常规)
- Is the index of nine interview sites of ten companies invalid?
- ETF operation practice record: February 22, 2022
- Research Report on market supply and demand and strategy of inorganic feed phosphate industry in China
- Transport layer TCP header - serial number and acknowledgement number
- 为什么智慧城市需要数字孪生?
猜你喜欢

根因解析 | Kubernetes Pod状态异常九大场景盘点

Actual battle of wechat applet project -- music applet developed based on wyy music real interface

19 statistics and its sampling distribution -- distribution of sample mean and central limit theorem

Postman publishing API documentation

Matlab 3D diagram (unconventional)

2021-07-28 STM32F103配置信息

MATLAB快速入门

16 general measurement of data skewness and kurtosis

Software download method

2022年的WordPress网站安全问题
随机推荐
How to solve the problem that MySQL is not an internal command
Simulate long press event of mobile device
25 parameter estimation - Determination of sample size
[UML modeling] (4) sequence diagram of UML modeling
How to optimize MySQL paging query
[Blue Bridge Cup monolithic unit] serial port communication
为什么智慧城市需要数字孪生?
RDKit | 合成可行性分数--SA SCORE
24 parameter estimation interval estimation of two population parameters
app安全滲透測試詳細方法流程
Parameter estimation -- a general problem of parameter estimation
Deploy ZABBIX enterprise level distributed monitoring
19 statistics and its sampling distribution -- distribution of sample mean and central limit theorem
mysql如何关闭事务
. Net 4.5 asynchronous programming pilot (async and await)
企业级开发使用POI踩坑盘点
卧槽,一行代码就可将网页直接转pdf保存下来(pdfkit)
20 statistics and their sampling distribution -- Sampling Distribution of sample proportion
mysql中执行存储过程的语句怎么写
16 general measurement of data skewness and kurtosis