/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    tim.h
  * @brief   This file contains all the function prototypes for
  *          the tim.c file
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TIM_H__
#define __TIM_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

extern TIM_HandleTypeDef htim1;

extern TIM_HandleTypeDef htim2;

extern TIM_HandleTypeDef htim4;

extern TIM_HandleTypeDef htim5;

extern TIM_HandleTypeDef htim8;

extern TIM_HandleTypeDef htim9;

/* USER CODE BEGIN Private defines */

//Choose the frequencies of TIM1 and TIM8
//#define TIM_8KHZ
#define TIM_10KHZ
//#define TIM_12KHZ
//#define TIM_16KHZ
//#define TIM_20KHZ

#if   defined(TIM_8KHZ)
  #define TIM_PERIOD  (11250-1)
#elif defined(TIM_10KHZ)
  #define TIM_PERIOD  (9000-1)
#elif defined(TIM_12KHZ)
  #define TIM_PERIOD  (7500-1)
#elif defined(TIM_16KHZ)
  #define TIM_PERIOD  (5625-1)
#elif defined(TIM_20KHZ)
  #define TIM_PERIOD  (4500-1)
#else
  #define TIM_PERIOD  (9000-1)
#endif

//#define DEAD_500ns
#define DEAD_600ns
//#define DEAD_700ns
//#define DEAD_800ns
//#define DEAD_900ns
//#define DEAD_1us

#if   defined(DEAD_500ns)
  #define TIM_DEAD  (90-1)
#elif defined(DEAD_600ns)
  #define TIM_DEAD  (108-1)
#elif defined(DEAD_700ns)
  #define TIM_DEAD  (126-1)
#elif defined(DEAD_800ns)
  #define TIM_DEAD  (136-1)
#elif defined(DEAD_900ns)
  #define TIM_DEAD  (145-1)
#elif defined(DEAD_1us)
  #define TIM_DEAD  (155-1)
#else
  #define TIM_DEAD  (180-1) // 1.25us
#endif
  
  
/**
  *
  * interrupt  @arg TIM_IT_UPDATE: Update interrupt
  *            @arg TIM_IT_CC1:   Capture/Compare 1 interrupt
  *            @arg TIM_IT_CC2:  Capture/Compare 2 interrupt
  *            @arg TIM_IT_CC3:  Capture/Compare 3 interrupt
  *            @arg TIM_IT_CC4:  Capture/Compare 4 interrupt
  *            @arg TIM_IT_COM:   Commutation interrupt
  *            @arg TIM_IT_TRIGGER: Trigger interrupt
  *            @arg TIM_IT_BREAK: Break interrupt
  *
  * channel    @arg TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  *
  */
#define __TIM_DISABLE(__HANDLE__)               ((__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN))

#define TIM1_Start()                            __HAL_TIM_ENABLE(&htim1)
#define TIM1_Stop()                             __TIM_DISABLE(&htim1)
#define TIM1_Enable_IT(interrupt)               __HAL_TIM_ENABLE_IT(&htim1, interrupt)
#define TIM1_Disable_IT(interrupt)              __HAL_TIM_DISABLE_IT(&htim1, interrupt)
#define TIM1_PWM_Start_IT(channel)              HAL_TIM_PWM_Start_IT(&htim1, channel)
#define TIM1_PWM_Stop_IT(channel)               HAL_TIM_PWM_Stop_IT(&htim1, channel)
#define TIM1_PWMN_Start_IT(channel)             HAL_TIMEx_PWMN_Start_IT(&htim1, channel)
#define TIM1_PWMN_Stop_IT(channel)              HAL_TIMEx_PWMN_Stop_IT(&htim1, channel)
#define TIM1_GetAutoreload()                    __HAL_TIM_GetAutoreload(&htim1)
#define TIM1_SetAutoreload(period)              __HAL_TIM_SetAutoreload(&htim1, period)
#define TIM1_GetPrescaler()                     ((&htim1)->Instance->PSC)
#define TIM1_SetPrescaler(scale)                __HAL_TIM_PRESCALER(&htim1, scale)
#define TIM1_GetCounter()                       __HAL_TIM_GetCounter(&htim1)
#define TIM1_SetCounter(value)                  __HAL_TIM_SetCounter(&htim1, value)
#define TIM1_GetCompare(channel)                __HAL_TIM_GetCompare(&htim1, channel)
#define TIM1_SetCompare(channel, value)         __HAL_TIM_SetCompare(&htim1, channel, value)
#define TIM1_IsDownCounter()                    __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1)
#define TIM1_SetDeadTime(value)                 ((&htim1)->Instance->BDTR = ((&htim1)->Instance->BDTR&0xFF00)|((value)&0x00FF))   //value: 0~255  (see DTG[7:0] on p.516 in RM0390)
#define TIM1_SetMode(mode)                      ((&htim1)->Instance->CR1  = ((&htim1)->Instance->CR1 &0xFF9F)|(((mode)&0x03)<<5)) //mode : 0(Edge), 1~3(Center-Aligned)
#define TIM1_SetRepetition(count)               ((&htim1)->Instance->RCR  = (count)&0xFF)                                         //Repetition Counter : 0~255 => 1~256

#define TIM2_Start()                            __HAL_TIM_ENABLE(&htim2)
#define TIM2_Stop()                             __TIM_DISABLE(&htim2)
#define TIM2_Encoder_Start_IT()                 HAL_TIM_Encoder_Start_IT(&htim2, TIM_CHANNEL_ALL)
#define TIM2_Enable_IT(interrupt)               __HAL_TIM_ENABLE_IT(&htim2, interrupt)
#define TIM2_Disable_IT(interrupt)              __HAL_TIM_DISABLE_IT(&htim2, interrupt)
#define TIM2_GetAutoreload()                    __HAL_TIM_GetAutoreload(&htim2)             //32bit
#define TIM2_SetAutoreload(period)              __HAL_TIM_SetAutoreload(&htim2, period)     //32bit
#define TIM2_GetPrescaler()                     ((&htim2)->Instance->PSC)
#define TIM2_SetPrescaler(scale)                __HAL_TIM_PRESCALER(&htim2, scale)
#define TIM2_GetCounter()                       __HAL_TIM_GetCounter(&htim2)                //32bit
#define TIM2_SetCounter(value)                  __HAL_TIM_SetCounter(&htim2, value)         //32bit
#define TIM2_GetCompare(channel)                __HAL_TIM_GetCompare(&htim2, channel)       //32bit
#define TIM2_SetCompare(channel, value)         __HAL_TIM_SetCompare(&htim2, channel, value)//32bit
#define TIM2_IsDownCounter()                    __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2)

#define TIM4_Start()                            __HAL_TIM_ENABLE(&htim4)
#define TIM4_Stop()                             __TIM_DISABLE(&htim4)
#define TIM4_Encoder_Start_IT()                 HAL_TIM_Encoder_Start_IT(&htim4, TIM_CHANNEL_ALL)
#define TIM4_Enable_IT(interrupt)               __HAL_TIM_ENABLE_IT(&htim4, interrupt)
#define TIM4_Disable_IT(interrupt)              __HAL_TIM_DISABLE_IT(&htim4, interrupt)
#define TIM4_GetAutoreload()                    __HAL_TIM_GetAutoreload(&htim4)
#define TIM4_SetAutoreload(period)              __HAL_TIM_SetAutoreload(&htim4, period)
#define TIM4_GetPrescaler()                     ((&htim4)->Instance->PSC)
#define TIM4_SetPrescaler(scale)                __HAL_TIM_PRESCALER(&htim4, scale)
#define TIM4_GetCounter()                       __HAL_TIM_GetCounter(&htim4)
#define TIM4_SetCounter(value)                  __HAL_TIM_SetCounter(&htim4, value)
#define TIM4_GetCompare(channel)                __HAL_TIM_GetCompare(&htim4, channel)
#define TIM4_SetCompare(channel, value)         __HAL_TIM_SetCompare(&htim4, channel, value)
#define TIM4_IsDownCounter()                    __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4)

#define TIM8_Start()                            __HAL_TIM_ENABLE(&htim8)
#define TIM8_Stop()                             __TIM_DISABLE(&htim8)
#define TIM8_Enable_IT(interrupt)               __HAL_TIM_ENABLE_IT(&htim8, interrupt)
#define TIM8_Disable_IT(interrupt)              __HAL_TIM_DISABLE_IT(&htim8, interrupt)
#define TIM8_PWM_Start_IT(channel)              HAL_TIM_PWM_Start_IT(&htim8, channel)
#define TIM8_PWM_Stop_IT(channel)               HAL_TIM_PWM_Stop_IT(&htim8, channel)
#define TIM8_PWMN_Start_IT(channel)             HAL_TIMEx_PWMN_Start_IT(&htim8, channel)
#define TIM8_PWMN_Stop_IT(channel)              HAL_TIMEx_PWMN_Stop_IT(&htim8, channel)
#define TIM8_GetAutoreload()                    __HAL_TIM_GetAutoreload(&htim8)
#define TIM8_SetAutoreload(period)              __HAL_TIM_SetAutoreload(&htim8, period)
#define TIM8_GetPrescaler()                     ((&htim8)->Instance->PSC)
#define TIM8_SetPrescaler(scale)                __HAL_TIM_PRESCALER(&htim8, scale)
#define TIM8_GetCounter()                       __HAL_TIM_GetCounter(&htim8)
#define TIM8_SetCounter(value)                  __HAL_TIM_SetCounter(&htim8, value)
#define TIM8_GetCompare(channel)                __HAL_TIM_GetCompare(&htim8, channel)
#define TIM8_SetCompare(channel, value)         __HAL_TIM_SetCompare(&htim8, channel, value)
#define TIM8_IsDownCounter()                    __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim8)
#define TIM8_SetDeadTime(value)                 ((&htim8)->Instance->BDTR = ((&htim8)->Instance->BDTR&0xFF00)|((value)&0x00FF))   //value: 0~255  (see DTG[7:0] on p.516 in RM0390)
#define TIM8_SetMode(mode)                      ((&htim8)->Instance->CR1  = ((&htim8)->Instance->CR1 &0xFF9F)|(((mode)&0x03)<<5)) //mode : 0(Edge), 1~3(Center-Aligned)
#define TIM8_SetRepetition(count)               ((&htim8)->Instance->RCR  = (count)&0xFF)                                         //Repetition Counter : 0~255 => 1~256

#define TIM9_Start()                            __HAL_TIM_ENABLE(&htim9)
#define TIM9_Stop()                             __TIM_DISABLE(&htim9)
#define TIM9_Enable_IT(interrupt)               __HAL_TIM_ENABLE_IT(&htim9, interrupt)
#define TIM9_Disable_IT(interrupt)              __HAL_TIM_DISABLE_IT(&htim9, interrupt)
#define TIM9_PWM_Start_IT(channel)              HAL_TIM_PWM_Start_IT(&htim9, channel)
#define TIM9_PWM_Stop_IT(channel)               HAL_TIM_PWM_Stop_IT(&htim9, channel)
#define TIM9_GetAutoreload()                    __HAL_TIM_GetAutoreload(&htim9)
#define TIM9_SetAutoreload(period)              __HAL_TIM_SetAutoreload(&htim9, period)
#define TIM9_GetPrescaler()                     ((&htim9)->Instance->PSC)
#define TIM9_SetPrescaler(scale)                __HAL_TIM_PRESCALER(&htim9, scale)
#define TIM9_GetCounter()                       __HAL_TIM_GetCounter(&htim9)
#define TIM9_SetCounter(value)                  __HAL_TIM_SetCounter(&htim9, value)
#define TIM9_GetCompare(channel)                __HAL_TIM_GetCompare(&htim9, channel)
#define TIM9_SetCompare(channel, value)         __HAL_TIM_SetCompare(&htim9, channel, value)
#define TIM9_IsDownCounter()                    __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim9)

/* USER CODE END Private defines */

void MX_TIM1_Init(void);
void MX_TIM2_Init(void);
void MX_TIM4_Init(void);
void MX_TIM5_Init(void);
void MX_TIM8_Init(void);
void MX_TIM9_Init(void);

void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);

/* USER CODE BEGIN Prototypes */
void    Encoder_Task(void);

///somebp 2024.02.02
#define REGEN_ON              (-10)           //-10A
#define REGEN_SCALE           600             //Always On if 0(or negative)
void  Regen_Resistor_Init(void);
void  Regen_Resistor_Control(void);
void  Regen_Resistor_Control_HSW(void);
void  Derating_Control(uint8_t side);

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __TIM_H__ */

