[STM32] Biblioteca HAL: use la máquina de estado para detectar botones

[Registro de aprendizaje] Registro de aprendizaje STM32 (3) El botón controla la luz LED . En esta aplicación, el rebote del botón adopta el método de retraso del software, y la función de interfaz HAL_Delay() se utiliza para el retraso. Este método de eliminación de retardo ocupará el tiempo de ejecución del procesador.Durante el proceso de retardo, el procesador no puede procesar otros asuntos, lo que reduce la tasa de utilización del procesador.

En el desarrollo y la aplicación reales de la ingeniería, el método de combinación de la máquina de estado y la interrupción de temporización se usa generalmente para completar la detección de claves.

Una máquina de estados es un concepto abstracto, lo que significa que un proceso se abstrae en transiciones entre varios estados, y existen ciertas conexiones entre estos estados. La máquina de estado incluye principalmente cuatro elementos:

1. Estado actual: se refiere al estado actual.

2. Condición: cuando se cumple una condición, se activará una acción o se realizará una transición de estado.

3. Acción: la operación específica que se realizará después de que se cumpla la condición. Una vez que se ejecuta la acción, puede migrar a un nuevo estado o puede permanecer en el estado original. No se requieren acciones. Cuando se cumplen las condiciones, puede migrar directamente al nuevo estado sin realizar ninguna acción.

4. Segundo estado: el nuevo estado al que se moverá después de que se cumpla la condición. El "estado secundario" es relativo al "estado actual". Cuando se activa el "estado secundario", se transformará en un nuevo "estado actual".

Comprensión de cuatro elementos: la máquina de estado ejecuta repetidamente una acción en el estado actual (estado actual) y detecta continuamente las condiciones para saltar al estado. Cuando una determinada condición se cumple repentinamente, comienza a ingresar al siguiente estado (estado secundario) y repite otras acciones. El estado secundario en este momento se convierte en el estado presente.

Pasos de programación de la máquina de estado: 1. Analizar los requisitos funcionales del producto y extraer el estado 2. Dibujar el diagrama de estado, aclarar la relación de cambio de estado y marcar las condiciones para la transición de estado 3. Aclarar las funciones que se realizarán en el máquina de estado 4. Escribir código.

Una máquina de estado general se implementa mediante una declaración de rama de conmutación.

Para el monitoreo de botones, consideramos un solo botón como un sistema simple, analizamos la acción del botón y el proceso de confirmación del botón de acuerdo con todo el proceso de trabajo del botón, usamos el diagrama de transición de estado para representarlo y luego escribimos el programa de aplicación de acuerdo con el diagrama de estado.

De acuerdo con el principio de la máquina de estados, podemos abstraer el proceso del botón en tres estados:

Estado de botón arriba: el botón no está presionado.

Estado de rebote clave: elimina el movimiento de la tecla.

Botón esperando estado de liberación: Esperando a que se suelte el botón.

El proceso de transición de estado específico es el siguiente:

Cuando se levanta la tecla, si la señal de la tecla es válida (el pin de control de la tecla lee un nivel activo), cambiará al estado de rebote de la tecla y comenzará a prepararse para eliminar la fluctuación de la tecla. Si la señal del botón no es válida, mantenga el estado actual sin cambios.

Cuando está en el estado de rebote del botón, si la señal del botón es válida, indica que se eliminó el movimiento del botón, el botón está en un estado cerrado estable y se puede obtener el número blanco (descodificación de tecla) correspondiente al botón actual, y cambiará al estado de espera de liberación del botón. Si la señal del botón no es válida, significa que la señal del botón anterior puede ser una señal de interferencia, y debería volver al estado de botón arriba.

Cuando la tecla está esperando a ser liberada, si la señal de la tecla es válida, significa que la tecla todavía está en el estado presionado y no se realiza ningún cambio de estado. Si la señal del botón no es válida, indica que el botón se ha soltado y debe pasar al estado de botón levantado. Hasta ahora, se ha completado todo el proceso de detección de una clave.

El proceso de transición de estado y las condiciones de transición de los botones se muestran en la siguiente figura.

Contenido del experimento: use la idea de diseño de la máquina de estado para escribir un programa de procesamiento de botones y realice una operación después de presionar el botón: cambiar el estado de LED1.

Ideas de diseño de experimentos:

  • Diseñe un tipo de datos de estado clave KEY_STATE, que se realiza mediante el tipo de enumeración, que incluye tres miembros de enumeración KEY_UP indica el estado de activación de la clave, KEY_DEBOUNCE indica el estado de rebote de la clave KEY_WAIT_RELEASE indica el estado de espera de liberación de la clave.
  • Diseñe una función de escaneo de teclas KeyScan(), use el lenguaje de múltiples ramas Switch-Case y realice la conversión del estado de la tecla detectando el nivel del pin de la tecla.
  • Use el temporizador para generar una interrupción regular de 10 ms y llame a la función de escaneo de teclas en la rutina de servicio de interrupción regular. La función de escaneo de teclas se llama cada 10 ms, este intervalo de tiempo se puede usar para eliminar la fluctuación de teclas y mejorar la utilización de la CPU.
  • Adopte el modo de programación front-end y back-end. Establezca una variable de bandera KeyFlag, establezca KeyFlag por la interrupción del temporizador. El programa en segundo plano detecta continuamente KeyFlag en el ciclo while (1) y, si es cierto, ejecuta la tarea de procesamiento de claves.

Configuración periférica experimental

Usa el explorador de átomos puntuales.

 

 

  1. Abra CubeMX para la configuración y seleccione stm32F407ZGT6 para la configuración del pin correspondiente. El pin PE4 está configurado en GPIO_Input y el pin PF10 está configurado en GPIO_Output.
  2. Realizar la configuración del árbol del reloj

      

     3. Configurar el temporizador y activar tim1 (se pueden seleccionar otros)

     4. Generar código

codigo experimental

1. Diseño de tipos de datos, definición de variables y declaración de funciones

/* USER CODE BEGIN PTD */
typedef enum{
	KEY_UP,						//按键抬起
	KEY_DEBOUNCE,			//按键消抖
	KEY_WAIT_RELEASE	//按键等待释放
}KEY_STATE;
/* USER CODE END PTD */

/* USER CODE BEGIN PV */
KEY_STATE KeyState=KEY_UP;//按键状态,设置按键抬起为初试状态
uint8_t KeyFlag=0;				//按键有效检测标识符,0无效,1有效
/* USER CODE END PV */

/* USER CODE BEGIN PFP */
void KeyScan();//按键扫描函数声明
/* USER CODE END PFP */

2. Manejador de botones 

/* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim1);//启动定时器1,使能定时器1中断
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		if(KeyFlag)
		{
			KeyFlag=0;
			HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 3. Escáner de llaves

/* USER CODE BEGIN 4 */
void KeyScan()
{
	switch(KeyState)
	{
		case KEY_UP:
		{
			//读到低电平,转换到按键消除状态
			if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET)
			{
				KeyState=KEY_DEBOUNCE;
			}
			break;
		}
		case KEY_DEBOUNCE:
		{
			//读到低电平,转换到按键等待释放状态,并设置按键有效标识
			if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET)
			{
				KeyState=KEY_WAIT_RELEASE;
				KeyFlag=1;
			}
			//读到高电平,说明是干扰信号,转换到按键抬起状态
			else
			{
				KeyState=KEY_UP;
			}
			break;
		}
		case KEY_WAIT_RELEASE:
		{
			//读到高电平,说明按键释放,转换到按键抬起状态
			if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_SET)
			{
				KeyState=KEY_UP;
			}
			break;
		}
		default:break;
	}
}
/* USER CODE END 4 */

 4. Función de devolución de llamada de interrupción del temporizador

/* USER CODE BEGIN 0 */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  if(htim->Instance==htim1.Instance)

       {

              KeyScan();

       }

}

/* USER CODE END 0 */

Acho que você gosta

Origin blog.csdn.net/weixin_45015121/article/details/129866250
Recomendado
Clasificación