- MyLibs - максимально платформонезависимые библиотеки (кроме разве что RTT) - RTT - STM32_General - библиотеки для периферии stm32
237 lines
8.9 KiB
C
237 lines
8.9 KiB
C
/**
|
||
**************************************************************************
|
||
* @file general_gpio.h
|
||
* @brief Заголовочный файл для модуля инициализации портов и работы с ними.
|
||
**************************************************************************
|
||
* @defgroup MY_LIBS_GPIO GPIO Tools
|
||
* @ingroup MYLIBS_PERIPHERAL
|
||
* @brief Функции и макросы для удобной работы с GPIO.
|
||
* @details
|
||
Модуль предоставляет универсальные инструменты для работы с GPIO):
|
||
- @ref MYLIBS_GPIO_GENERAL — инициализация и общие функции работы с портами.
|
||
- @ref MYLIBS_GPIO_SWITCH — работа с GPIO как с кнопкой: чтение состояния,
|
||
фильтрация дребезга, настройка активного уровня.
|
||
- @ref MYLIBS_GPIO_LEDS — работа с GPIO как со светодиодом: включение,
|
||
выключение, моргание и плавное затухание.
|
||
|
||
*************************************************************************/
|
||
#ifndef __GPIO_GENERAL_H_
|
||
#define __GPIO_GENERAL_H_
|
||
|
||
#include "mylibs_defs.h"
|
||
|
||
/**
|
||
* @addtogroup GPIO_INIT Init defines
|
||
* @ingroup MYLIBS_GPIO_GENERAL
|
||
* @brief Настройка состояний кнопок и количества тиков в периоде ШИМ
|
||
* @{
|
||
*/
|
||
|
||
#ifndef local_time
|
||
#define local_time() HAL_GetTick() ///< Локальное время
|
||
#endif
|
||
|
||
#ifndef LED_PWM_TICKS
|
||
#define LED_PWM_TICKS 15 ///< Количество тиков в периоде ШИМ
|
||
#endif
|
||
|
||
#ifndef LED_ON
|
||
#define LED_ON 1 ///< Состояние пина для включения светодиода
|
||
#endif
|
||
#ifndef LED_OFF
|
||
#define LED_OFF 0 ///< Состояние пина для выключения светодиода
|
||
#endif
|
||
|
||
#ifndef SW_ON
|
||
#define SW_ON 1 ///< Состояние пина при нажатой кнопке
|
||
#endif
|
||
#ifndef SW_OFF
|
||
#define SW_OFF 0 ///< Состояние пина при отжатой кнопке
|
||
#endif
|
||
|
||
/** GPIO_INIT
|
||
* @}
|
||
*/
|
||
|
||
|
||
/**
|
||
* @brief Режимы работы светодиода
|
||
* @ingroup MYLIBS_GPIO_LEDS
|
||
*/
|
||
typedef enum
|
||
{
|
||
LED_IS_OFF = 0, ///< Светодиод выключен
|
||
LED_IS_ON = 1, ///< Светодиод включен
|
||
LED_IS_BLINKING = 2, ///< Моргание светодиодом
|
||
LED_IS_FADING = 3, ///< Плавное моргание светодиодом
|
||
}GPIO_LEDStateTypeDef;
|
||
|
||
/**
|
||
* @brief Структура светодиода
|
||
* @ingroup MYLIBS_GPIO_LEDS
|
||
*/
|
||
typedef struct
|
||
{
|
||
GPIO_LEDStateTypeDef state; ///< Текущий режим работы светодиода
|
||
|
||
GPIO_TypeDef *LED_Port; ///< GPIO порт ножки светодиода
|
||
uint32_t LED_Pin; ///< GPIO пин ножки светодиода
|
||
|
||
uint8_t LED_ActiveLvl; ///< Активный уровень ножки (при котором светодиод горит)
|
||
uint32_t LED_Period; ///< Период моргания светодиода
|
||
|
||
uint32_t tickprev;
|
||
}GPIO_LEDTypeDef;
|
||
|
||
/**
|
||
* @brief Структура кнопки
|
||
* @ingroup MYLIBS_GPIO_SWITCH
|
||
*/
|
||
typedef struct
|
||
{
|
||
GPIO_TypeDef *Sw_Port; ///< GPIO порт ножки кнопки
|
||
uint32_t Sw_Pin; ///< GPIO пин ножки кнопки
|
||
|
||
uint8_t Sw_ActiveLvl; ///< Активный уровень ножки (при котором кнопка нажата)
|
||
uint32_t Sw_PrevState; ///< Предыдущее состояние кнопки
|
||
uint32_t Sw_FilterDelay; ///< Фильтр от дребезга (в мс)
|
||
|
||
uint32_t tickprev;
|
||
}GPIO_SwitchTypeDef;
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////
|
||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||
/**
|
||
* @addtogroup MYLIBS_GPIO_GENERAL General tools
|
||
* @ingroup MY_LIBS_GPIO
|
||
* @brief Общие функции/макросы для работы с GPIO
|
||
* @par Пример использования:
|
||
@code
|
||
// Включаем тактирование порта GPIOA
|
||
GPIO_Clock_Enable(GPIOA);
|
||
@endcode
|
||
* @{
|
||
*/
|
||
|
||
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx);
|
||
|
||
/** MYLIBS_GPIO_GENERAL
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @addtogroup MYLIBS_GPIO_SWITCH Switch tools
|
||
* @ingroup MY_LIBS_GPIO
|
||
* @brief Функции для работы с GPIO, как с кнопкой
|
||
* @par Пример использования:
|
||
@code
|
||
MX_GPIO_Init(); // инициализация пина аппаратная
|
||
|
||
// Инициализация кнопки на порте GPIOB, пин 0, активный уровень 1
|
||
GPIO_SwitchTypeDef sw1;
|
||
GPIO_Switch_Init(&sw1, GPIOB, GPIO_PIN_0, 1); // или дефайн SW_ON/SW_OFF
|
||
|
||
// Считываем состояние кнопки
|
||
if(GPIO_Read_Switch(&sw1))
|
||
{
|
||
// Кнопка нажата
|
||
LED_ON();
|
||
}
|
||
else
|
||
{
|
||
// Кнопка отжата
|
||
LED_OFF();
|
||
}
|
||
@endcode
|
||
* @{
|
||
*/
|
||
|
||
/* Инициализировать кнопку (структуру кнопки) */
|
||
HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State);
|
||
/* Считать состоянии кнопки запуска */
|
||
int GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart);
|
||
|
||
/** MYLIBS_GPIO_SWITCH
|
||
* @}
|
||
*/
|
||
|
||
|
||
/**
|
||
* @addtogroup MYLIBS_GPIO_LEDS LED tools
|
||
* @ingroup MY_LIBS_GPIO
|
||
* @brief Функции для работы с GPIO, для управления светодиодом
|
||
* @par Пример использования:
|
||
@code
|
||
MX_GPIO_Init(); // инициализация пина аппаратная
|
||
|
||
// Инициализация светодиода на порте GPIOA, пин 5, активный уровень 0
|
||
GPIO_LEDTypeDef led;
|
||
GPIO_LED_Init(&led, GPIOA, GPIO_PIN_5, 0); // или дефайн LED_ON/LED_OFF
|
||
|
||
// Включение светодиода
|
||
GPIO_LED_On(&led);
|
||
|
||
// Запуск моргания
|
||
GPIO_LED_Blink_Start(&led, 500); // Период 500 мс
|
||
|
||
// В основном цикле
|
||
while (1) {
|
||
GPIO_LED_Dynamic_Handle(&led);
|
||
}
|
||
@endcode
|
||
* @{
|
||
*/
|
||
|
||
/* Инициализировать светодиод (структуру светодиода) */
|
||
HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State);
|
||
/* Включить светодиод */
|
||
HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led);
|
||
/* Выключить светодиод */
|
||
HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led);
|
||
/* Выставить светодиод по переменной */
|
||
HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state);
|
||
/* Активировать моргание светодиодом */
|
||
HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period);
|
||
/* Активировать моргание светодиодом */
|
||
HAL_StatusTypeDef GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period);
|
||
/* Управление динамическими режимами свечения светодиода */
|
||
void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led);
|
||
|
||
/** MYLIBS_GPIO_LEDS
|
||
* @}
|
||
*/
|
||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||
|
||
|
||
/**
|
||
* @cond GPIO_INTERNAL
|
||
*/
|
||
|
||
// /**
|
||
// * @brief Маппинг альтернативной функции SPI между GPIO
|
||
// * @ingroup MYLIBS_GPIO_GENERAL
|
||
// */
|
||
// #define SPI_Alternate_Mapping(INSTANCE) \
|
||
// ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
|
||
// (((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
|
||
// (((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
|
||
// (((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
|
||
// (0))
|
||
|
||
|
||
/**
|
||
* @brief Маппинг альтернативной функции TIM между GPIO
|
||
* @ingroup MYLIBS_GPIO_GENERAL
|
||
*/
|
||
#define GPIO_TIM_Alternate_Mapping(INSTANCE) \
|
||
((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
|
||
(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
|
||
(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
|
||
(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
|
||
(0))
|
||
|
||
|
||
/** @endcond */
|
||
|
||
#endif // __GPIO_GENERAL_H_
|