/**********************************TIM**************************************
Данный файл содержит объявления базовых функции и дефайны для инициализации 
таймеров.
***************************************************************************/
#ifndef __TIM_GENERAL_H_
#define __TIM_GENERAL_H_

/////////////////////////////////////////////////////////////////////
/////////////////////////---USER SETTINGS---/////////////////////////
#define HAL_TIM_MODULE_ENABLED // need to uncomment this define in stm32f4xx_hal_conf.h

#define USE_TIM1
#define USE_TIM2
#define USE_TIM3
#define USE_TIM4
#define USE_TIM5
#define USE_TIM6
#define USE_TIM7
#define USE_TIM8
#define USE_TIM9
#define USE_TIM10
#define USE_TIM11
#define USE_TIM12
#define USE_TIM13
#define USE_TIM14
/* note: used uart defines in modbus.h */

/////////////////////////---USER SETTINGS---/////////////////////////
#include "periph_general.h"

/////////////////////////////////////////////////////////////////////
////////////////////////////---DEFINES---////////////////////////////
#define TIM_IT_CONF_Pos						0
//#define TIM_PWM_CONF_Pos					1
//#define TIM_CLCK_SRC_CONF_Pos			2
//#define TIM_SLAVE_CONF_Pos				3
//#define TIM_MASTER_CONF_Pos				4
//#define TIM_BDTR_CONF_Pos					5

#define TIM_IT_CONF 	(1<<(TIM_IT_CONF_Pos))
//#define TIM_PWM_CONF 			(1<<(TIM_PWM_Pos))


#define TIM_Alternate_Mapping(INSTANCE) 			 ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: 																										\
																								(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3:  													\
																								(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8:  \
																								(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: 												\
																								(0))
////////////////////////////---DEFINES---////////////////////////////]



/////////////////////////////////////////////////////////////////////
///////////////////////---STRUCTURES & ENUMS---//////////////////////
typedef enum
{
	TIM_DEFAULT = 				0,
	TIM_IT_MODE = 				TIM_IT_CONF,
//	TIM_PWM_MODE = 				TIM_PWM_ENABLE,
//	TIM_PWM_IT_MODE = 		TIM_PWM_ENABLE | TIM_IT_CONF,
}TIM_ITModeTypeDef;


typedef enum
{
	TIM_Base_Disable = 			0,
	TIM_TickBase_1US = 			1,
	TIM_TickBase_10US = 		10,
	TIM_TickBase_100US = 		100,
	TIM_TickBase_1MS = 			1000,
	TIM_TickBase_10MS = 		10000,
	TIM_TickBase_100MS = 		100000,
}TIM_MHzTickBaseTypeDef;

typedef struct // struct with settings for custom function
{
	TIM_HandleTypeDef 			htim;
	TIM_ClockConfigTypeDef	sClockSourceConfig;
	TIM_SlaveConfigTypeDef 	sSlaveConfig;
	TIM_MasterConfigTypeDef	sMasterConfig;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
	TIM_ITModeTypeDef 			sTimMode;
	
	TIM_MHzTickBaseTypeDef 	sTickBaseMHz;
	float 									sTimAHBFreqMHz;
	uint32_t 								sTimFreqHz;
	
}TIM_SettingsTypeDef;
///////////////////////---STRUCTURES & ENUMS---//////////////////////

/////////////////////////////////////////////////////////////////////
///////////////////////////---FUNCTIONS---///////////////////////////
/**  
	* @brief 	Initialize TIM with TIM_SettingsTypeDef structure.
	* @param 	stim - указатель на структуру с настройками таймера.
  * @return HAL status.
	* @note 	Данная структура содержит хендл таймера и структуры для его настройки.
	*/
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim);
/**  
	* @brief 	Initialize PWM Channel and GPIO for output.
	* @param 	htim 				- указатель на хендл таймера.
	* @param 	sConfigOC 	- указатель на настрйоки канала таймера.
	* @param 	TIM_CHANNEL - канал таймера для настройки.
	* @param 	GPIOx 			- порт для вывода ШИМ.
	* @param 	GPIO_PIN 		- пин для вывода ШИМ.
  * @return HAL status.
	*/
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN);
/**  
	* @brief 	Initialize TIMs clock and interrupt.
	* @param 	htim - указатель на хендл таймера.
	* @note 	Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров,
						дефайнами в tim_general.h определяются используемые таймеры.
	*/
void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode);
/**  
	* @brief 	DeInitialize TIMs clock and interrupt.
	* @param 	htim - указатель на хендл таймера.
	* @note 	Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров,
						дефайнами в tim_general.h определяются используемые таймеры.
	*/
void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim);
///////////////////////////---FUNCTIONS---///////////////////////////


#endif // __TIM_GENERAL_H_