/**
  ******************************************************************************
  * @file    sysclk.h
  * @author  Разваляев Алексей
  * @brief   Драйвер тактирования системы на основе PLIB035.
  *          Данный файл содержит определения типов, структур и прототипы функций
  *          для работы с системным тактированием, включая:
  *           + Типы системных тиков
  *           + Структуру для управления коллбеками
  *           + Прототипы функций для инициализации тактирования
  *           + Функции настройки тактирования периферии
  *           + Функции работы со временем
  *
  ******************************************************************************
  */
  
#ifndef __RCU_H
#define __RCU_H
//-- Includes ------------------------------------------------------------------
#include "plib035.h"
#include "retarget_conf.h"

//-- Defines -------------------------------------------------------------------

/** @brief Конвертация МГц в Гц */
#define __MHZ 1000000

/** @brief Максимальное количество коллбеков */
#define SYSCLK_NUMB_OF_CUSTOM_CALLBACKS 16


//-- Exported variables --------------------------------------------------------
extern __IO uint32_t msTick;
extern __IO uint32_t usTick;

//-- Types ---------------------------------------------------------------------
/**
  * @brief Типы частот системных тиков
  */
typedef enum
{
  SYSCLK_Tick_1us     = 1000000,  /**< Тик 1 микросекунда */
  SYSCLK_Tick_10us    = 100000,   /**< Тик 10 микросекунд */
  SYSCLK_Tick_100us   = 10000,    /**< Тик 100 микросекунд */
  SYSCLK_Tick_1ms     = 1000,     /**< Тик 1 миллисекунда */
  SYSCLK_Tick_10ms    = 100,      /**< Тик 10 миллисекунд */
  SYSCLK_Tick_100ms   = 10,       /**< Тик 100 миллисекунд */
}SYSCLK_TickHz_TypeDef;

/**
  * @brief Структура для управления системными коллбеками
  */
typedef struct
{
  int CallbackInUse;                                        /**< Количество активных коллбеков */
  void (*Callback[SYSCLK_NUMB_OF_CUSTOM_CALLBACKS])(void);  /**< Массив указателей на функции-коллбеки */
  uint32_t CallbackPeriod[SYSCLK_NUMB_OF_CUSTOM_CALLBACKS]; /**< Периоды вызова коллбеков в мс */
  uint32_t CallbackPrevMs[SYSCLK_NUMB_OF_CUSTOM_CALLBACKS]; /**< Время последнего вызова коллбеков */
} SYSCLK_CallbackHandleTypeDef;


//-- Exported functions prototypes ---------------------------------------------
/* Инициализация системного тактирования */
void sysclk_init(void);
/* Общий обработчик прерываний SysClock */
void sysclk_irq_handler(void);

/* Добавление периодического коллбека */
OperationStatus SYSCLK_Set_Callback(void (*Callback)(void), uint32_t PeriodInMs);

/* Получение текущего времени в миллисекундах */
uint32_t millis(void);
/* Получение текущего времени в микросекундах */
uint32_t micros(void);

/* Настройка тактирования АЦП */
OperationStatus rcu_set_clock_adc(RCU_PeriphClk_TypeDef ClkSrc, float ClkMHz, FunctionalState state);
#endif /*__RCU_H*/
