/*==============================================================================
 * Инициализация тактирования с использованием бибилотеки PLIB035
 *------------------------------------------------------------------------------
 * ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
 *==============================================================================
 *                                  ЦНИИ СЭТ
 *==============================================================================
 */

//-- Includes ------------------------------------------------------------------
#include "periph_config.h"

__IO uint32_t uwTick; // Milliseconds ticks
//-- Defines -------------------------------------------------------------------

//-- Peripheral init functions -------------------------------------------------
void sysclk_init(void)
{
  OperationStatus status;
  status = RCU_PLL_AutoConfig(SYSCLK_CORE_CLOCK_MHZ*__MHZ, SYSCLK_Oscil_Type);
  if (status == ERROR)
  {
    Error_Handler();
  }
  SystemCoreClockUpdate();
  RCU_ClkOutConfig(RCU_SysPeriphClk_PLLClk, 1, ENABLE);
  RCU_ClkOutCmd(ENABLE);
      
  /*  Прерывание должно быть каждую миллисекунду:
      Для тактирования N Гц это каждый N / 1000 тик */
  SysTick_Config(SYSCLK_CORE_CLOCK_MHZ*__MHZ/1000);
}


uint32_t millis(void)
{
  return uwTick;
}
void millis_inc(void)
{
  uwTick++;
}
uint32_t micros(void)
{
  return 0;
}
void micros_inc(void)
{
  uwTick++;
}





OperationStatus rcu_set_clock_adc(RCU_PeriphClk_TypeDef ClkSrc, float ClkMHz, FunctionalState state)
{
  RCU_ADCClkCmd(DISABLE);
  uint32_t adc_raw_clock = 0;
  float adc_clock_div = 0;
  switch(ClkSrc)
  {
    case RCU_PeriphClk_OSEClk:
      adc_raw_clock = RCU_GetOSEClkFreq();
      break;
    case RCU_PeriphClk_OSIClk:
      adc_raw_clock = RCU_GetOSIClkFreq();
      break;
    case RCU_PeriphClk_PLLClk:
      adc_raw_clock = RCU_GetPLLClkFreq();
      break;
    case RCU_PeriphClk_PLLDivClk:
      adc_raw_clock = RCU_GetPLLDivClkFreq();
      break;
  }
  adc_clock_div = adc_raw_clock/(ClkMHz*__MHZ);
  if(adc_clock_div < 1)
    return ERROR;
  
  RCU_ADCClkConfig(ClkSrc, 7, ENABLE); //12.5MHz
  RCU_ADCClkCmd(ENABLE);
  return OK;
}