/** ************************************************************************** * @file general_tim.h * @brief Заголовочный файл для модуля инициализации таймеров и работы с ними. ************************************************************************** * @defgroup MY_LIBS_TIM TIM Tools * @ingroup MYLIBS_PERIPHERAL * @brief Функции и макросы для удобной работы с TIM. * @details Модуль предоставляет универсальные инструменты для работы с TIM: - @ref MYLIBS_TIM_GENERAL — базовая инициализация таймеров и прерываний. - @ref MYLIBS_TIM_DELAY — функции задержки через таймеры (blocking и non-blocking). - @ref MYLIBS_TIM_OC — настройка каналов Output Compare и PWM. - @ref MYLIBS_TIM_ENCODER — работа с энкодерами, чтение положения и кнопки. * @note Требуется подключение модуля TIM в библиотеке HAL и GPIO (@ref MY_LIBS_GPIO) из MyLibs @code #define HAL_TIM_MODULE_ENABLED @endcode *************************************************************************/ #ifndef __TIM_GENERAL_H_ #define __TIM_GENERAL_H_ ///////////////////////////////////////////////////////////////////// /////////////////////////---USER SETTINGS---///////////////////////// /** * @addtogroup TIM_INIT Init defines * @ingroup MYLIBS_TIM_GENERAL * @brief Настройка таймеров * @{ */ #define HAL_TIM_MODULE_ENABLED #define USE_TIM1 ///< Включить TIM1 в @ref TIM_Base_MspInit #define USE_TIM2 ///< Включить TIM2 в @ref TIM_Base_MspInit #define USE_TIM3 ///< Включить TIM3 в @ref TIM_Base_MspInit #define USE_TIM4 ///< Включить TIM4 в @ref TIM_Base_MspInit #define USE_TIM5 ///< Включить TIM5 в @ref TIM_Base_MspInit #define USE_TIM6 ///< Включить TIM6 в @ref TIM_Base_MspInit #define USE_TIM7 ///< Включить TIM7 в @ref TIM_Base_MspInit #define USE_TIM8 ///< Включить TIM8 в @ref TIM_Base_MspInit #define USE_TIM9 ///< Включить TIM9 в @ref TIM_Base_MspInit #define USE_TIM10 ///< Включить TIM10 в @ref TIM_Base_MspInit #define USE_TIM11 ///< Включить TIM11 в @ref TIM_Base_MspInit #define USE_TIM12 ///< Включить TIM12 в @ref TIM_Base_MspInit #define USE_TIM13 ///< Включить TIM13 в @ref TIM_Base_MspInit #define USE_TIM14 ///< Включить TIM14 в @ref TIM_Base_MspInit /** TIM_INIT * @} */ /////////////////////////---USER SETTINGS---///////////////////////// #include "mylibs_defs.h" #include "general_gpio.h" ///////////////////////////////////////////////////////////////////// ////////////////////////////---DEFINES---//////////////////////////// #define TIM_IT_CONF_Pos 0 //#define TIM_PWM_CONF_Pos 1 //#define TIM_CLCK_SRC_CONF_Pos 2 //#define TIM_SLAVE_CONF_Pos 3 //#define TIM_MASTER_CONF_Pos 4 //#define TIM_BDTR_CONF_Pos 5 #define TIM_IT_CONF (1<<(TIM_IT_CONF_Pos)) //#define TIM_PWM_CONF (1<<(TIM_PWM_Pos)) ////////////////////////////---DEFINES---////////////////////////////] ///////////////////////////////////////////////////////////////////// ///////////////////////---STRUCTURES & ENUMS---////////////////////// /** * @brief Режим прерываний таймера * @ingroup MYLIBS_TIM_GENERAL */ typedef enum { TIM_DEFAULT = 0, ///< Прерываний отключены TIM_IT_MODE = TIM_IT_CONF, ///< Прерываний включены // TIM_PWM_MODE = TIM_PWM_ENABLE, // TIM_PWM_IT_MODE = TIM_PWM_ENABLE | TIM_IT_CONF, }TIM_ITModeTypeDef; /** * @brief Длительность тика таймера (частота тактирования таймера) * @ingroup MYLIBS_TIM_GENERAL * @details enum дает базовые длительности, но можно выставить другие * (напр 500 - 0.5 мс) */ typedef enum { TIM_Base_Disable = 0, ///< Таймер отключен TIM_TickBase_1US = 1, ///< Таймер тактируется с частотой 1 МГц TIM_TickBase_10US = 10, ///< Таймер тактируется с частотой 100 кГц TIM_TickBase_100US = 100, ///< Таймер тактируется с частотой 10 кГц TIM_TickBase_1MS = 1000, ///< Таймер тактируется с частотой 1 кГц TIM_TickBase_10MS = 10000, ///< Таймер тактируется с частотой 100 Гц TIM_TickBase_100MS = 100000, ///< Таймер тактируется с частотой 10 Гц }TIM_MHzTickBaseTypeDef; /** * @brief Структура инициализации таймера * @ingroup MYLIBS_TIM_GENERAL * @details * Содержит все базовые структуры, которые нужны для инициализации таймера. * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами * * Также высокоуровневые настройки частоты работы таймера. * Если какая-либо высокоуровневая настройка не задана, то * по возможности берется низкоуровневая настройка из структур */ typedef struct // struct with settings for custom function { TIM_HandleTypeDef htim; ///< HAL handle таймера TIM_ClockConfigTypeDef sClockSourceConfig; ///< Настройки тактирования таймера TIM_SlaveConfigTypeDef sSlaveConfig; ///< Настройки слейв режима таймера TIM_MasterConfigTypeDef sMasterConfig; ///< Настройки мастер режима таймера TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; ///< Настройки дедтаймов таймера TIM_ITModeTypeDef sTimMode; ///< Настройки прерывания таймера TIM_MHzTickBaseTypeDef sTickBaseUS; ///< Длительность одного тика uint8_t sTickBasePrescaler; ///< Дополнительный делитель, для удобного деления @ref sTickBaseUS float sTimAHBFreqMHz; ///< Частота шины тактирования таймера float sTimFreqHz; ///< Желаемая частота таймера }TIM_SettingsTypeDef; /** * @brief Структура инициализации енкодера * @ingroup MYLIBS_TIM_ENCODER * @details * Содержит все базовые структуры, которые нужны для инициализации таймера. * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами * * Также высокоуровневые настройки частоты работы таймера. * Если какая-либо высокоуровневая настройка не задана, то * по возможности берется низкоуровневая настройка из структур */ typedef struct // struct with variables for encoder { int16_t Encoder_Diff; ///< Считанная разница uint16_t Encoder_Shdw; ///< Последние считанные тики TIM_HandleTypeDef *htim; ///< Указатель на HAL handle таймера TIM_Encoder_InitTypeDef sConfig; ///< Указатель на структуру настройки энкодера GPIO_TypeDef *GPIOx; ///< Порт, куда подключается энкодер uint32_t GPIO_PIN_TI1; ///< Пин, куда подключается канал TI1 uint32_t GPIO_PIN_TI2; ///< Пин, куда подключается канал TI2 uint32_t GPIO_PIN_SW; ///< Пин, куда кнопка энкодера (если есть) GPIO_SwitchTypeDef Sw; ///< Структура кнопки }TIM_EncoderTypeDef; ///////////////////////---STRUCTURES & ENUMS---////////////////////// ///////////////////////////////////////////////////////////////////// ///////////////////////////---FUNCTIONS---/////////////////////////// /** * @addtogroup MYLIBS_TIM_GENERAL General tools * @ingroup MY_LIBS_TIM * @brief Функции для базовой инициализации таймеров * @par Пример использования: @code TIM_SettingsTypeDef tim2Settings; void TIM2_Init(void) { // Настройка таймера TIM2 на 1 кГц с прерываниями с шагом таймера 10 мкс tim2Settings.htim.Instance = TIM2; tim2Settings.sTimMode = TIM_IT_MODE; tim2Settings.sTickBaseUS = TIM_TickBase_10US; tim2Settings.sTickBasePrescaler = 1; tim2Settings.sTimFreqHz = 1000; // 1 кГц tim2Settings.sTimAHBFreqMHz = 72000000; // Hz if(TIM_Base_Init(&tim2Settings) != HAL_OK) { Error_Handler(); } } @endcode * @{ */ /* Initialize TIM with TIM_SettingsTypeDef structure */ HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim); /* Initialize TIMs clock and interrupt */ void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode); /* DeInitialize TIMs clock and interrupt */ void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim); /** MYLIBS_TIM_GENERAL * @} */ /** * @addtogroup MYLIBS_TIM_DELAY Delay tools * @ingroup MY_LIBS_TIM * @brief Функции для формирования задержек с помощью таймеров * @par Пример использования: @code TIM_HandleTypeDef htim2; // блокирующая задержка 500 тиков таймера LED_ON(); TIM_Delay(&htim2, 500); LED_OFF(); while(1) { // не блокирующая задержка 200 тиков таймера if(TIM_Delay_NonBlocking(&htim2, 200) == HAL_OK) { TIM_Delay_Start(&htim2); LED_TOOGLE(); } } @endcode * @{ */ /* Start delay via TIM */ HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim); /* Delay via TIM */ HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay); /* Wait Delay via TIM without blocking app */ HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay); /** MYLIBS_TIM_DELAY * @} */ /** * @addtogroup MYLIBS_TIM_OC PWM/OC Channels tools * @ingroup MY_LIBS_TIM * @brief Функции для инициализации базовых функций каналов таймера * @par Пример использования: @code void PWM_Channel_Init_Example(void) { TIM_HandleTypeDef htim3; TIM_OC_InitTypeDef sConfigOC; GPIO_TypeDef *GPIOx = GPIOB; uint32_t PWM_PIN = GPIO_PIN_0; // Настройка таймера и канала PWM TIM_Output_PWM_Init(&htim3, &sConfigOC, TIM_CHANNEL_1, GPIOx, PWM_PIN); // Настройка компаратора OC TIM_OC_Comparator_Init(&htim3, TIM_CHANNEL_1); } @endcode * @{ */ /* Initialize PWM Channel and GPIO for output */ HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN); /* Initialize OC Comparator */ HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL); /** MYLIBS_TIM_ENCODER * @} */ /** * @addtogroup MYLIBS_TIM_ENCODER Encoder tools * @ingroup MY_LIBS_TIM * @brief Функции для считывания энкодера * @par Пример использования: @code TIM_EncoderTypeDef henc1; TIM_HandleTypeDef htim4; // инициализация henc1.htim = &htim4; henc1.GPIOx = GPIOA; henc1.GPIO_PIN_TI1 = GPIO_PIN_0; henc1.GPIO_PIN_TI2 = GPIO_PIN_1; TIM_Encoder_Init(&henc1, &htim4); // считывание энкодера и кнопки int16_t delta = TIM_Encoder_Read(&henc1); setpoint_tmp += delta; if(TIM_Encoder_ReadSwitch(&henc1)) { setpoint = setpoint_tmp; // подтвердить новое значение } @endcode * @{ */ /* Initialize TIM Encoder functional */ HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim); /* Считать энкодер */ HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc); /* Считать кнопку энкодера */ int TIM_Encoder_ReadSwitch(TIM_EncoderTypeDef *henc); /** MYLIBS_TIM_ENCODER * @} */ ///////////////////////////---FUNCTIONS---/////////////////////////// #endif // __TIM_GENERAL_H_