/**
  ******************************************************************************
  * @file    ADC/ADC_T15_TRGO/main.c  
  * @author  YSPRING Application Team
  * @version V1.0.1
  * @date    2023.3.20
  * @brief   Main program body
  ******************************************************************************
  */
/**
  ********************************  YS32F0xx  *********************************
  * @文件名     ： main.c

  * @摘要       ： ADC外部采样，TIM1 CC4计时触发注入通道
    
  ******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "ys32md211.h"
#include "delay.h"
#include "ys32md211_nucleo.h"

#include "pwm.h"
#include "COM.h"
#include "motor.h"
#include "key.h"
#include "M_speed.h"
#include "adc.h"
#include "protect_process.h"
uint8_t AdcEOC_Flag = 0;
uint16_t AdcData[6];

extern uint8_t  M_1ms_flag;
//extern uint8_t  work_state;
PI pi; 
HALL hall; 
M_par  m_par_set;
AD  AD_s;
M_SF  SF;
/**
  * @brief  定时器初始化
  * @param  None
  * @retval None
  */
#define TIM14_COUNTER_CLOCK       1000000                                                           
#define TIM14_PRESCALER_VALUE     (SystemCoreClock/TIM14_COUNTER_CLOCK - 1)  
#define TIM14_PERIOD_TIMING       (1000 - 1) 

#define TIM16_COUNTER_CLOCK       1000000                                                           
#define TIM16_PRESCALER_VALUE     (SystemCoreClock/TIM16_COUNTER_CLOCK - 1)  
#define TIM16_PERIOD_TIMING       (2 - 1)  

#define TIM17_COUNTER_CLOCK       1000000                                                           
#define TIM17_PRESCALER_VALUE     (SystemCoreClock/TIM17_COUNTER_CLOCK - 1) 
#define TIM17_PERIOD_TIMING       (25 - 1)  
/************************************************
函数名称 ： MX_TIM16_Init
功    能 ： TIM16初始化 
参    数 ： 无
返 回 值 ： 无
*************************************************/
void MX_TIM16_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_DeInit(TIM16);
    /* 使能TIM16的时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE);
  
    /* TIM16时基单元配置 */
    TIM_TimeBaseStructure.TIM_Prescaler = TIM16_PRESCALER_VALUE;        
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         
    TIM_TimeBaseStructure.TIM_Period = TIM16_PERIOD_TIMING;             
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;             
    TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure);
    /* 使能预分频值 */
    TIM_ARRPreloadConfig(TIM16, ENABLE);                                
}
/************************************************
函数名称 ： TIMDelay_N10us
功    能 ： 定时器延时N个10us 
参    数 ： 无
返 回 值 ： 无
*************************************************/
void TIMDelay_N10us(uint16_t Times)
{
    TIM_Cmd(TIM16, ENABLE);                                          
    while(Times--)
    {
        while((TIM_GetFlagStatus(TIM16, TIM_FLAG_Update))== RESET);                   
        TIM_ClearFlag(TIM16, TIM_FLAG_Update);
    }
    TIM_Cmd(TIM16, DISABLE);                                         
}

/************************************************
函数名称 ： TIMDelay_N10us
功    能 ： 定时器延时N个10us 
参    数 ： 无
返 回 值 ： 无
*************************************************/
void TIMDelay_N1us(uint16_t Times)
{
    TIM_Cmd(TIM16, ENABLE);                                          
    while(Times--)
    {
        while((TIM_GetFlagStatus(TIM16, TIM_FLAG_Update))== RESET);                   
        TIM_ClearFlag(TIM16, TIM_FLAG_Update);
    }
    TIM_Cmd(TIM16, DISABLE);                                         
}

/************************************************
函数名称 ： TIMDelay_Nms
功    能 ： 定时器延时Nms 
参    数 ： 无
返 回 值 ： 无
*************************************************/
void TIMDelay_Nms(uint16_t Times)
{
    while(Times--)
    {
        TIMDelay_N10us(100);
    }
}
//********************************************************************************
void TIM_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM17_IRQn ;   // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannelPriority = 2;    // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


/************************************************
函数名称 ： MX_TIM17_Init
功    能 ： TIM17初始化 
参    数 ： 无
返 回 值 ： 无
*************************************************/
void MX_TIM17_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_DeInit(TIM17);
    /* 使能TIM17的时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17, ENABLE);

  /* TIM17时基单元配置 */
    TIM_TimeBaseStructure.TIM_Prescaler = TIM17_PRESCALER_VALUE;        
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         
    TIM_TimeBaseStructure.TIM_Period = TIM17_PERIOD_TIMING;             
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;             
    TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);
    /* 使能预分频值 */
    TIM_ARRPreloadConfig(TIM17, ENABLE); 
    TIM_ClearFlag(TIM17, TIM_FLAG_Update);                   // 清除计数器中断标志位  
    TIM_ITConfig(TIM17,TIM_IT_Update,ENABLE);  
    //TIM_Cmd(TIM17, ENABLE);	
	  TIM_NVIC_Config();
}

//********************************************************************************
void TIM14_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn ;   // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannelPriority = 3;    // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


/************************************************
函数名称 ： MX_TIM17_Init
功    能 ： TIM17初始化 
参    数 ： 无
返 回 值 ： 无
*************************************************/
void MX_TIM14_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_DeInit(TIM14);
    /* 使能TIM17的时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM14, ENABLE);

  /* TIM17时基单元配置 */
    TIM_TimeBaseStructure.TIM_Prescaler = TIM14_PRESCALER_VALUE;        
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         
    TIM_TimeBaseStructure.TIM_Period = TIM14_PERIOD_TIMING;             
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;             
    TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
    /* 使能预分频值 */
    TIM_ARRPreloadConfig(TIM14, ENABLE); 
    TIM_ClearFlag(TIM14, TIM_FLAG_Update);                   // 清除计数器中断标志位  
    TIM_ITConfig(TIM14,TIM_IT_Update,ENABLE);  
    TIM_Cmd(TIM14, ENABLE);	
	  TIM14_NVIC_Config();
}
//********************************************************************************
/**
  * @brief  HSI SYSCLK 初始化
  * @param  None
  * @retval None
  */
void HSI_Sysclk_Init(void)
{
    FLASH_SetLatency(FLASH_Latency_1);                                  //flash读, 0个等待
    
    RCC_HSI_CLK(RCC_HSI_48M, RCC_HSI_CLK_Div1);                         //HSI48M/1
    
    RCC_HSICmd(ENABLE);                                                 //开启HSI    
    
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);                 //等待HSI RDY
    
    RCC_SYSCLKConfig(RCC_SOURCE_HSI);                                   //时钟切换至HSI
    
    while(RCC_GetSYSCLKSource() != RCC_SYSCLKSource_HSI);
    
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLKConfig(RCC_HCLK_Div1);
    
    SystemCoreClockUpdate();                                            //更新系统时钟(SystemCoreClock)
}

/**
  * @brief  定时器NVIC配置
  * @param  None
  * @retval None
  */
void ADC_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = ADC_COMP_IRQn; // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;     // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  ADC 初始化
  * @param  None
  * @retval None
  */
void ADC_Channel_Init(void)
{
    ADC_InitTypeDef ADC_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    ADC_DeInit(ADC);
    ADC_StructInit(&ADC_InitStruct);
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_ContinuousConvMode = ADC_ContinuousConvMode_OFF;
    ADC_InitStruct.ADC_ScanMode = ADC_ScanMode_ON;
    ADC_InitStruct.ADC_ExternalTrigInjectedConv = ADC_ExternalTrigInjectedConv_T1_CC4;
    ADC_InitStruct.ADC_ExternalTrigInjectedConvEdge = ADC_ExternalTrigInjectedConvEdge_EN;
    ADC_Init(ADC, &ADC_InitStruct);

    ADC_ClockModeConfig(ADC, ADC_ClockMode_PCLK_Div8);
    ADC_InjectedSequencerLengthConfig(ADC, 5);
    ADC_InjectedChannelConfig(ADC, ADC_Channel_1, 1, ADC_SampleTime_31_5Cycles);
    ADC_InjectedChannelConfig(ADC, ADC_Channel_2, 2, ADC_SampleTime_31_5Cycles);
    ADC_InjectedChannelConfig(ADC, ADC_Channel_3, 3, ADC_SampleTime_31_5Cycles);
    ADC_InjectedChannelConfig(ADC, ADC_Channel_4, 4, ADC_SampleTime_31_5Cycles);
    ADC_InjectedChannelConfig(ADC, ADC_Channel_5, 5, ADC_SampleTime_31_5Cycles);
    
    ADC_ClearFlag(ADC, ADC_FLAG_JEOSEQ);
    ADC_ITConfig(ADC, ADC_IT_JEOSEQ, ENABLE);
    ADC_Cmd(ADC, ENABLE);
}
//******************************************************//
void OPAMP2_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, ENABLE);
	  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;   
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; 
	  GPIO_Init(GPIOB, &GPIO_InitStructure);
	  
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_OPA2, ENABLE);
		OPAMP_Cmd(OPAMP2, ENABLE);
}
/**
  * @brief  主函数
  * @param  None
  * @retval None
  */
int main(void)
{
    HSI_Sysclk_Init();
   // BSP_UART_Init();
    COMP_Config();
    /* TIM Configuration */
    TIM1_PWM_Config();
//	 SysTick_Config(SystemCoreClock/1000); // MX_TIM14_Init();
//    NVIC_EnableIRQ(SysTick_IRQn);
	  MX_TIM14_Init();
    NVIC_EnableIRQ(SysTick_IRQn);
	  IO_Configuration();
	  adc_config();
	  #if(M_Control_SET == 2)
	  TIM3_PwmCap_Init();
	  #endif
	  MX_TIM16_Init();
	  int_motor_commutate();
    adc_int();
	  #if(OPAM_EN == 1)
	   OPAMP2_Config();
	   INT_REF_DATA();
	  #endif
	  MX_TIM17_Init();
	  
    while(1)
    {
       if(M_1ms_flag)
			{
				 
			   M_1ms_flag=0;
				 key_process();
				 bldc_process();
				 adc_data_process();
				 Speed_process(); 
			   Electrical_Angle_Phase_Calculation(); 
				 PwmCap_IRQ();
				 adc_pwm_process();
				 protect_process();
			}
			 
			 mc_speed_calc();  
    }
}
