Interrupción de tecla STM32

Prefacio

Las interrupciones no se utilizaron en la sección anterior. En esta sección se utilizarán las interrupciones. Cuando se presiona el botón, se dispara la interrupción. La interrupción se maneja en la función de servicio de interrupciones.

1. Controlador de interrupción vectorial anidado NVIC

NVIC es un controlador de interrupciones vectoriales anidado, que controla las funciones relacionadas con las interrupciones en todo el chip y es un periférico en el núcleo.
El vector de interrupción en el manual: dividido en interrupción del sistema e interrupción periférica. El marco rojo es la interrupción del sistema, hay 10. Hay más de 60 interrupciones periféricas y la imagen solo muestra una pequeña parte.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Definición de prioridad: En
principio, la prioridad configurable de cada interrupción externa es 0 ~ 255, cuanto menor es el valor, mayor es la prioridad. Las prioridades se agrupan en prioridad preferente y subprioridad. Si varias interrupciones responden al mismo tiempo, la prioridad de preferencia se ejecutará primero. Si la prioridad de preferencia es la misma, compare la subprioridad. Si la subprioridad es la misma, compare el número de interrupción de hardware, que es el número Pritorty en la figura anterior. Cuanto menor sea el número, mayor será la prioridad.

Los grupos de prioridad son los siguientes:
Inserte la descripción de la imagen aquí
Funciones relacionadas con NVIC en la biblioteca de firmware

//设置分组优先级
void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
//获取分组优先级
uint32_t NVIC_GetPriorityGrouping(void)

//中断使能
void NVIC_EnableIRQ(IRQn_Type IRQn)
//中断失效
void NVIC_DisableIRQ(IRQn_Type IRQn)
//获取中断
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
//设置中断
void NVIC_SetPendingIRQ(IRQn_Type IRQn)
//清除中断
void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
//设置中断优先级
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
//获取中断优先级
uint32_t NVIC_GetPriority(IRQn_Type IRQn)

Pasos de programación de interrupciones :
1) Establecer interrupciones periféricas, como interrupciones del transceptor del puerto serie;
2) Inicializar la estructura NVIC_InitTypeDef;

typedef struct
{
    
    
  uint8_t NVIC_IRQChannel;//中断源,参考IRQn_Type 
  uint8_t NVIC_IRQChannelPreemptionPriority; //中断优先级 参考NVIC_Priority_Table 
  uint8_t NVIC_IRQChannelSubPriority;//中断子优先级NVIC_Priority_Table 
  FunctionalState NVIC_IRQChannelCmd; //This parameter can be set either to ENABLE or DISABLE   
} NVIC_InitTypeDef;

3) Función de servicio de interrupción

2. SALIR del controlador de interrupción externo

EXIT (controlador externo de eventos / interrupciones) controlador externo de eventos / interrupciones. Cada línea de interrupción / evento corresponde a un detector de flanco, que puede detectar el flanco ascendente y el flanco descendente de la señal de entrada. La línea de entrada es generalmente una señal con cambios de nivel. EXIT se puede dividir en dos categorías, una es para generar una interrupción y la otra es para generar un evento. La interrupción se le da directamente al NVIC para realizar más la interrupción. Los eventos de interrupción se envían a los circuitos periféricos, como el ADC y el temporizador TIM.

Inserte la descripción de la imagen aquí
EXTI tiene 20 líneas de interrupción / eventos.Cada GPIO se puede configurar como una línea de entrada, ocupando EXTI0 a EXTI15, y hay otras siete líneas para eventos periféricos específicos. La relación entre la fuente de entrada y la interrupción / evento es la siguiente
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Configurar interrupciones / eventos externos en la línea GPIO a través de AFIO_EXTICRx
Inserte la descripción de la imagen aquí

EXIT estructura:

typedef struct
{
    
    
  uint32_t EXTI_Line;  /* 中断/事件线,EXTI0-EXTI19 combination of @ref EXTI_Lines */
  EXTIMode_TypeDef EXTI_Mode;/* 模式选择@ref EXTIMode_TypeDef */
  EXTITrigger_TypeDef EXTI_Trigger; /* 触发选择,上升沿,下降沿,上升沿和下降沿 @ref EXTIMode_TypeDef */
  FunctionalState EXTI_LineCmd;  /* 是否使能ENABLE or DISABLE */ 
}EXTI_InitTypeDef;

3. Experimento de interrupción externa

Utilice el botón externo como fuente de activación para hacer que el controlador genere una interrupción y realice la tarea de controlar la iluminación en la función de servicio de interrupción. El GPIO correspondiente al botón KEY1 usa PA0, EXTI corresponde a la línea de interrupción EXTI0; NVIC corresponde a la fuente de interrupción EXTI0_IRQn.

Inserte la descripción de la imagen aquí

1) Inicialice el GPIO utilizado para generar interrupciones

2) Inicializar EXTI

3) Configurar NVIC

4) Función de servicio de interrupción de escritura

archivo de cabeza

#include "stm32f10x.h"

#define KEY1_INT_GPIO_PORT         GPIOA//组 PA
#define KEY1_INT_GPIO_CLK          (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)//时钟需要开启AFIO 配置中断 APB2
#define KEY1_INT_GPIO_PIN          GPIO_Pin_0//引脚

#define KEY1_INT_EXTI_PORTSOURCE   GPIO_PortSourceGPIOA//端口
#define KEY1_INT_EXTI_PINSOURCE    GPIO_PinSource0//引脚
#define KEY1_INT_EXTI_LINE         EXTI_Line0//中断线
#define KEY1_INT_EXTI_IRQ          EXTI0_IRQn//中断源中断/事件
#define KEY1_IRQHandler            EXTI0_IRQHandler//中断服务函数

Configurar EXTI, GPIO que genera interrupción

void EXTI_Key_Config(void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure; 
	EXTI_InitTypeDef EXTI_InitStructure;
	/*时钟设置*/
	RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);											
	/* NVIC中断*/
	NVIC_Configuration();	
	/*按键使用的GPIO*/
  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
  /* 浮空 */	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);
	/* 选择EXTI信号源 Selects the GPIO pin used as EXTI Line */
  GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE); 
  /*中断事件*/
  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
	/* 中断模式*/
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 触发模式,上升沿*/
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  /* 使能 */	
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

La configuración del registro de interrupciones externas GPIO_EXTILineConfig se utiliza para especificar la fuente de entrada de la línea de interrupciones / eventos. De hecho, establece el valor AFIO_EXTICRx del registro de configuración de interrupciones externas. Esta función recibe dos parámetros. El primer parámetro especifica la fuente del puerto GPIO , el segundo El parámetro es seleccionar el número de fuente de pin GPIO correspondiente.

Configurar NVIC

static void NVIC_Configuration(void)
{
    
    
  NVIC_InitTypeDef NVIC_InitStructure;
  /*优先级选择,组1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  /* 中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
  /* 主优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /*子优先级*/
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /*使能中断*/
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  //初始化
  NVIC_Init(&NVIC_InitStructure);
}

Función de servicio de interrupción

void KEY1_IRQHandler(void)
{
    
    
  //获取中断线EXTI line状态
	if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 
	{
    
    
		//翻转LED灯	
		LED1_TOGGLE;
		EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
	}  
}

Supongo que te gusta

Origin blog.csdn.net/WANGYONGZIXUE/article/details/115280667
Recomendado
Clasificación