MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
mylibs_defs.h
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file mylibs_defs.h
4* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral.
5**************************************************************************
6* @defgroup MYLIBS_DEFINES General Tools
7* @ingroup MYLIBS_ALL
8* @brief Общие макросы и typedef'ы, используемые по всему проекту
9*
10*************************************************************************/
11#ifndef __MYLIBS_DEFINES_H_
12#define __MYLIBS_DEFINES_H_
13
14#include "mylibs_config.h"
15
16/***************************************************************************
17******************************ERROR_HANDLER********************************/
18/**
19 * @addtogroup ERROR_HANDLER_DEFINES Error Handler defines
20 * @ingroup MYLIBS_DEFINES
21 * @brief Дефайны для обработки ошибок
22 * @{
23 */
24
25/* extern Error_Handler from main.h */
26extern void Error_Handler(void);
27
28/**
29 * @brief Error_Handler который будет вызыватся в библиотеке
30 */
31#define MyLibs_Error_Handler(params) Error_Handler(params)
32/* If error handler not defined - set void */
33#ifndef MyLibs_Error_Handler
34#define MyLibs_Error_Handler(...)
35#endif // MyLibs_Error_Handler
36
37/** @brief Проверить один указатель на NULL */
38#define check_null_ptr_1(p1) (p1 == NULL)
39
40/** @brief Проверить два указателя на NULL */
41#define check_null_ptr_2(p1, p2) ((p1 == NULL) || (p1 != NULL && p2 == NULL))
42
43/** @brief Проверить три указателя на NULL */
44#define check_null_ptr_3(p1, p2, p3) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
45
46/** @brief Проверить четыре указателя на NULL */
47#define check_null_ptr_4(p1, p2, p3, p4) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
48
49/** @brief Проверить пять указателей на NULL */
50#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))))))))
51
52/** ERROR_HANDLER_DEFINES
53 * @}
54 */
55
56
57/***************************************************************************
58******************************DELAYS_DEFINES*******************************/
59/**
60 * @addtogroup DELAYS_DEFINES Delays defines
61 * @ingroup MYLIBS_DEFINES
62 * @brief Макросы и определения для работы с задержками в миллисекундах.
63 * @details
64 * Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS:
65 * - @ref msDelay — простая задержка заданной длительности;
66 * - @ref msDelayStart — сохранение текущего времени начала задержки;
67 * - @ref msDelayWhileActive — проверка, активна ли задержка;
68 * - @ref msDelayWaitDone — проверка, завершена ли задержка.
69 * Эти макросы удобны для реализации неблокирующих задержек.
70 * @{
71 */
72
73/**
74 * @def msDelay(_ms_)
75 * @brief Блокирующая задержка на указанное количество миллисекунд.
76 * @param _ms_ Время задержки в миллисекундах.
77 * @note Использует задержку через @ref local_time или osDelay в зависимости от @ref FREERTOS_DELAY.
78 */
79#ifdef FREERTOS_DELAY
80 #define msDelay(_ms_) osDelay(_ms_)
81#else
82 #define msDelay(_ms_) \
83 do { \
84 uint32_t _start_ = local_time(); \
85 while (local_time() - _start_ < (_ms_)) {} \
86 } while(0)
87#endif
88
89
90/**
91 * @brief Начать отсчет задержки.
92 * @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта.
93 * @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд
94 * с момента запуска системы (@ref local_time).
95 *
96 * Используется для реализации неблокирующих задержек.
97 */
98#define msDelayStart(_pvar_) *(_pvar_) = local_time()
99
100/**
101 * @brief Проверяет, активна ли задержка.
102 * @param _ms_ Длительность задержки в миллисекундах.
103 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart).
104 * @retval 1 Задержка еще активна.
105 * @retval 0 Задержка завершена.
106 * @details
107 * Возвращает true, пока время задержки не истекло. Используется в проверках,
108 * когда нужно **действовать, пока задержка выполняется**. Пример:
109 * @code
110 * while(msDelayWhileActive(1000, &tick)) {
111 * // выполняем другие задачи, задержка не блокирует поток
112 * }
113 * @endcode
114 */
115#define msDelayWhileActive(_ms_, _pvar_) (local_time() - *(_pvar_) < _ms_)
116
117/**
118 * @brief Проверяет, завершилась ли задержка.
119 * @param _ms_ Длительность задержки в миллисекундах.
120 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart).
121 * @retval 1 Задержка завершена.
122 * @retval 0 Задержка еще активна.
123 * @details
124 * Возвращает true, когда задержка уже завершена. Используется в проверках,
125 * когда нужно **выполнить действие только после окончания задержки**. Пример:
126 * @code
127 * if(msDelayWaitDone(1000, &tick)) {
128 * // выполняем действие после завершения задержки
129 * }
130 * @endcode
131 */
132#define msDelayWaitDone(_ms_, _pvar_) (local_time() - *(_pvar_) >= _ms_)
133
134/** DELAYS_DEFINES
135 * @}
136 */
137
138
139/***************************************************************************
140*******************************UTIL_DEFINES********************************/
141static int dummy;
142/**
143 * @addtogroup UTILS_DEFINES Utils defines
144 * @ingroup MYLIBS_DEFINES
145 * @brief Общие вспомогательные макросы
146 * @{
147 */
148
149/**
150 * @brief Обнуление структуры.
151 * @param _struct_ Структура, которую нужно обнулить.
152 * @details Макрос использует memset для обнуления всей памяти структуры.
153 * Используется для быстрой и безопасной инициализации переменных структур до нуля.
154 */
155#define ClearStruct(_struct_) memset(&(_struct_), 0, sizeof(_struct_))
156
157/**
158 * @brief Деление с округлением вверх
159 * @param _val_ Делимое.
160 * @param _div_ Делитель.
161 * @return Результат деления, округленный вверх.
162 * @details Если результат деления без остатка: он возвращается как есть
163 Если с остатком - округляется вверх
164 */
165//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
166#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
167
168/**
169 * @brief Swap between Little Endian and Big Endian
170 * @param v Исходное 16-битное значение.
171 * @return Результат с поменяными местами старшим и младшим байтом.
172 * @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
173 */
174#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
175
176/**
177 * @brief Абсолютное значение числа
178 * @param x Число.
179 * @return Абсолютное значение числа x.
180 * @details Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
181 */
182#define ABS(x) ( ((x) > 0)? (x) : -(x))
183
184/** UTILS_DEFINES
185 * @}
186 */
187
188
189
190/**
191 * @cond LIBS_INTERNAL
192 */
193
194
195/**
196 * @brief Аналог HAL макроса для привязки DMA к UART.
197 * @note @ref __HAL_LINKDMA.
198 */
199#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
200do{ \
201(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \
202(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
203
204
205/** @endcond */
206#endif //__MYLIBS_DEFINES_H_
Конфигурации для библиотек MyLibs.