MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
general_tim.h
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file general_tim.h
4* @brief Заголовочный файл для модуля инициализации таймеров и работы с ними.
5**************************************************************************
6* @defgroup MY_LIBS_TIM TIM Tools
7* @ingroup MYLIBS_PERIPHERAL
8* @brief Функции и макросы для удобной работы с TIM.
9* @details
10Модуль предоставляет универсальные инструменты для работы с TIM:
11 - @ref MYLIBS_TIM_GENERAL — базовая инициализация таймеров и прерываний.
12 - @ref MYLIBS_TIM_DELAY — функции задержки через таймеры (blocking и non-blocking).
13 - @ref MYLIBS_TIM_OC — настройка каналов Output Compare и PWM.
14 - @ref MYLIBS_TIM_ENCODER — работа с энкодерами, чтение положения и кнопки.
15
16* @note Требуется подключение модуля TIM в библиотеке HAL и GPIO (@ref MY_LIBS_GPIO) из MyLibs
17@code
18#define HAL_TIM_MODULE_ENABLED
19@endcode
20*************************************************************************/
21#ifndef __TIM_GENERAL_H_
22#define __TIM_GENERAL_H_
23
24/////////////////////////////////////////////////////////////////////
25/////////////////////////---USER SETTINGS---/////////////////////////
26/**
27 * @addtogroup TIM_INIT Init defines
28 * @ingroup MYLIBS_TIM_GENERAL
29 * @brief Настройка таймеров
30 * @{
31 */
32#define HAL_TIM_MODULE_ENABLED
33
34#define USE_TIM1 ///< Включить TIM1 в @ref TIM_Base_MspInit
35#define USE_TIM2 ///< Включить TIM2 в @ref TIM_Base_MspInit
36#define USE_TIM3 ///< Включить TIM3 в @ref TIM_Base_MspInit
37#define USE_TIM4 ///< Включить TIM4 в @ref TIM_Base_MspInit
38#define USE_TIM5 ///< Включить TIM5 в @ref TIM_Base_MspInit
39#define USE_TIM6 ///< Включить TIM6 в @ref TIM_Base_MspInit
40#define USE_TIM7 ///< Включить TIM7 в @ref TIM_Base_MspInit
41#define USE_TIM8 ///< Включить TIM8 в @ref TIM_Base_MspInit
42#define USE_TIM9 ///< Включить TIM9 в @ref TIM_Base_MspInit
43#define USE_TIM10 ///< Включить TIM10 в @ref TIM_Base_MspInit
44#define USE_TIM11 ///< Включить TIM11 в @ref TIM_Base_MspInit
45#define USE_TIM12 ///< Включить TIM12 в @ref TIM_Base_MspInit
46#define USE_TIM13 ///< Включить TIM13 в @ref TIM_Base_MspInit
47#define USE_TIM14 ///< Включить TIM14 в @ref TIM_Base_MspInit
48/** TIM_INIT
49 * @}
50 */
51/////////////////////////---USER SETTINGS---/////////////////////////
52#include "mylibs_defs.h"
53#include "general_gpio.h"
54
55/////////////////////////////////////////////////////////////////////
56////////////////////////////---DEFINES---////////////////////////////
57#define TIM_IT_CONF_Pos 0
58//#define TIM_PWM_CONF_Pos 1
59//#define TIM_CLCK_SRC_CONF_Pos 2
60//#define TIM_SLAVE_CONF_Pos 3
61//#define TIM_MASTER_CONF_Pos 4
62//#define TIM_BDTR_CONF_Pos 5
63
64#define TIM_IT_CONF (1<<(TIM_IT_CONF_Pos))
65//#define TIM_PWM_CONF (1<<(TIM_PWM_Pos))
66
67////////////////////////////---DEFINES---////////////////////////////]
68
69
70
71/////////////////////////////////////////////////////////////////////
72///////////////////////---STRUCTURES & ENUMS---//////////////////////
73/**
74 * @brief Режим прерываний таймера
75 * @ingroup MYLIBS_TIM_GENERAL
76 */
77typedef enum
78{
79 TIM_DEFAULT = 0, ///< Прерываний отключены
80 TIM_IT_MODE = TIM_IT_CONF, ///< Прерываний включены
81// TIM_PWM_MODE = TIM_PWM_ENABLE,
82// TIM_PWM_IT_MODE = TIM_PWM_ENABLE | TIM_IT_CONF,
84
85/**
86 * @brief Длительность тика таймера (частота тактирования таймера)
87 * @ingroup MYLIBS_TIM_GENERAL
88 * @details enum дает базовые длительности, но можно выставить другие
89 * (напр 500 - 0.5 мс)
90 */
91typedef enum
92{
93 TIM_Base_Disable = 0, ///< Таймер отключен
94 TIM_TickBase_1US = 1, ///< Таймер тактируется с частотой 1 МГц
95 TIM_TickBase_10US = 10, ///< Таймер тактируется с частотой 100 кГц
96 TIM_TickBase_100US = 100, ///< Таймер тактируется с частотой 10 кГц
97 TIM_TickBase_1MS = 1000, ///< Таймер тактируется с частотой 1 кГц
98 TIM_TickBase_10MS = 10000, ///< Таймер тактируется с частотой 100 Гц
99 TIM_TickBase_100MS = 100000, ///< Таймер тактируется с частотой 10 Гц
101
102/**
103 * @brief Структура инициализации таймера
104 * @ingroup MYLIBS_TIM_GENERAL
105 * @details
106 * Содержит все базовые структуры, которые нужны для инициализации таймера.
107 * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами
108 *
109 * Также высокоуровневые настройки частоты работы таймера.
110 * Если какая-либо высокоуровневая настройка не задана, то
111 * по возможности берется низкоуровневая настройка из структур
112 */
113typedef struct // struct with settings for custom function
114{
115 TIM_HandleTypeDef htim; ///< HAL handle таймера
116 TIM_ClockConfigTypeDef sClockSourceConfig; ///< Настройки тактирования таймера
117 TIM_SlaveConfigTypeDef sSlaveConfig; ///< Настройки слейв режима таймера
118 TIM_MasterConfigTypeDef sMasterConfig; ///< Настройки мастер режима таймера
119 TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; ///< Настройки дедтаймов таймера
120
121 TIM_ITModeTypeDef sTimMode; ///< Настройки прерывания таймера
122 TIM_MHzTickBaseTypeDef sTickBaseUS; ///< Длительность одного тика
123 uint8_t sTickBasePrescaler; ///< Дополнительный делитель, для удобного деления @ref sTickBaseUS
124 float sTimAHBFreqMHz; ///< Частота шины тактирования таймера
125 float sTimFreqHz; ///< Желаемая частота таймера
126
128
129
130/**
131 * @brief Структура инициализации енкодера
132 * @ingroup MYLIBS_TIM_ENCODER
133 * @details
134 * Содержит все базовые структуры, которые нужны для инициализации таймера.
135 * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами
136 *
137 * Также высокоуровневые настройки частоты работы таймера.
138 * Если какая-либо высокоуровневая настройка не задана, то
139 * по возможности берется низкоуровневая настройка из структур
140 */
141typedef struct // struct with variables for encoder
142{
143 int16_t Encoder_Diff; ///< Считанная разница
144 uint16_t Encoder_Shdw; ///< Последние считанные тики
145
146 TIM_HandleTypeDef *htim; ///< Указатель на HAL handle таймера
147 TIM_Encoder_InitTypeDef sConfig; ///< Указатель на структуру настройки энкодера
148
149 GPIO_TypeDef *GPIOx; ///< Порт, куда подключается энкодер
150 uint32_t GPIO_PIN_TI1; ///< Пин, куда подключается канал TI1
151 uint32_t GPIO_PIN_TI2; ///< Пин, куда подключается канал TI2
152 uint32_t GPIO_PIN_SW; ///< Пин, куда кнопка энкодера (если есть)
153
154 GPIO_SwitchTypeDef Sw; ///< Структура кнопки
155
157///////////////////////---STRUCTURES & ENUMS---//////////////////////
158
159/////////////////////////////////////////////////////////////////////
160///////////////////////////---FUNCTIONS---///////////////////////////
161/**
162 * @addtogroup MYLIBS_TIM_GENERAL General tools
163 * @ingroup MY_LIBS_TIM
164 * @brief Функции для базовой инициализации таймеров
165 * @par Пример использования:
166 @code
167 TIM_SettingsTypeDef tim2Settings;
168
169 void TIM2_Init(void)
170 {
171 // Настройка таймера TIM2 на 1 кГц с прерываниями с шагом таймера 10 мкс
172 tim2Settings.htim.Instance = TIM2;
173 tim2Settings.sTimMode = TIM_IT_MODE;
174 tim2Settings.sTickBaseUS = TIM_TickBase_10US;
175 tim2Settings.sTickBasePrescaler = 1;
176 tim2Settings.sTimFreqHz = 1000; // 1 кГц
177 tim2Settings.sTimAHBFreqMHz = 72000000; // Hz
178
179 if(TIM_Base_Init(&tim2Settings) != HAL_OK)
180 {
181 Error_Handler();
182 }
183 }
184 @endcode
185 * @{
186 */
187/* Initialize TIM with TIM_SettingsTypeDef structure */
188HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim);
189/* Initialize TIMs clock and interrupt */
190void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode);
191/* DeInitialize TIMs clock and interrupt */
192void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim);
193/** MYLIBS_TIM_GENERAL
194 * @}
195 */
196
197/**
198 * @addtogroup MYLIBS_TIM_DELAY Delay tools
199 * @ingroup MY_LIBS_TIM
200 * @brief Функции для формирования задержек с помощью таймеров
201 * @par Пример использования:
202 @code
203 TIM_HandleTypeDef htim2;
204
205 // блокирующая задержка 500 тиков таймера
206 LED_ON();
207 TIM_Delay(&htim2, 500);
208 LED_OFF();
209
210
211 while(1)
212 {
213 // не блокирующая задержка 200 тиков таймера
214 if(TIM_Delay_NonBlocking(&htim2, 200) == HAL_OK)
215 {
216 TIM_Delay_Start(&htim2);
217 LED_TOOGLE();
218 }
219 }
220 @endcode
221 * @{
222 */
223/* Start delay via TIM */
224HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim);
225/* Delay via TIM */
226HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay);
227/* Wait Delay via TIM without blocking app */
228HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay);
229/** MYLIBS_TIM_DELAY
230 * @}
231 */
232
233/**
234 * @addtogroup MYLIBS_TIM_OC PWM/OC Channels tools
235 * @ingroup MY_LIBS_TIM
236 * @brief Функции для инициализации базовых функций каналов таймера
237 * @par Пример использования:
238 @code
239 void PWM_Channel_Init_Example(void)
240 {
241 TIM_HandleTypeDef htim3;
242 TIM_OC_InitTypeDef sConfigOC;
243 GPIO_TypeDef *GPIOx = GPIOB;
244 uint32_t PWM_PIN = GPIO_PIN_0;
245
246 // Настройка таймера и канала PWM
247 TIM_Output_PWM_Init(&htim3, &sConfigOC, TIM_CHANNEL_1, GPIOx, PWM_PIN);
248
249 // Настройка компаратора OC
250 TIM_OC_Comparator_Init(&htim3, TIM_CHANNEL_1);
251 }
252 @endcode
253 * @{
254 */
255/* Initialize PWM Channel and GPIO for output */
256HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN);
257/* Initialize OC Comparator */
258HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL);
259/** MYLIBS_TIM_ENCODER
260 * @}
261 */
262
263/**
264 * @addtogroup MYLIBS_TIM_ENCODER Encoder tools
265 * @ingroup MY_LIBS_TIM
266 * @brief Функции для считывания энкодера
267 * @par Пример использования:
268 @code
269 TIM_EncoderTypeDef henc1;
270 TIM_HandleTypeDef htim4;
271
272 // инициализация
273 henc1.htim = &htim4;
274 henc1.GPIOx = GPIOA;
275 henc1.GPIO_PIN_TI1 = GPIO_PIN_0;
276 henc1.GPIO_PIN_TI2 = GPIO_PIN_1;
277 TIM_Encoder_Init(&henc1, &htim4);
278
279 // считывание энкодера и кнопки
280 int16_t delta = TIM_Encoder_Read(&henc1);
281 setpoint_tmp += delta;
282 if(TIM_Encoder_ReadSwitch(&henc1))
283 {
284 setpoint = setpoint_tmp; // подтвердить новое значение
285 }
286 @endcode
287 * @{
288 */
289/* Initialize TIM Encoder functional */
290HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim);
291/* Считать энкодер */
292HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc);
293/* Считать кнопку энкодера */
295/** MYLIBS_TIM_ENCODER
296 * @}
297 */
298///////////////////////////---FUNCTIONS---///////////////////////////
299
300
301#endif // __TIM_GENERAL_H_
Заголовочный файл для модуля инициализации портов и работы с ними.
HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay)
Задержка в тиках таймера (неблокирующая).
HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim)
Начать отсчет неблокирующей задержки.
HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay)
Задержка в тиках таймера (блокирующая).
int TIM_Encoder_ReadSwitch(TIM_EncoderTypeDef *henc)
Считать кнопку энкодера.
HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim)
Инициализация режима энкодер у таймера.
HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc)
Считать энкодер.
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
Инициализация таймера.
Definition general_tim.c:34
void TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
Деинициализация CLK и NVIC таймеров.
TIM_MHzTickBaseTypeDef
Длительность тика таймера (частота тактирования таймера)
Definition general_tim.h:92
void TIM_Base_MspInit(TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode)
Инициализация CLK и NVIC таймеров.
TIM_ITModeTypeDef
Режим прерываний таймера
Definition general_tim.h:78
@ TIM_TickBase_10US
Таймер тактируется с частотой 100 кГц
Definition general_tim.h:95
@ TIM_TickBase_100US
Таймер тактируется с частотой 10 кГц
Definition general_tim.h:96
@ TIM_TickBase_100MS
Таймер тактируется с частотой 10 Гц
Definition general_tim.h:99
@ TIM_TickBase_1US
Таймер тактируется с частотой 1 МГц
Definition general_tim.h:94
@ TIM_TickBase_1MS
Таймер тактируется с частотой 1 кГц
Definition general_tim.h:97
@ TIM_TickBase_10MS
Таймер тактируется с частотой 100 Гц
Definition general_tim.h:98
@ TIM_Base_Disable
Таймер отключен
Definition general_tim.h:93
@ TIM_IT_MODE
Прерываний включены
Definition general_tim.h:80
@ TIM_DEFAULT
Прерываний отключены
Definition general_tim.h:79
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN)
Инициализация выхода ШИМ таймера.
HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
Инициализация OC компаратора таймера.
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
Структура кнопки
Структура инициализации енкодера
TIM_Encoder_InitTypeDef sConfig
Указатель на структуру настройки энкодера
uint16_t Encoder_Shdw
Последние считанные тики
uint32_t GPIO_PIN_TI1
Пин, куда подключается канал TI1.
uint32_t GPIO_PIN_TI2
Пин, куда подключается канал TI2.
uint32_t GPIO_PIN_SW
Пин, куда кнопка энкодера (если есть)
int16_t Encoder_Diff
Считанная разница
GPIO_SwitchTypeDef Sw
Структура кнопки
GPIO_TypeDef * GPIOx
Порт, куда подключается энкодер
TIM_HandleTypeDef * htim
Указатель на HAL handle таймера
Структура инициализации таймера
uint8_t sTickBasePrescaler
Дополнительный делитель, для удобного деления sTickBaseUS.
TIM_MasterConfigTypeDef sMasterConfig
Настройки мастер режима таймера
TIM_ClockConfigTypeDef sClockSourceConfig
Настройки тактирования таймера
TIM_MHzTickBaseTypeDef sTickBaseUS
Длительность одного тика
float sTimAHBFreqMHz
Частота шины тактирования таймера
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig
Настройки дедтаймов таймера
TIM_SlaveConfigTypeDef sSlaveConfig
Настройки слейв режима таймера
TIM_ITModeTypeDef sTimMode
Настройки прерывания таймера
TIM_HandleTypeDef htim
HAL handle таймера
float sTimFreqHz
Желаемая частота таймера