STM32 integrado: en el tercer día, la tecla de interrupción de teclas realiza el control de las luces LED

1. Construcción de entornos de software e ingeniería

  • No lo presentaré, puede usar directamente el
    enlace listo para usar : https://pan.baidu.com/s/1GaSYpNm6yh-lZZmqRdXxvQ
    código de extracción: dy63

  • Enlace de archivo de biblioteca relacionado: https://pan.baidu.com/s/19PLYdtiuSoZZGdVD7_tumQ
    código de extracción: mrw8

2. Presione la tecla para interrumpir el control de la luz led

  • Más información sobre el proceso de manejo de interrupciones

Proceso de manejo de interrupciones: excepción (interrupción) fuente de interrupción -> permitir interrupción -> solicitar interrupción -> respuesta de CPU -> proteger escena (pila) -> procesamiento de salto -> retorno.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

  • Importancia de las
    interrupciones Las interrupciones ocupan un lugar muy importante en los eventos del programa. Si no hay interrupción, la eficiencia de la CPU se reducirá considerablemente. Al igual que en el módulo UART, al recibir los datos enviados por la computadora, se utiliza el método while () {} para consultar el estado. Si la computadora no envía datos, el programa seguirá bloqueando, haciendo que la CPU no pueda hacer otras cosas. Si hay un mecanismo, en lugar de que la CPU pregunte cíclicamente si hay datos que vienen, el hardware recibe automáticamente los datos e informa automáticamente a la CPU cuando se reciben los datos, y luego la CPU lee los datos. De esta manera, antes de recibir los datos, la CPU puede hacer otras cosas y la eficiencia del trabajo mejora naturalmente. En el hardware de la CPU, esta función se realiza a través del mecanismo de interrupción. Cada hardware periférico en el chip proporciona una señal de interrupción. Cuando el módulo procesa un estado de trabajo específico, se producirá una señal de interrupción para comunicarse con la CPU.

  • Agregue algunas funciones de biblioteca interrumpidas
    Inserte la descripción de la imagen aquí

  • Eche un vistazo al diagrama esquemático de la placa de desarrollo.
    Los métodos de eventos de activación de interrupciones externas (interrupción): 1. Activador de borde ascendente 2. Activador de borde descendente 3.
    Inserte la descripción de la imagen aquí
    Activador de borde La clave correspondiente al día anterior es KEY1-> PA0 , KEY2-> PD2, KEY3-> PC12, haga clic en KEY1 para ser de nivel alto, KEY2 y KEY3 son respectivamente de nivel bajo.
    Disparadores de alto nivel en el borde ascendente, disparos de bajo nivel en el borde descendente

  • Seleccione la línea de interrupción externa EXTI
    Inserte la descripción de la imagen aquí
    STM32F4xx Chinese Reference Manual.pdf para obtener que PA0 de key1 corresponde a EXTI0, PD2 de key2 corresponde a EXTI2 y PC12 de key3 corresponde a EXTI12

  • Controlador de configuración del sistema (SYSCFG) El
    controlador de configuración del sistema se utiliza principalmente para administrar la reasignación de direcciones del área de almacenamiento del código ejecutable, seleccionar la interfaz Ethernet PHY
    y administrar la conexión de línea de interrupción externa del GPIO.
    A menos que se especifique lo contrario, esta sección se aplica a toda la serie STM32F4xx.

  • Primero inicialice el LED, así no escribiré más. Si tiene uno el primer día, puede verificarlo si no lo tiene, entonces Exit_Init se inicializa.

/*******************************************************
*函数名:Exit_Init
*功  能:中断初始化
*参  数:无
*返  回:无
*备  注:注意开启PA0,PD2的PC12的映射SYSCFG时钟 ,使能外部中断
********************************************************/
void Exit_Init(void)
{
    
    		
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//开启SYSCFG时钟,简称重映射 
		EXTI_InitTypeDef  Exit_Key1,Exit_Key2,Exit_Key3;//定义外部中断结构体变量	
//		//key1
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //映射到PA0引脚到EXTI
		Exit_Key1.EXTI_Line = EXTI_Line0; //选择EXTI0
		Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
		Exit_Key1.EXTI_Trigger = EXTI_Trigger_Rising;//选择上升沿触
		Exit_Key1.EXTI_LineCmd = ENABLE;//启用EXTI0
		EXTI_Init(&Exit_Key1);//写入EXTI初始化
	  	NVIC_EnableIRQ(EXTI0_IRQn);//使能外部中断0线进行工作
		//key2
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource2); //映射到PD2引脚到EXTI2	
		Exit_Key2.EXTI_Line = EXTI_Line2; //选择EXTI2
		Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
		Exit_Key2.EXTI_Trigger = EXTI_Trigger_Falling;//选择下升沿触
		Exit_Key2.EXTI_LineCmd = ENABLE;启用EXTI2
		EXTI_Init(&Exit_Key2);//写入EXTI初始化
	  	NVIC_EnableIRQ(EXTI2_IRQn);//使能外部中断2线进行工作
		//key3
		SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource12); //映射到PC12引脚到EXTI3	
		Exit_Key3.EXTI_Line = EXTI_Line12; //选择EXTI12
		Exit_Key3.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
		Exit_Key3.EXTI_Trigger = EXTI_Trigger_Falling;//选择下升沿触
		Exit_Key3.EXTI_LineCmd = ENABLE;//启用EXTI3
		EXTI_Init(&Exit_Key3);//写入EXTI初始化
	  	NVIC_EnableIRQ(EXTI15_10_IRQn);//由于没有EXTI12,所以使能外部中断15_10线进行工作		
}
  • (Se acerca el principal, se acerca) Presione la tecla para interrumpir y haga clic para controlar la luz led para encender y apagar
/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键一中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI1_flag;

void EXTI0_IRQHandler(void)//由中断自动触发
{
    
    
		 
		EXTI_ClearFlag(EXTI_Line0); //挂起寄存器PA0
		EXTI1_flag++;
		if(EXTI1_flag%2)
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);
		else 
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键二中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI2_flag;
void EXTI2_IRQHandler(void)//由中断自动触发
{
    
    
		EXTI_ClearFlag(EXTI_Line2); //挂起寄存器PD2
		EXTI2_flag++;
		if(EXTI2_flag%2)
		GPIO_ResetBits(GPIOC,GPIO_Pin_10);
		else 
		GPIO_SetBits(GPIOC,GPIO_Pin_10);
		
}

/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键三中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI3_flag;

void EXTI15_10_IRQHandler(void)
{
    
    
			EXTI3_flag++;
			if(EXTI3_flag%2)
			GPIO_ResetBits(GPIOC,GPIO_Pin_11);
			else 
			GPIO_SetBits(GPIOC,GPIO_Pin_11);
			EXTI_ClearFlag(EXTI_Line12);  //挂起寄存器PC2
}
  • La función principal llama a funciones relacionadas.
LEDInit();//LED初始化
Exit_Init();//中断初始化
while(1)
	{
    
    
			//是不是很激动,这里什么都不用写,哈哈
	}

En este punto, la interrupción clave se realiza perfectamente. Haga clic para controlar la luz LED para encender y apagar. Finalmente, gracias a todos por leer. Si necesitan otra información relacionada, por favor contácteme

Supongo que te gusta

Origin blog.csdn.net/weixin_45247466/article/details/114414069
Recomendado
Clasificación