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 и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.