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