STM32F4. Урок 2 - натиснення кнопки

На плате STM32F4Discovery установлена кнопка, которую может использовать пользователь. С помощью библиотеки, описанной в статье, можно опрашивать состояние кнопки. Расширяя таблицу в файле  «stm32_ub_button.c» (речь идет о BUTTON_t BUTTON[] – примечание переводчика) можно опрашивать состояние нескольких кнопок. В библиотеке версии 1.1  в файле «stm32_ub_button.h», может быть включена функция защиты от дребезга контактов, которая использует таймер. В библиотеке используются функции  "OnPressed", "OnClick" и "OnReleased" которые возвращают  "true", когда происходит событие.

Пользовательская кнопка подключена к выводу PA0.

Требования:

  • Подключаемые модули CooCox-IDE : GPIO, (TIM, MISC).
  • Поддерживаемые библиотеки: отсутствуют.

Перечисления:

typedef enum 
{
  BTN_USER = 0    // BTN1 на STM32F4-Discovery
}BUTTON_NAME_t;

typedef enum {
  BTN_RELEASED = 0,  // Кнопка не нажата
  BTN_PRESSED        // Кнопка нажата
}BUTTON_STATUS_t;

Функции:

void UB_Button_Init(void);  // Инициализация кнопок
BUTTON_STATUS_t UB_Button_Read(BUTTON_NAME_t btn_name);  // Считать состояние кнопки (без фильтрации дребезга)
bool UB_Button_OnPressed(BUTTON_NAME_t btn_name);  // "True", при нажатии кнопки (защита от дребезга)
bool UB_Button_OnClick(BUTTON_NAME_t btn_name);  // "True", при кратковременном нажатии (защита от дребезга)
bool UB_Button_OnRelease(BUTTON_NAME_t btn_name);  // "True", при отпускании кнопки (защита от дребезга)

Пример использования:

//--------------------------------------------------------------
// File     : main.c
// Date     : 07.10.2013
// Version  : 1.1
// Author   : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Function : Demo of Button Library
// Reference: These two files must be written to 8MHz
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------

#include "main.h"
#include "stm32_ub_button.h"
#include "stm32_ub_led.h"

int main(void)
{
  SystemInit(); // Инициализация настроек кварца

  UB_Button_Init(); // Инициализация кнопок
  UB_Led_Init();    // Инициализация светодиодов

  UB_Led_On(LED_GREEN); // Включение зеленого светодиода

  while(1)
  {
    // Проверка нажатия кнопок
	if(UB_Button_Read(BTN_USER)==BTN_PRESSED) {
      UB_Led_On(LED_RED);  // Включение красного светодиода
	}
	else {
      UB_Led_Off(LED_RED); // Выключение красного светодиода
	}

	// Проверка отпускания кнопки
	if(UB_Button_OnClick(BTN_USER)==true) {
      UB_Led_Toggle(LED_BLUE); // Переключение синего светодиод
	}

  }
}

Режим работы:

Зеленый светодиод горит постоянно.
Красный светодиод горит, пока не будет нажата кнопка.
Синий светодиод переключается при нажатии кнопки.

Библиотека, использованная в примере: stm32_ub_button, stm32_ub_led.

Увеличение числа кнопок:

Если вы собираетесь использовать большее число кнопок, необходимо сделать следующее:

  1. В файле «stm32_ub_button.h» все кнопки должны быть перечислены в списке "BUTTON_NAME_t" и "BUTTON_ANZ" изменено в соответствии с количеством кнопок.
  2. В файле «stm32_ub_button.h» в "BUTTON_t" для всех кнопок необходимо указать порты и номера выводов.

В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.

Оригинал статьи

Прикрепленные файлы:

Top