/*==============================================================================
 * @file    periph_config.h
 * @author  Разваляев Алексей
 *------------------------------------------------------------------------------
 * Общий файл конфигурации периферии проекта.
 *
 * Содержит:
 *  + Глобальные флаги включения периферии (USE_...)
 *  + Конфигурации тактирования и источников RCU
 *  + Таблицы конфигурации GPIO
 *  + Конфигурационные структуры для периферии:
 *      - GPIO
 *      - UART
 *      - TMR (таймеры)
 *      - ADC (SEQ и DC)
 *      - DMA
 *      - NVIC (приоритеты прерываний)
 *
 * Используется драйверами:
 *  - gpio.c
 *  - uart.c
 *  - tmr.c
 *  - adc.c
 *  - dma.c
 *
 * Реализация инициализации периферии находится в соответствующих *.c файлах.
 *==============================================================================
 */
#pragma once
//-- Includes ------------------------------------------------------------------
#include "sysclk.h"
#include "gpio.h"
#include "uart.h"
#include "tmr.h"
#include "adc.h"

/* Обработчик ошибок */
void Error_Handler(void);

//-- Общие Конфигурации -------------------------------------------------------
// 0 - использовать периферию
// 1 - не использовать

/* UART */
#define USE_UART0     0   /*!< Использовать UART0 */
#define USE_UART1     1   /*!< Использовать UART1 */

/* Timers */
#define USE_TMR0      1   /*!< Использовать Таймер 0 */
#define USE_TMR1      1   /*!< Использовать Таймер 1 */
#define USE_TMR2      1   /*!< Использовать Таймер 2 */
#define USE_TMR3      0   /*!< Использовать Таймер 3 */

/* ADC */
#define USE_ADC_SEQ0  0   /*!< Использовать Секвенсор 0 */
#define USE_ADC_SEQ1  1   /*!< Использовать Секвенсор 1 */
#define USE_ADC_DC0   0   /*!< Использовать Компаратор 0 */
#define USE_ADC_DC1   0   /*!< Использовать Компаратор 1 */
#define USE_ADC_DC2   0   /*!< Использовать Компаратор 2 */
#define USE_ADC_DC3   0   /*!< Использовать Компаратор 3 */

/** @note Для RETARGET надо объявить этот дефайн в проекте
      Options for Target -> C/C++ -> Defines
*/
//#define RETARGET    // закоментирован  - отключен, 
//                    // разкоментирован - включен
//#define RETARGET_USE_ITM  // закоментирован - использовать UART, 
//                          // разкоментирован - использовать ITM
// Для дальнейшей настройки RETARGET -> retarget_conf.h

//-- RCU Конфигурации ---------------------------------------------------------
/** @brief Источник тактирования МК
  * @note Система всегда стартует с внутреннего МК и после потом переходит на PLL и заданный здесь источник
          Поменять тактировние при старте можно в system_K1921VK035.h
  */
static RCU_PLL_Ref_TypeDef SYSCLK_Oscil_Type = RCU_PLL_Ref_OSEClk;

/** @brief Желаемая частота тактирования МК в МГц*/
#define SYSCLK_CORE_CLOCK_MHZ 100

/** @brief Частота тиков uwTick тактирования МК */
static SYSCLK_TickHz_TypeDef SYSCLK_TickType = SYSCLK_Tick_1ms;

//-- GPIO Конфигурации --------------------------------------------------------
/** @note 
  Note: 
  Периферия сама настроит нужные пины в gpiox_config на альтернативные функции
*/

/** @brief Конфигурации пинов порта GPIOA */
static GPIO_Init_TypeDef gpioa_config[] = {
//  Pin,          Mode,                 OutMode,          InMode,               PullMode,               DriveMode
  { GPIO_Pin_0,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_1,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_2,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_3,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_4,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_5,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_6,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_7,   GPIO_PinMode_Output,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_8,   GPIO_PinMode_Output,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_9,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_10,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_11,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_12,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_13,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_14,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_15,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
};

/** @brief Конфигурации пинов порта GPIOB */
static GPIO_Init_TypeDef gpiob_config[] = {
//  Pin,          Mode,                 OutMode,          InMode,               PullMode,               DriveMode
  { GPIO_Pin_0,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_1,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_2,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_3,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_4,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_5,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_6,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_7,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_8,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_9,   GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_10,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_11,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_12,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_13,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_14,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
  { GPIO_Pin_15,  GPIO_PinMode_Unused,  GPIO_OutMode_PP,  GPIO_InMode_Schmitt,  GPIO_PullMode_Disable,  GPIO_DriveMode_HighFast },
};



//-- UART Конфигурации --------------------------------------------------------
#if USE_UART0==1
static UART_ExtInit_TypeDef uart0_config = {
//StopBit,          ParityBit,                DataWidth,          BaudRate,   FIFO,     Direction
  UART_StopBit_1,   UART_ParityBit_Disable,   UART_DataWidth_8,   115200,     DISABLE,  UART_Direction_RxTx,
//RxCallback    TxCallback    IdleCallback  ErrCallback          
  NULL,         NULL,         NULL,         NULL
};
#endif

#if USE_UART1==1
static UART_ExtInit_TypeDef uart1_config = {
//StopBit,          ParityBit,                DataWidth,          BaudRate,   FIFO,     Direction
  UART_StopBit_1,   UART_ParityBit_Disable,   UART_DataWidth_8,   115200,     DISABLE,  UART_Direction_RxTx,
//RxCallback    TxCallback    IdleCallback  ErrCallback          
  NULL,         NULL,         NULL,         NULL
};
#endif



//-- TMR Конфигурации ---------------------------------------------------------
/** @note Макросы для задания периода:
  * - LOAD(Period, Prescaler) - период в тиках и прескалер*
  * - FREQ_HZ(Hz) - период таймера в Герцах
  * - PERIOD_US(us) - период в микросекундах
  * * Т.к. аппаратного прескалера нет, используется программный.
  * Получить тики будто бы они с прескалером можно функциями TMR_Get_Cnt, TMR_Get_Period
  */
#if USE_TMR0==1
static TMR_ExtInit_TypeDef tmr0_config = {
//SystemCoreClock,        Period Update
  SYSCLK_CORE_CLOCK_MHZ,  LOAD(0xFFFFFFFF, SYSCLK_CORE_CLOCK_MHZ-1),
//IT          ADCSOC      DMAReq      ExtInput
  DISABLE,    DISABLE,    DISABLE,    TMR_ExtInput_Disable
};
#endif

#if USE_TMR1==1
static TMR_ExtInit_TypeDef tmr1_config = {
//SystemCoreClock,        Period Update
  SYSCLK_CORE_CLOCK_MHZ,  FREQ_HZ(10),
//IT          ADCSOC      DMAReq      ExtInput
  DISABLE,    DISABLE,    DISABLE,    TMR_ExtInput_Disable
};
#endif

#if USE_TMR2==1
static TMR_ExtInit_TypeDef tmr2_config = {
//SystemCoreClock,        Period Update
  SYSCLK_CORE_CLOCK_MHZ,  PERIOD_US(1000000),
//IT          ADCSOC      DMAReq      ExtInput
  DISABLE,    DISABLE,    DISABLE,    TMR_ExtInput_Disable
};
#endif

#if USE_TMR3==1
static TMR_Init_TypeDef tmr3_config = {
//SystemCoreClock,        Period Update
  SYSCLK_CORE_CLOCK_MHZ,  PERIOD_US(1000),
//IT          ADCSOC      DMAReq      ExtInput
  DISABLE,    DISABLE,    DISABLE,    TMR_ExtInput_Disable
};
#endif

//-- ADC Конфигурации -----------------------------------------------------
/** @brief Источник тактирования АЦП */
static RCU_PeriphClk_TypeDef ADC_ClockSource = RCU_PeriphClk_PLLClk;
/** @brief Желаемая частота тактирования АЦП в МГц*/
static float ADC_ClockMHz = 12.5;
/** @brief Пины каких каналов инициализировать для АЦП */
static ADC_ChannelEnableTypeDef adc_ch_config = {
//Channel 0,    Channel 1,    Channel 2,    Channel 3  
  ENABLE,       ENABLE,       ENABLE,       ENABLE,
};
//-- ADC SEQ Конфигурации -----------------------------------------------------
#if USE_ADC_SEQ0==1
static ADC_SEQ_ExtInit_TypeDef adc_seq0_config = {
//StartEvent,                     SWStartEn
  ADC_SEQ_StartEvent_SwReq,       ENABLE,
//Req[0],       Req[1],       Req[2],       Req[3]
  ADC_CH_Num_0, ADC_CH_Num_1, ADC_CH_Num_2, ADC_CH_Num_3,
//ReqMax,               ReqAverage,           ReqAverageEn
  ADC_SEQ_ReqNum_1,     ADC_SEQ_Average_2,    DISABLE,
//RestartCount,     RestartAverageEn,   RestartTimer (в тиках ADC_ClockMHz)
  0,                DISABLE,            0,
//DCEn[0],    DCEn[1],    DCEn[2],    DCEn[3]
  DISABLE,    DISABLE,    DISABLE,    DISABLE,
//DMAFIFOLevel,             DMAEn
  ADC_SEQ_DMAFIFOLevel_1,   DISABLE,
  //IT,     ITCount   BufferCircular
  ENABLE,   0,        ENABLE,
//SEQCpltCallback,    BuffHalfCallback,   BuffFullCallback,   ErrorCallback
  NULL,               NULL,               NULL,               NULL,
};
#endif
#if USE_ADC_SEQ1==1
static ADC_SEQ_ExtInit_TypeDef adc_seq1_config = {
//StartEvent,                     SWStartEn
  ADC_SEQ_StartEvent_SwReq,       ENABLE,
//Req[0],       Req[1],       Req[2],       Req[3]
  ADC_CH_Num_0, ADC_CH_Num_1, ADC_CH_Num_2, ADC_CH_Num_3,
//ReqMax,               ReqAverage,           ReqAverageEn
  ADC_SEQ_ReqNum_1,     ADC_SEQ_Average_2,    DISABLE,
//RestartCount,     RestartAverageEn,   RestartTimer (в тиках ADC_ClockMHz)
  0,                DISABLE,            0,
//DCEn[0],    DCEn[1],    DCEn[2],    DCEn[3]
  DISABLE,    DISABLE,    DISABLE,    DISABLE,
//DMAFIFOLevel,             DMAEn
  ADC_SEQ_DMAFIFOLevel_1,   DISABLE,
  //IT,     ITCount   BufferCircular
  ENABLE,   0,        ENABLE,
//SEQCpltCallback,    BuffHalfCallback,   BuffFullCallback,   ErrorCallback
  NULL,               NULL,               NULL,               NULL,
};
#endif

//-- ADC DC Конфигурации ------------------------------------------------------
#if USE_ADC_DC0==1
static ADC_DC_ExtInit_TypeDef adc_dc0_config = {
//DCOutput
  DISABLE,
//ThresholdLow,     ThresholdHigh
  0,                0,
//Source,               Channel,        Mode,                   Condition
  ADC_DC_Source_EOC,    ADC_CH_Num_1,   ADC_DC_Mode_Multiple,   ADC_DC_Condition_Low,
//IT
  DISABLE,
//DC_TrigCallback,  ErrorCallback
  NULL,             NULL
};
#endif
#if USE_ADC_DC1==1
static ADC_DC_ExtInit_TypeDef adc_dc1_config = {
//DCOutput
  DISABLE,
//ThresholdLow,     ThresholdHigh
  0,                0,
//Source,               Channel,        Mode,                   Condition
  ADC_DC_Source_EOC,    ADC_CH_Num_1,   ADC_DC_Mode_Multiple,   ADC_DC_Condition_Low,
//IT
  DISABLE,
//DC_TrigCallback,  ErrorCallback
  NULL,             NULL
};
#endif
#if USE_ADC_DC2==1
static ADC_DC_ExtInit_TypeDef adc_dc2_config = {
//DCOutput
  DISABLE,
//ThresholdLow,     ThresholdHigh
  0,                0,
//Source,               Channel,        Mode,                   Condition
  ADC_DC_Source_EOC,    ADC_CH_Num_1,   ADC_DC_Mode_Multiple,   ADC_DC_Condition_Low,
//IT
  DISABLE,
//DC_TrigCallback,  ErrorCallback
  NULL,             NULL
};
#endif
#if USE_ADC_DC3==1
static ADC_DC_ExtInit_TypeDef adc_dc3_config = {
//DCOutput
  DISABLE,
//ThresholdLow,     ThresholdHigh
  0,                0,
//Source,               Channel,        Mode,                   Condition
  ADC_DC_Source_EOC,    ADC_CH_Num_1,   ADC_DC_Mode_Multiple,   ADC_DC_Condition_Low,
//IT
  DISABLE,
//DC_TrigCallback,  ErrorCallback
  NULL,             NULL
};
#endif

//-- NVIC Конфигурации --------------------------------------------------------
/** @brief Приоритеты прерываний, 0 - самый высокий приоритет*/
static uint8_t NCIV_Priorities[] = 
{
  [GPIOA_IRQn]                =  0,
  [GPIOB_IRQn]                =  0,
  [TMR0_IRQn]                 =  0,
  [TMR1_IRQn]                 =  0,
  [TMR2_IRQn]                 =  0,
  [TMR3_IRQn]                 =  0,
  [UART0_TD_IRQn]             =  0,
  [UART0_RX_IRQn]             =  0,
  [UART0_TX_IRQn]             =  0,
  [UART0_E_RT_IRQn]           =  0,
  [UART1_TD_IRQn]             =  0,
  [UART1_RX_IRQn]             =  0,
  [UART1_TX_IRQn]             =  0,
  [UART1_E_RT_IRQn]           =  0,
  [SPI_RO_RT_IRQn]            =  0,
  [SPI_RX_IRQn]               =  0,
  [SPI_TX_IRQn]               =  0,
  [I2C_IRQn]                  =  0,
  [ECAP0_IRQn]                =  0,
  [ECAP1_IRQn]                =  0,
  [ECAP2_IRQn]                =  0,
  [PWM0_IRQn]                 =  0,
  [PWM0_HD_IRQn]              =  0,
  [PWM0_TZ_IRQn]              =  0,
  [PWM1_IRQn]                 =  0,
  [PWM1_HD_IRQn]              =  0,
  [PWM1_TZ_IRQn]              =  0,
  [PWM2_IRQn]                 =  0,
  [PWM2_HD_IRQn]              =  0,
  [PWM2_TZ_IRQn]              =  0,
  [QEP_IRQn]                  =  0,
  [ADC_SEQ0_IRQn]             =  0,
  [ADC_SEQ1_IRQn]             =  0,
  [ADC_DC_IRQn]               =  0,
  [CAN0_IRQn]                 =  0,
  [CAN1_IRQn]                 =  0,
  [CAN2_IRQn]                 =  0,
  [CAN3_IRQn]                 =  0,
  [CAN4_IRQn]                 =  0,
  [CAN5_IRQn]                 =  0,
  [CAN6_IRQn]                 =  0,
  [CAN7_IRQn]                 =  0,
  [CAN8_IRQn]                 =  0,
  [CAN9_IRQn]                 =  0,
  [CAN10_IRQn]                =  0,
  [CAN11_IRQn]                =  0,
  [CAN12_IRQn]                =  0,
  [CAN13_IRQn]                =  0,
  [CAN14_IRQn]                =  0,
  [CAN15_IRQn]                =  0,
  [DMA_CH0_IRQn]              =  0,
  [DMA_CH1_IRQn]              =  0,
  [DMA_CH2_IRQn]              =  0,
  [DMA_CH3_IRQn]              =  0,
  [DMA_CH4_IRQn]              =  0,
  [DMA_CH5_IRQn]              =  0,
  [DMA_CH6_IRQn]              =  0,
  [DMA_CH7_IRQn]              =  0,
  [DMA_CH8_IRQn]              =  0,
  [DMA_CH9_IRQn]              =  0,
  [DMA_CH10_IRQn]             =  0,
  [DMA_CH11_IRQn]             =  0,
  [DMA_CH12_IRQn]             =  0,
  [DMA_CH13_IRQn]             =  0,
  [DMA_CH14_IRQn]             =  0,
  [DMA_CH15_IRQn]             =  0,
  [WDT_IRQn]                  =  0,
  [RCU_IRQn]                  =  0,
  [MFLASH_IRQn]               =  0,
  [FPU_IRQn]                  =  0,
};
static inline void NVIC_SetAllPriorities(void)
{
  for(int i = 0; i < sizeof(NCIV_Priorities); i++)
  {
    NVIC_SetPriority((IRQn_Type)i, NCIV_Priorities[i]);
  }
}
//-- Utils --------------------------------------------------------------------


