Урок 14. Создание и использование библиотек для STM32. Библиотека Debounce.

Уроки STM32

В уроке научимся создавать пользовательские библиотеки на примере класса Debounce. Также я расскажу, как применять в проекте готовые библиотеки.

Предыдущий урок     Список уроков     Следующий урок

В предыдущем уроке мы разработали класс Debounce для обработки дискретных сигналов. С помощью него можно устранять дребезг контактов, фильтровать сигнал, ослаблять влияние электромагнитных помех и т.п.

 

Класс отлажен, проверен, закончен. Но использовать его в других программах достаточно неудобно. Главная проблема – необходимо копировать исходный код класса в новую программу. При этом можно ошибиться и долго отлаживать давно проверенный и забытый код. Ну и, конечно, ненужный код будет загромождать текст программы, ухудшать читаемость.

Выход очевиден – оформить класс библиотекой. Давайте этим и займемся.

 

Последовательность действий для создания библиотеки STM32.

Библиотека, по крайней мере, на нашем уровне программирования, это тот же класс, только размещенный в других файлах. В текст программы файлы библиотеки включаются директивой препроцессора #include. Таким образом, текст библиотеки в нашей программе мы не видим. А на этапе компиляции он “подсовывается” компилятору директивой #include . И благополучно транслируется вместе с остальным исходным кодом.

Я скопировал проект предыдущего урока Lesson13_1 в новую папку Lesson14.

Переименовал его в Lesson14_1.

Открыл в Atollic TrueStudio и переименовал его в IDE еще раз. Все это мы уже делали.

Atollic TrueStudio

Получился проект с классом Debounce из предыдущего урока. Этот класс мы будем оформлять библиотекой.

Библиотека состоит как минимум из двух файлов:

  • заголовочного файла, с расширением .h ;
  • файла исходного текста, расширение .cpp.

Заголовочный файл должен содержать описание класса, объявление переменных, константы. Программный код в нем не размещают.

Второй файл (.cpp) содержит код методов класса.

Давайте создадим файлы библиотеки. Чтобы в структуре проекта не было путаницы, создадим для всех пользовательских библиотек папку Libraries. А в ней папку Debounce, уже для нашей библиотеки.

Правой кнопкой мыши нажимаем на имя проекта, New -> Folder.

Создание новой папки

Задаем имя папки Libraries.

Теперь нажимаем на Libraries, New -> Folder.

Создаем папку Debounce.

Теперь выбираем папку Debounce, New -> File.

Создаем в ней файлы Debounce.h  и Debounce.cpp.

IDE

 

Заголовочный файл Debounce.h.

Неплохо в начале файла поместить краткую информацию о библиотеке. У кого, на что хватит фантазии. Естественно, надо оформить этот блок комментариями.

/*
* Debounce.h - библиотека обработки дискретных сигналов STM32.
*
* Может быть использована для устранения дребезга контактов, цифровой фильтрации сигналов от помех.
*
* Работает в фоновом режиме.
*
* В параллельном процессе регулярно должен вызываться один из методов обработки:
*
* void scanStability(void); // метод ожидания стабильного состояния сигнала
* void scanAverage(void); // метод фильтрации сигнала по среднему значению
*
* В результате формируются признаки состояния сигнала:
*
* uint8_t flagLow; // признак СИГНАЛ В НИЗКОМ УРОВНЕ
* uint8_t flagRising; // признак БЫЛ ПОЛОЖИТЕЛЬНЫЙ ФРОНТ
* uint8_t flagFalling; // признак БЫЛ ОТРИЦАТЕЛЬНЫЙ ФРОНТ
*
* Признаки могут быть прочитаны функциями:
*
* uint8_t readFlagLow(void); // чтение признака СИГНАЛ В НИЗКОМ УРОВНЕ
* uint8_t readFlagRising(void); // чтение признака БЫЛ ПОЛОЖИТЕЛЬНЫЙ ФРОНТ
* uint8_t readFlagFalling(void); // чтение признака БЫЛ ОТРИЦАТЕЛЬНЫЙ ФРОНТ
*
* Пример создания объекта:
* Debounce button(GPIOC, 1 << 11, 10); // экземпляр класса Debounce
*
* Подробно описана http://mypractic.ru/uroki-stm32 в уроках 12, 13, 14
*
* Разработана Калининым Эдуардом.
*
* http://mypractic.ru
*/

Дальше следует объявление класса, которое надо заключить в конструкцию.

/* Проверка, что библиотека не подключена */
#ifndef DEBOUNCE_H
#define DEBOUNCE_H

. . . . . . . . . . . . . . . . . . . 

#endif/* DEBOUNCE_H */

Это предотвратит повторное подключение библиотеки.

И еще необходимо подключить файл stm32f103xb.h. В нем содержатся CMSIS-имена регистров.

/* Проверка, что библиотека не подключена */
#ifndef DEBOUNCE_H
#define DEBOUNCE_H

#include "stm32f103xb.h"

class Debounce {

    . . . . . . . . .

};

#endif /* DEBOUNCE_H */

 

В файл Debounce.cpp мы копируем код методов. И в самом начале подключаем заголовочный файл. В нем содержится определение класса.

#include "Debounce.h"

//----------------- методы класса Debounce

. . . . . . . . . . . . . . .

 

Все библиотека создана. Теперь необходимо подключить ее.

Прежде всего, удаляем из main.cpp все то, что мы переместили в библиотечные файлы. А именно: объявление класса и код методов.

Подключаем нашу библиотеку.

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "../Libraries/Debounce/Debounce.h"

Мы указали полный путь к папке библиотеки.

Можно написать короче:

#include "Debounce.h"

Но тогда путь к папке необходимо сообщить компилятору:

Project -> Build Settings -> Tool Settings -> C++ Compiler -> Directories -> Add (зеленый плюсик сверху).

Atollic TrueStudio

В списке появится путь к нашей библиотеке

../Inc
../Libraries/Debounce
../Drivers/STM32F1xx_HAL_Driver/Inc
../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy
../Drivers/CMSIS/Device/ST/STM32F1xx/Include
../Drivers/CMSIS/Include

Еще вариант той же операции:

Правой кнопкой мыши нажимаем на папку Debounce в проекте, Add/Remove Include Path -> OK

В списке путей для include появится

"${workspace_loc:/${ProjName}/Libraries/Debounce}"

Транслируем проект. Получаем сообщения об ошибках компиляции.

Сообщение об ошибках

Компилятор не нашел коды для методов класса. Мы не сообщили ему, где находится файл Debounce.cpp.

Можно поместить этот  файл в папку Src. Компилятор привык там искать исходные тексты. Но мы не будем ломать стройности проекта.

Сделаем так: Project -> Build Settings -> C/C++ General -> Paths and Symbols -> Source Location -> Add Folder -> Libraries -> OK

Atollic TrueStudio

 

Другой способ, немного проще:

Правой кнопкой по Libraries, Properties -> C/C++ General -> Paths and Symbols -> Source Location -> Add Folder -> Apply

Свершилось. Теперь компилируется без ошибок.

Вот ссылка на полный проект:

  Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!  

 

Применение библиотеки.

Давайте в этом разделе научимся использовать готовые библиотеки. Повторим часть действий из первой половины урока.

Нам надо реализовать задачу – на каждое нажатие кнопки светодиод меняет свое состояние.

Мы собираемся воспользоваться готовой библиотекой Debounce.

Загружаем ее архив.

  Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!  

В нем 2 файла в папке Debounce.

С помощью STM32CubeMX создаем проект Lesson14_2.

  • Устанавливаем конфигурацию системы тактирования.
  • Вывод PB13 конфигурируем на активный выход.
  • Вывод PB12 (кнопка) не трогаем.

Конвертируем проект в C++.

Создаем папку Libraries и копируем в нее папку Debounce с файлами библиотеки.

Задаем в IDE путь к библиотеке. Правой кнопкой по Libraries, Properties -> C/C++ General -> Paths and Symbols -> Source Location -> Add Folder -> Apply

Открываем main.cpp.

Подключаем библиотеку Debounce.

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "../Libraries/Debounce/Debounce.h"

Создаем объект button.

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */

Debounce button(GPIOB, 1 << 12, 10); // экземпляр класса Debounce

Лучше запустить компиляцию, убедиться, что ошибок нет.

Теперь мы можем использовать объект button.

/* Infinite loop */
/* USER CODE BEGIN WHILE */

while (1)
{
    if(button.readFlagFalling() != 0)
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);

    button.scanAverage();
    HAL_Delay(1);
}

Все. Компилируем, загружаем в плату, проверяем.

Вот ссылка на проект:

  Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!  

Папку Libraries со своим библиотеками удобно копировать в проект целиком, а не выбирать нужные библиотеки. Не подключенные директивой #include файлы компилироваться не будут.

 

В следующем уроке будем работать с прерываниями по таймеру. Поговорим о параллельных процессах.

Предыдущий урок     Список уроков     Следующий урок

0

Автор публикации

не в сети 5 дней

Эдуард

68
Комментарии: 1362Публикации: 152Регистрация: 13-12-2015

4 комментария на «Урок 14. Создание и использование библиотек для STM32. Библиотека Debounce.»

  1. Invalid project path: Include path not found (LCD_I2C BOBR_STM32\#undef __ARM_FEATURE_SIMD32). да и ещё.Мне пишет ошибку.add folder-как добавить папку её не видно?

    0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *