MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
general_tim.c
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file general_tim.c
4* @brief Модуль для инициализации таймеров и работы с ними.
5**************************************************************************
6Реализация функций для работы с TIM:
7 - Инициализация таймера и его каналов
8 - Формирование задержек через таймеры
9 - Считывание энкодера
10*************************************************************************/
11#include "general_tim.h"
12
13//-------------------------------------------------------------------
14//-------------------------TIM INIT FUNCTIONS------------------------
15/**
16 * @brief Инициализация таймера.
17 * @param stim Указатель на структуру с настройками таймера.
18 * @return HAL status.
19 * @details
20 * Инициализирует таймер исходя из настроек верхнего уровня:
21 * - Длительность одного тика @ref TIM_MHzTickBaseTypeDef
22 * - Частота таймера (в Гц, float)
23 * - Частота тактирования таймера от шины (в Гц, float)
24 *
25 * При невозможности выставления частоты при заданой длительности тика
26 * длительность тика увеличивается до тех пор, пока частота не будет достигнута.
27 *
28 * При выставлении дефайна @ref UPDATE_TIM_PARAMS_AFTER_INITIALIZATION
29 * новая длительность тика записывается в структуру.
30 *
31 * Также остается возможность низкоуровневой настройки по структурам @ref TIM_SettingsTypeDef.
32 * Для этого надо высокоуровневые настройки приравнять к нулю
33 */
34HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
35{ // function takes structure for init
36 // check that htim is defined
37 if(check_null_ptr_2(stim, stim->htim.Instance))
38 return HAL_ERROR;
39
40
41
42 if(stim->sTickBaseUS) // if tickbase isnt disable
43 {
44 if(stim->sTimAHBFreqMHz == NULL)
45 return HAL_ERROR;
46 stim->htim.Init.Prescaler = (stim->sTimAHBFreqMHz*stim->sTickBaseUS) - 1;
47
48 if ((stim->sTimFreqHz != NULL))
49 stim->htim.Init.Period = ((1000000/stim->sTickBaseUS) / stim->sTimFreqHz) - 1;
50 else if (stim->htim.Init.Period == NULL)
51 stim->htim.Init.Period = 0xFFFF;
52
53 if(stim->sTickBasePrescaler)
54 {
55 stim->htim.Init.Prescaler = (stim->htim.Init.Prescaler + 1)/stim->sTickBasePrescaler - 1;
56 stim->htim.Init.Period = (stim->htim.Init.Period + 1)*stim->sTickBasePrescaler - 1;
57 }
58 else
59 stim->sTickBasePrescaler = 1;
60 }
61
62 // fix overflow of presc and period if need
63 for(int i = 0; (stim->htim.Init.Prescaler > 0xFFFF) || (stim->htim.Init.Period > 0xFFFF); i++)
64 {
65 if (i>10) // if it isnt fixed after 10 itteration - return HAL_ERRPOR
66 {
67 return HAL_ERROR;
68 }
69
70 // if timbase is too big (prescaller too big for choosen base from MHZ)
71 if(stim->htim.Init.Prescaler > 0xFFFF)
72 {
73 // переносим часть пресскалера в период
74 stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)/2) - 1;
75 stim->htim.Init.Period = ((stim->htim.Init.Period + 1)*2) - 1;
76 // обновляем TickBase, если есть куда обновлять
77 if(stim->sTickBaseUS > 1)
78 stim->sTickBaseUS /= 2;
79 // обновляем sTickBasePrescaler, если sTickBaseUS - уже в минимуме
80 else if (stim->sTickBaseUS == 1)
81 stim->sTickBasePrescaler *= 2;
82 else // if TickBase = 0 - return error
83 return HAL_ERROR;
84 }
85 // if freq is too low (period too big for choosen base)
86 if(stim->htim.Init.Period > 0xFFFF)
87 {
88 // переносим часть периода в прескалер
89 stim->htim.Init.Period = ((stim->htim.Init.Period + 1)/2) - 1;
90 stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)*2) - 1;
91 // обновляем TickBase
92 stim->sTickBaseUS *= 2;
93 }
94 }
95
96 //-------------TIM BASE INIT----------------
97 // tim base init
98 TIM_Base_MspInit(&stim->htim, stim->sTimMode);
99 if (HAL_TIM_Base_Init(&stim->htim) != HAL_OK)
100 {
102 return HAL_ERROR;
103 }
104
105 //-------------CLOCK SRC INIT---------------
106 // fill sClockSourceConfig if its NULL
107 if (stim->sClockSourceConfig.ClockSource == NULL)
108 stim->sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
109 // clock source init
110 if (HAL_TIM_ConfigClockSource(&stim->htim, &stim->sClockSourceConfig) != HAL_OK)
111 {
113 return HAL_ERROR;
114 }
115
116 //--------------SLAVE INIT------------------
117 // if slave mode enables - config it
118 if (stim->sSlaveConfig.SlaveMode)
119 {
120 // slave mode init
121 if (HAL_TIM_SlaveConfigSynchro(&stim->htim, &stim->sSlaveConfig) != HAL_OK)
122 {
124 return HAL_ERROR;
125 }
126 }
127 //--------------MASTER INIT-----------------
128 // master mode init
129 if (HAL_TIMEx_MasterConfigSynchronization(&stim->htim, &stim->sMasterConfig) != HAL_OK)
130 {
132 return HAL_ERROR;
133 }
134
135 //--------------BDTR INIT-----------------
136 if (HAL_TIMEx_ConfigBreakDeadTime(&stim->htim, &stim->sBreakDeadTimeConfig) != HAL_OK)
137 {
139 return HAL_ERROR;
140 }
141
142 //----------------IT CLEAR-------------------
143 __HAL_TIM_CLEAR_IT(&stim->htim, TIM_IT_UPDATE);
144
145
146 // обновляем TickBase
147 #ifdef UPDATE_TIM_PARAMS_AFTER_INITIALIZATION
148 stim->sTickBaseUS = (stim->htim.Instance->PSC+1)*stim->sTickBasePrescaler/(stim->sTimAHBFreqMHz);
149 if(stim->sTickBaseUS == 0) // if prescaler is too high
150 { // recalc what is prescaler irl
151 stim->sTickBaseUS = 1;
152 stim->sTickBasePrescaler = stim->sTimAHBFreqMHz/(stim->htim.Instance->PSC+1);
153 }
154 #endif
155 stim->htim.Instance->CNT = 0;
156 return HAL_OK;
157}
158
159
160
161/**
162 * @brief Инициализация режима энкодер у таймера.
163 * @param henc Указатель на хендл энкодера.
164 * @param htim Указатель на хендл таймера.
165 * @return HAL status.
166 * @note Предварительно надо инициализировать таймер @ref TIM_Base_Init.
167 */
168HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc, TIM_HandleTypeDef *htim)
169{
170 if(check_null_ptr_3(henc, htim, htim->Instance))
171 return HAL_ERROR;
172 if(check_null_ptr_3(henc->GPIOx, henc->GPIO_PIN_TI1, henc->GPIO_PIN_TI2))
173 return HAL_ERROR;
174
175 GPIO_InitTypeDef GPIO_InitStruct = {0};
176 HAL_StatusTypeDef RES = HAL_ERROR;
177 henc->htim = htim;
178
179 // setup channel for pwm
180 RES = HAL_TIM_Encoder_Init(henc->htim, &henc->sConfig);
181 if (RES != HAL_OK)
182 {
184 return RES;
185 }
186 // choose port for enable clock
187 RES = GPIO_Clock_Enable(henc->GPIOx);
188 if(RES != HAL_OK)
189 {
191 return RES;
192 }
193
194 GPIO_InitStruct.Pin = henc->GPIO_PIN_TI1|henc->GPIO_PIN_TI2;
195 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
196 GPIO_InitStruct.Pull = GPIO_PULLUP;
197 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
198 GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(henc->htim->Instance);
199 if(GPIO_InitStruct.Alternate)
200 HAL_GPIO_Init(henc->GPIOx, &GPIO_InitStruct);
201
202 if(henc->GPIO_PIN_SW)
203 {
204 /*Configure switch pin */
205 GPIO_InitStruct.Pin = henc->GPIO_PIN_SW;
206 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
207 GPIO_InitStruct.Pull = GPIO_PULLUP;
208 HAL_GPIO_Init(henc->GPIOx, &GPIO_InitStruct);
209
210 GPIO_Switch_Init(&henc->Sw, henc->GPIOx, henc->GPIO_PIN_SW, 0);
211 }
212
213 return HAL_OK;
214}
215
216/**
217 * @brief Инициализация выхода ШИМ таймера.
218 * @param htim Указатель на хендл таймера.
219 * @param sConfigOC Указатель на настрйоки канала таймера.
220 * @param TIM_CHANNEL Канал таймера для настройки.
221 * @param GPIOx Порт для вывода ШИМ.
222 * @param GPIO_PIN Пин для вывода ШИМ.
223 * @return HAL status.
224 * @note Предварительно надо инициализировать таймер @ref TIM_Base_Init.
225 */
226HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN)
227{
228 if(check_null_ptr_3(htim, htim->Instance, sConfigOC))
229 return HAL_ERROR;
230 if(check_null_ptr_2(GPIOx, GPIO_PIN))
231 return HAL_ERROR;
232
233 GPIO_InitTypeDef GPIO_InitStruct = {0};
234 HAL_StatusTypeDef RES = HAL_ERROR;
235
236 // setup channel for pwm
237 RES = HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL);
238 if (RES != HAL_OK)
239 {
241 return RES;
242 }
243 // choose port for enable clock
244 RES = GPIO_Clock_Enable(GPIOx);
245 if(RES != HAL_OK)
246 {
248 return RES;
249 }
250
251 GPIO_InitStruct.Pin = GPIO_PIN;
252 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
253 if(sConfigOC->OCPolarity == TIM_OCNPOLARITY_HIGH)
254 GPIO_InitStruct.Pull = GPIO_PULLDOWN;
255 else
256 GPIO_InitStruct.Pull = GPIO_PULLUP;
257 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
258 GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(htim->Instance);
259 if(GPIO_InitStruct.Alternate)
260 HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
261
262 return HAL_OK;
263}
264
265/**
266 * @brief Инициализация OC компаратора таймера.
267 * @param htim Указатель на хендл таймера.
268 * @param TIM_CHANNEL Канал таймера для настройки.
269 * @return HAL status.
270 * @note Предварительно надо инициализировать таймер @ref TIM_Base_Init.
271 */
272HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
273{
274 if(check_null_ptr_2(htim, htim->Instance))
275 return HAL_ERROR;
276
277 TIM_OC_InitTypeDef sConfigOC = {0};
278 HAL_StatusTypeDef RES = HAL_ERROR;
279
280 sConfigOC.OCMode = TIM_OCMODE_ACTIVE;
281 sConfigOC.Pulse = 0;
282 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
283
284 RES = HAL_TIM_OC_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL);
285 if (RES != HAL_OK)
286 {
288 return RES;
289 }
290 return RES;
291}
292
293
294//-------------------------------------------------------------------
295//-------------------------TIM USER FUNCTIONS------------------------
296/**
297 * @brief Считать энкодер.
298 * @param henc Указатель на хендл энкодера.
299 * @return HAL status.
300 * @details Читает разницу энкодера, которую он накопил после
301 * предыдущего вызова этой функции.
302 */
303HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc)
304{
305 if(check_null_ptr_3(henc, henc->htim, henc->htim->Instance))
306 return HAL_ERROR;
307
308 uint16_t cnt_now = (uint16_t)henc->htim->Instance->CNT;
309 int16_t diff = (int16_t)(cnt_now - henc->Encoder_Shdw); // переполнение корректно обрабатывается
310 henc->Encoder_Diff = diff;
311 henc->Encoder_Shdw = cnt_now;
312
313 return HAL_OK;
314}
315/**
316 * @brief Считать кнопку энкодера.
317 * @param henc Указатель на хендл энкодера.
318 * @return 1 - если кнопка нажата,
319 * 0 - если отжата,
320 * -1 - если ошибка
321 */
323{
324 if(check_null_ptr_1(henc))
325 return -1;
326
327 return GPIO_Read_Switch(&henc->Sw);
328}
329
330/**
331 * @brief Задержка в тиках таймера (блокирующая).
332 * @param htim Указатель на хендл таймера.
333 * @param delay Задержка в тиках таймера.
334 * @return HAL status.
335 * @details Формирует задержку с блокировкой программы.
336 */
337HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay)
338{
339 if(check_null_ptr_2(htim, htim->Instance))
340 return HAL_ERROR;
341
342 if(delay >= htim->Instance->ARR)
343 {
344 return HAL_ERROR;
345 }
346 htim->Instance->CNT = 0;
347 while(1)
348 {
349 if(htim->Instance->CNT > delay)
350 {
351 return HAL_OK;
352 }
353 }
354}
355
356/**
357 * @brief Начать отсчет неблокирующей задержки.
358 * @param htim Указатель на хендл таймера.
359 * @return HAL status.
360 * @details Сбрасывает счетчик для начала отсчета неблокирующей задержки.
361 * @ref TIM_Delay_NonBlocking для проверки статуса задержки
362 */
363HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim)
364{
365 if(check_null_ptr_2(htim, htim->Instance))
366 return HAL_ERROR;
367
368 htim->Instance->CNT = 0;
369
370 return HAL_OK;
371}
372
373/**
374 * @brief Задержка в тиках таймера (неблокирующая).
375 * @param htim Указатель на хендл таймера.
376 * @param delay Задержка в тиках таймера.
377 * @return HAL status.
378 * @details Формирует задержку с блокировкой программы.
379 * Перед ожиданием задержки надо запутстить таймер @ref TIM_Delay_Start
380 * @note Таймер не должен использоваться на время этой задержки
381 */
382HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay)
383{
384 if(check_null_ptr_2(htim, htim->Instance))
385 return HAL_ERROR;
386
387 if(delay >= htim->Instance->ARR)
388 {
389 return HAL_ERROR;
390 }
391
392 if(htim->Instance->CNT <= delay)
393 {
394 return HAL_BUSY;
395 }
396 else
397 {
398 return HAL_OK;
399 }
400}
401
402/**
403 * @brief Инициализация CLK и NVIC таймеров.
404 * @param htim Указатель на хендл таймера.
405 * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров,
406 дефайнами @ref TIM_INIT в @ref general_tim.h определяются используемые таймеры.
407 */
408void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode)
409{
410 if(check_null_ptr_2(htim, htim->Instance))
411 return;
412
413 it_mode = it_mode&TIM_IT_CONF;
414#ifdef USE_TIM1
415 if(htim->Instance==TIM1)
416 {
417 /* TIM2 clock enable */
418 __HAL_RCC_TIM1_CLK_ENABLE();
419
420 /* TIM2 interrupt Init */
421 if(it_mode)
422 {
423 HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
424 HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
425 }
426 }
427#endif
428#ifdef USE_TIM2
429 if(htim->Instance==TIM2)
430 {
431 /* TIM2 clock enable */
432 __HAL_RCC_TIM2_CLK_ENABLE();
433
434 /* TIM2 interrupt Init */
435 if(it_mode)
436 {
437 HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
438 HAL_NVIC_EnableIRQ(TIM2_IRQn);
439 }
440 }
441#endif
442#ifdef USE_TIM3
443 if(htim->Instance==TIM3)
444 {
445 /* TIM3 clock enable */
446 __HAL_RCC_TIM3_CLK_ENABLE();
447
448 /* TIM3 interrupt Init */
449 if(it_mode)
450 {
451 HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
452 HAL_NVIC_EnableIRQ(TIM3_IRQn);
453 }
454 }
455#endif
456#ifdef USE_TIM4
457 if(htim->Instance==TIM4)
458 {
459 /* TIM4 clock enable */
460 __HAL_RCC_TIM4_CLK_ENABLE();
461
462 /* TIM4 interrupt Init */
463 if(it_mode)
464 {
465 HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
466 HAL_NVIC_EnableIRQ(TIM4_IRQn);
467 }
468 }
469#endif
470#ifdef USE_TIM5
471 if(htim->Instance==TIM5)
472 {
473 /* TIM5 clock enable */
474 __HAL_RCC_TIM5_CLK_ENABLE();
475
476 /* TIM5 interrupt Init */
477 if(it_mode)
478 {
479 HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0);
480 HAL_NVIC_EnableIRQ(TIM5_IRQn);
481 }
482 }
483#endif
484#ifdef USE_TIM6
485 if(htim->Instance==TIM6)
486 {
487 /* TIM6 clock enable */
488 __HAL_RCC_TIM6_CLK_ENABLE();
489
490 /* TIM6 interrupt Init */
491 if(it_mode)
492 {
493 HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
494 HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
495 }
496 }
497#endif
498#ifdef USE_TIM7
499 if(htim->Instance==TIM7)
500 {
501 /* TIM7 clock enable */
502 __HAL_RCC_TIM7_CLK_ENABLE();
503
504 /* TIM7 interrupt Init */
505 if(it_mode)
506 {
507 HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0);
508 HAL_NVIC_EnableIRQ(TIM7_IRQn);
509 }
510 }
511#endif
512#ifdef USE_TIM8
513 if(htim->Instance==TIM8)
514 {
515 /* TIM8 clock enable */
516 __HAL_RCC_TIM8_CLK_ENABLE();
517
518 /* TIM8 interrupt Init */
519 if(it_mode)
520 {
521 HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
522 HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
523 }
524 }
525#endif
526#ifdef USE_TIM9
527 if(htim->Instance==TIM9)
528 {
529 /* TIM9 clock enable */
530 __HAL_RCC_TIM9_CLK_ENABLE();
531
532 /* TIM9 interrupt Init */
533 if(it_mode)
534 {
535 HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0);
536 HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
537 }
538 }
539#endif
540#ifdef USE_TIM10
541 if(htim->Instance==TIM10)
542 {
543 /* TIM10 clock enable */
544 __HAL_RCC_TIM10_CLK_ENABLE();
545
546 /* TIM10 interrupt Init */
547 if(it_mode)
548 {
549 HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
550 HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
551 }
552 }
553#endif
554#ifdef USE_TIM11
555 if(htim->Instance==TIM11)
556 {
557 /* TIM11 clock enable */
558 __HAL_RCC_TIM11_CLK_ENABLE();
559
560 /* TIM11 interrupt Init */
561 if(it_mode)
562 {
563 HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 0, 0);
564 HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn);
565 }
566 }
567#endif
568#ifdef USE_TIM12
569 if(htim->Instance==TIM12)
570 {
571 /* TIM12 clock enable */
572 __HAL_RCC_TIM12_CLK_ENABLE();
573
574 /* TIM12 interrupt Init */
575 if(it_mode)
576 {
577 HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0);
578 HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
579 }
580 }
581#endif
582#ifdef USE_TIM13
583 if(htim->Instance==TIM13)
584 {
585 /* TIM13 clock enable */
586 __HAL_RCC_TIM13_CLK_ENABLE();
587
588 /* TIM13 interrupt Init */
589 if(it_mode)
590 {
591 HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
592 HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
593 }
594 }
595#endif
596#ifdef USE_TIM14
597 if(htim->Instance==TIM14)
598 {
599 /* TIM14 clock enable */
600 __HAL_RCC_TIM14_CLK_ENABLE();
601
602 /* TIM14 interrupt Init */
603 if(it_mode)
604 {
605 HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 0, 0);
606 HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
607 }
608 }
609#endif
610}
611/**
612 * @brief Деинициализация CLK и NVIC таймеров.
613 * @param htim Указатель на хендл таймера.
614 * @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров,
615 дефайнами @ref TIM_INIT в @ref general_tim.h определяются используемые таймеры.
616 */
617void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim)
618{
619 if(check_null_ptr_2(htim, htim->Instance))
620 return;
621
622#ifdef USE_TIM1
623 if(htim->Instance==TIM1)
624 {
625 __HAL_RCC_TIM1_FORCE_RESET();
626 __HAL_RCC_TIM1_RELEASE_RESET();
627 }
628#endif
629#ifdef USE_TIM2
630 if(htim->Instance==TIM2)
631 {
632 __HAL_RCC_TIM2_FORCE_RESET();
633 __HAL_RCC_TIM2_RELEASE_RESET();
634 }
635#endif
636#ifdef USE_TIM3
637 if(htim->Instance==TIM3)
638 {
639 __HAL_RCC_TIM3_FORCE_RESET();
640 __HAL_RCC_TIM3_RELEASE_RESET();
641 }
642#endif
643#ifdef USE_TIM4
644 if(htim->Instance==TIM4)
645 {
646 __HAL_RCC_TIM4_FORCE_RESET();
647 __HAL_RCC_TIM4_RELEASE_RESET();
648 }
649#endif
650#ifdef USE_TIM5
651 if(htim->Instance==TIM5)
652 {
653 __HAL_RCC_TIM5_FORCE_RESET();
654 __HAL_RCC_TIM5_RELEASE_RESET();
655 }
656#endif
657#ifdef USE_TIM6
658 if(htim->Instance==TIM6)
659 {
660 __HAL_RCC_TIM6_FORCE_RESET();
661 __HAL_RCC_TIM6_RELEASE_RESET();
662 }
663#endif
664#ifdef USE_TIM7
665 if(htim->Instance==TIM7)
666 {
667 __HAL_RCC_TIM7_FORCE_RESET();
668 __HAL_RCC_TIM7_RELEASE_RESET();
669 }
670#endif
671#ifdef USE_TIM8
672 if(htim->Instance==TIM8)
673 {
674 __HAL_RCC_TIM8_FORCE_RESET();
675 __HAL_RCC_TIM8_RELEASE_RESET();
676 }
677#endif
678#ifdef USE_TIM9
679 if(htim->Instance==TIM9)
680 {
681 __HAL_RCC_TIM9_FORCE_RESET();
682 __HAL_RCC_TIM9_RELEASE_RESET();
683 }
684#endif
685#ifdef USE_TIM10
686 if(htim->Instance==TIM10)
687 {
688 __HAL_RCC_TIM10_FORCE_RESET();
689 __HAL_RCC_TIM10_RELEASE_RESET();
690 }
691#endif
692#ifdef USE_TIM11
693 if(htim->Instance==TIM11)
694 {
695 __HAL_RCC_TIM11_FORCE_RESET();
696 __HAL_RCC_TIM11_RELEASE_RESET();
697 }
698#endif
699#ifdef USE_TIM12
700 if(htim->Instance==TIM12)
701 {
702 __HAL_RCC_TIM12_FORCE_RESET();
703 __HAL_RCC_TIM12_RELEASE_RESET();
704 }
705#endif
706#ifdef USE_TIM13
707 if(htim->Instance==TIM13)
708 {
709 __HAL_RCC_TIM13_FORCE_RESET();
710 __HAL_RCC_TIM13_RELEASE_RESET();
711 }
712#endif
713#ifdef USE_TIM14
714 if(htim->Instance==TIM14)
715 {
716 __HAL_RCC_TIM14_FORCE_RESET();
717 __HAL_RCC_TIM14_RELEASE_RESET();
718 }
719#endif
720}
721//-------------------------TIM INIT FUNCTIONS------------------------
722//-------------------------------------------------------------------
Заголовочный файл для модуля инициализации таймеров и работы с ними.
#define check_null_ptr_2(p1, p2)
Проверить два указателя на NULL.
Definition mylibs_defs.h:41
#define check_null_ptr_1(p1)
Проверить один указатель на NULL.
Definition mylibs_defs.h:38
#define check_null_ptr_3(p1, p2, p3)
Проверить три указателя на NULL.
Definition mylibs_defs.h:44
#define MyLibs_Error_Handler(params)
Error_Handler который будет вызыватся в библиотеке
Definition mylibs_defs.h:31
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
Включить тактирование порта GPIO.
int GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart)
Считать состоянии кнопки
HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State)
Инициализировать кнопку (структуру кнопки)
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 *henc, 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 таймеров.
void TIM_Base_MspInit(TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode)
Инициализация CLK и NVIC таймеров.
TIM_ITModeTypeDef
Режим прерываний таймера
Definition general_tim.h:78
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN)
Инициализация выхода ШИМ таймера.
HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
Инициализация OC компаратора таймера.
Структура инициализации енкодера
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
Желаемая частота таймера