STM32_ExtendedLibs/MyLibs/Inc/mylibs_defs.h
Razvalyaev 141ea6bac9 Переструктурирование:
- MyLibs - максимально платформонезависимые библиотеки (кроме разве что RTT)
- RTT
- STM32_General - библиотеки для периферии stm32
2025-10-21 05:03:54 +03:00

206 lines
9.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
**************************************************************************
* @file mylibs_defs.h
* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral.
**************************************************************************
* @defgroup MYLIBS_DEFINES General Tools
* @ingroup MYLIBS_ALL
* @brief Общие макросы и typedef'ы, используемые по всему проекту
*
*************************************************************************/
#ifndef __MYLIBS_DEFINES_H_
#define __MYLIBS_DEFINES_H_
#include "mylibs_config.h"
/***************************************************************************
******************************ERROR_HANDLER********************************/
/**
* @addtogroup ERROR_HANDLER_DEFINES Error Handler defines
* @ingroup MYLIBS_DEFINES
* @brief Дефайны для обработки ошибок
* @{
*/
/* extern Error_Handler from main.h */
extern void Error_Handler(void);
/**
* @brief Error_Handler который будет вызыватся в библиотеке
*/
#define MyLibs_Error_Handler(params) Error_Handler(params)
/* If error handler not defined - set void */
#ifndef MyLibs_Error_Handler
#define MyLibs_Error_Handler(...)
#endif // MyLibs_Error_Handler
/** @brief Проверить один указатель на NULL */
#define check_null_ptr_1(p1) (p1 == NULL)
/** @brief Проверить два указателя на NULL */
#define check_null_ptr_2(p1, p2) ((p1 == NULL) || (p1 != NULL && p2 == NULL))
/** @brief Проверить три указателя на NULL */
#define check_null_ptr_3(p1, p2, p3) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
/** @brief Проверить четыре указателя на NULL */
#define check_null_ptr_4(p1, p2, p3, p4) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
/** @brief Проверить пять указателей на NULL */
#define check_null_ptr_5(p1, p2, p3, p4, p5) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL))))))))
/** ERROR_HANDLER_DEFINES
* @}
*/
/***************************************************************************
******************************DELAYS_DEFINES*******************************/
/**
* @addtogroup DELAYS_DEFINES Delays defines
* @ingroup MYLIBS_DEFINES
* @brief Макросы и определения для работы с задержками в миллисекундах.
* @details
* Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS:
* - @ref msDelay — простая задержка заданной длительности;
* - @ref msDelayStart — сохранение текущего времени начала задержки;
* - @ref msDelayWhileActive — проверка, активна ли задержка;
* - @ref msDelayWaitDone — проверка, завершена ли задержка.
* Эти макросы удобны для реализации неблокирующих задержек.
* @{
*/
/**
* @def msDelay(_ms_)
* @brief Блокирующая задержка на указанное количество миллисекунд.
* @param _ms_ Время задержки в миллисекундах.
* @note Использует задержку через @ref local_time или osDelay в зависимости от @ref FREERTOS_DELAY.
*/
#ifdef FREERTOS_DELAY
#define msDelay(_ms_) osDelay(_ms_)
#else
#define msDelay(_ms_) \
do { \
uint32_t _start_ = local_time(); \
while (local_time() - _start_ < (_ms_)) {} \
} while(0)
#endif
/**
* @brief Начать отсчет задержки.
* @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта.
* @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд
* с момента запуска системы (@ref local_time).
*
* Используется для реализации неблокирующих задержек.
*/
#define msDelayStart(_pvar_) *(_pvar_) = local_time()
/**
* @brief Проверяет, активна ли задержка.
* @param _ms_ Длительность задержки в миллисекундах.
* @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart).
* @retval 1 Задержка еще активна.
* @retval 0 Задержка завершена.
* @details
* Возвращает true, пока время задержки не истекло. Используется в проверках,
* когда нужно **действовать, пока задержка выполняется**. Пример:
* @code
* while(msDelayWhileActive(1000, &tick)) {
* // выполняем другие задачи, задержка не блокирует поток
* }
* @endcode
*/
#define msDelayWhileActive(_ms_, _pvar_) (local_time() - *(_pvar_) < _ms_)
/**
* @brief Проверяет, завершилась ли задержка.
* @param _ms_ Длительность задержки в миллисекундах.
* @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart).
* @retval 1 Задержка завершена.
* @retval 0 Задержка еще активна.
* @details
* Возвращает true, когда задержка уже завершена. Используется в проверках,
* когда нужно **выполнить действие только после окончания задержки**. Пример:
* @code
* if(msDelayWaitDone(1000, &tick)) {
* // выполняем действие после завершения задержки
* }
* @endcode
*/
#define msDelayWaitDone(_ms_, _pvar_) (local_time() - *(_pvar_) >= _ms_)
/** DELAYS_DEFINES
* @}
*/
/***************************************************************************
*******************************UTIL_DEFINES********************************/
static int dummy;
/**
* @addtogroup UTILS_DEFINES Utils defines
* @ingroup MYLIBS_DEFINES
* @brief Общие вспомогательные макросы
* @{
*/
/**
* @brief Обнуление структуры.
* @param _struct_ Структура, которую нужно обнулить.
* @details Макрос использует memset для обнуления всей памяти структуры.
* Используется для быстрой и безопасной инициализации переменных структур до нуля.
*/
#define ClearStruct(_struct_) memset(&(_struct_), 0, sizeof(_struct_))
/**
* @brief Деление с округлением вверх
* @param _val_ Делимое.
* @param _div_ Делитель.
* @return Результат деления, округленный вверх.
* @details Если результат деления без остатка: он возвращается как есть
Если с остатком - округляется вверх
*/
//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
/**
* @brief Swap between Little Endian and Big Endian
* @param v Исходное 16-битное значение.
* @return Результат с поменяными местами старшим и младшим байтом.
* @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
*/
#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
/**
* @brief Абсолютное значение числа
* @param x Число.
* @return Абсолютное значение числа x.
* @details Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
*/
#define ABS(x) ( ((x) > 0)? (x) : -(x))
/** UTILS_DEFINES
* @}
*/
/**
* @cond LIBS_INTERNAL
*/
/**
* @brief Аналог HAL макроса для привязки DMA к UART.
* @note @ref __HAL_LINKDMA.
*/
#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
do{ \
(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \
(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
/** @endcond */
#endif //__MYLIBS_DEFINES_H_