#include "globalv.h"
#include "init.h"

uint8_t ADC_CR1Array[4] = {0x84, 0x85, 0x86, 0x87}; // 通过更改ADC的CR1寄存器实现ADC通道自动切换
uint8_t ADC_Start = 0x01;    

//void RCC_Configuration(void)
//{//48M,
//	
//	//.......................... 48M
//	RCC_HSI_Enable(RCC_HSIOSC_DIV6);
//	__RCC_FLASH_CLK_ENABLE();
//  FLASH_SetLatency(FLASH_Latency_3);  
//	RCC_HSI_Enable(RCC_HSIOSC_DIV1); 
//  //.............................  
//}



void RCC_Configuration(void)
{
  //...........................64M
  // 0. HSI使能并校准 
  RCC_HSI_Enable(RCC_HSIOSC_DIV6);

  // 1. 设置HCLK和PCLK的分频系数　
  RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
  RCC_PCLKPRS_Config(RCC_PCLK_DIV1);
  
  // 2. 使能PLL，通过PLL倍频到64MHz 
  RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, 8);     // HSI 默认输出频率8MHz

  ///< 当使用的时钟源HCLK大于24M,小于等于48MHz：设置FLASH 读等待周期为2 cycle
  ///< 当使用的时钟源HCLK大于48MHz：设置FLASH 读等待周期为3 cycle
  __RCC_FLASH_CLK_ENABLE();
  FLASH_SetLatency(FLASH_Latency_3);       
   
  // 3. 时钟切换到PLL
  RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
  RCC_SystemCoreClockUpdate(64000000);	
	//..............................
}

void GPIOInit(void)
{
	 GPIO_InitTypeDef GPIO_InitStruct;
	
	__RCC_GPIOA_CLK_ENABLE();
	__RCC_GPIOB_CLK_ENABLE();
	__RCC_GPIOC_CLK_ENABLE();
  __RCC_GPIOF_CLK_ENABLE();
  GPIO_InitStruct.IT = GPIO_IT_NONE; //LED1 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
	
  GPIO_InitStruct.Pins = LED_GPIO_PIN;
  GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
//  GPIO_InitStruct.Pins = LEDDIR_GPIO_PIN;
//  GPIO_Init(LEDDIR_GPIO_PORT, &GPIO_InitStruct);
//  GPIO_InitStruct.Pins = LEDSTSTO_GPIO_PIN;
//  GPIO_Init(LEDSTSTO_GPIO_PORT, &GPIO_InitStruct);
	GPIO_InitStruct.Pins = VOUT_EN_GPIO_PIN;
  GPIO_Init(VOUT_EN_GPIO_PORT, &GPIO_InitStruct);
	
	
//	GPIO_WritePin(LEDDIR_GPIO_PORT,LEDDIR_GPIO_PIN,GPIO_Pin_RESET); //方向指示灯亮
//	GPIO_WritePin(LEDSTSTO_GPIO_PORT,LEDSTSTO_GPIO_PIN,GPIO_Pin_SET); //启停指示灯灭
  GPIO_WritePin(VOUT_EN_GPIO_PORT,VOUT_EN_GPIO_PIN,GPIO_Pin_RESET); //启停指示灯灭


  GPIO_InitStruct.IT = GPIO_IT_NONE; 
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
	
  GPIO_InitStruct.Pins = EN_GPIO_PIN;
  GPIO_Init(EN_GPIO_PORT, &GPIO_InitStruct);
  GPIO_InitStruct.Pins = DR_GPIO_PIN;
  GPIO_Init(DR_GPIO_PORT, &GPIO_InitStruct);
	  GPIO_InitStruct.Pins = BKIN_GPIO_PIN;
  GPIO_Init(BKIN_GPIO_PORT, &GPIO_InitStruct);

}



void ADC_Configuration(void)
{
	   ADC_InitTypeDef   ADC_InitStruct;	 
		 DMA_InitTypeDef DMA_InitStruct = {0};
	
    __RCC_GPIOA_CLK_ENABLE();
    __RCC_GPIOB_CLK_ENABLE();
    __RCC_ADC_CLK_ENABLE();
		

    //配置ADC测试IO口 
    PA04_ANALOG_ENABLE() ;      //母线电压
    PA05_ANALOG_ENABLE() ;      //NTC温度
    PA06_ANALOG_ENABLE() ;      //电流
    PA07_ANALOG_ENABLE() ;      //电位器 
	
	
    ADC_InitStruct.ADC_AccEn = ADC_AccDisable;
    ADC_InitStruct.ADC_Align = ADC_AlignRight;
    ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div2; // ADCCLK=16MHz
    ADC_InitStruct.ADC_DMAEn = ADC_DmaEnable;
    ADC_InitStruct.ADC_InBufEn = ADC_BufDisable;
    ADC_InitStruct.ADC_OpMode = ADC_SingleChOneMode;
    ADC_InitStruct.ADC_SampleTime = ADC_SampTime10Clk;
    ADC_InitStruct.ADC_TsEn = ADC_TsDisable;
    ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA;

    ADC_Init(&ADC_InitStruct);

    CW_ADC->CR1_f.CHMUX = 3; // AN0
    ADC_Enable();

 // 使用4路DMA通道：CH1、CH2、CH3、 CH4
    // CH1 将ADC单次单通道的采样结果传入RAM（ADC_ResultBuff[6]）
    // CH2 将ADC的CR1寄存器的配置值从RAM（ADC_CR1Array）传入寄存器
    // CH3 将ADC的START寄存器的配置值从RAM（ADC_Start)传入寄存器
    // CH1、CH2、CH3由ADC硬件触发
    // CH4由ATIM硬件触发,启动ADC
		

    __RCC_DMA_CLK_ENABLE();

    DMA_InitStruct.DMA_DstAddress = (uint32_t)&SampleData[0];        // 目标地址
    DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase;                 // 目标地址递增
    DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK;                       // BLOCK传输模式
    DMA_InitStruct.DMA_SrcAddress = (uint32_t)&CW_ADC->RESULT0;     // 源地址： ADC的结果寄存器
    DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix;                 // 源地址固定
    DMA_InitStruct.DMA_TransferCnt = 0x4;                           // DMA传输次数
    DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_16BIT;    // 数据位宽16bit
    DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE; // ADC转换完成硬触发
    DMA_InitStruct.TrigMode = DMA_HardTrig;                         //  硬触发模式
    DMA_Init(CW_DMACHANNEL1, &DMA_InitStruct);
    DMA_Cmd(CW_DMACHANNEL1, ENABLE);

    DMA_InitStruct.DMA_DstAddress = (uint32_t)&CW_ADC->CR1;         // 目标地址
    DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Fix;                 // 目标地址固定
    DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK;                       // BLOCK传输模式
    DMA_InitStruct.DMA_SrcAddress = (uint32_t)&ADC_CR1Array[0];     // 源地址
    DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Increase;            // 源地址递增
    DMA_InitStruct.DMA_TransferCnt = 0x3;                           // DMA传输次数
    DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_8BIT;     // 数据位宽8bit
    DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE; // ADC转换完成硬触发
    DMA_InitStruct.TrigMode = DMA_HardTrig;                         //  硬触发模式
    DMA_Init(CW_DMACHANNEL2, &DMA_InitStruct);
    DMA_Cmd(CW_DMACHANNEL2, ENABLE);

    DMA_InitStruct.DMA_DstAddress = (uint32_t)&CW_ADC->START;       // 目标地址
    DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Fix;                 // 目标地址固定
    DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK;                       // BLOCK传输模式
    DMA_InitStruct.DMA_SrcAddress = (uint32_t)&ADC_Start;           // 源地址
    DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix;                 // 源地址固定
    DMA_InitStruct.DMA_TransferCnt = 0x3;                           // DMA传输次数
    DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_8BIT;     // 数据位宽8bit
    DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE;    // ADC转换完成硬触发
    DMA_InitStruct.TrigMode = DMA_HardTrig;                         //  硬触发模式
    DMA_Init(CW_DMACHANNEL3, &DMA_InitStruct);
    DMA_Cmd(CW_DMACHANNEL3, ENABLE);
    
    DMA_InitStruct.DMA_DstAddress = (uint32_t)&CW_ADC->START;       // 目标地址
    DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Fix;                 // 目标地址固定
    DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK;                       // BLOCK传输模式
    DMA_InitStruct.DMA_SrcAddress = (uint32_t)&ADC_Start;           // 源地址
    DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix;                 // 源地址固定
    DMA_InitStruct.DMA_TransferCnt = 0x1;                           // DMA传输次数
    DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_8BIT;     // 数据位宽8bit
    DMA_InitStruct.HardTrigSource = DMA_HardTrig_ATIM_CH1A2A3A4;    // ATIM硬件触发
    DMA_InitStruct.TrigMode = DMA_HardTrig;                         //  硬触发模式
    DMA_Init(CW_DMACHANNEL4, &DMA_InitStruct);
    DMA_Cmd(CW_DMACHANNEL4, ENABLE);

    DMA_ITConfig(CW_DMACHANNEL1, DMA_IT_TC, ENABLE);
		
		
    __disable_irq();
    NVIC_EnableIRQ(DMACH1_IRQn);
    __enable_irq();
}

void DMACH1_IRQHandlerCallBack(void)
{	
    CW_DMA->ICR_f.TC1 = 0x00;    // 清中断标志
    CW_ATIM->ICR  = 0x00;        // 清ATIM的中断标志
    CW_ADC->ICR = 0x00;          // 请ADC的中断标志
    CW_ADC->CR1 = 0x83;     // AdcIn = ch0
    //------------------------------------------------
    // DMA.CH1 : ADC_Result -> RAM
    CW_DMACHANNEL1->CNT = 0x10004; //传4个
    CW_DMACHANNEL1->SRCADDR = (uint32_t)(&CW_ADC->RESULT0);
    CW_DMACHANNEL1->DSTADDR = (uint32_t)(&SampleData[0]);
    CW_DMACHANNEL1->CSR_f.EN = 1;


    //------------------------------------------------
    // DMA.CH2 : RAM -> ADC_CR1
    CW_DMACHANNEL2->CNT = 0x10003; //传3个
    CW_DMACHANNEL2->SRCADDR = (uint32_t)(&ADC_CR1Array[1]);
    CW_DMACHANNEL2->DSTADDR = (uint32_t)(&CW_ADC->CR1);
    CW_DMACHANNEL2->CSR_f.EN = 1;

    //------------------------------------------------
    // DMA.CH3 : RAM -> ADC_START
    CW_DMACHANNEL3->CNT = 0x10003; //传3个
    CW_DMACHANNEL3->SRCADDR = (uint32_t)(&ADC_Start);
    CW_DMACHANNEL3->DSTADDR = (uint32_t)(&CW_ADC->START);
    CW_DMACHANNEL3->CSR_f.EN = 1;
    
    //------------------------------------------------
    // DMA.CH4 : RAM -> ADC_START
    CW_DMACHANNEL4->CNT = 0x10001; //传1个
    CW_DMACHANNEL4->SRCADDR = (uint32_t)(&ADC_Start);
    CW_DMACHANNEL4->DSTADDR = (uint32_t)(&CW_ADC->START);
    CW_DMACHANNEL4->CSR_f.EN = 1;		
}


void BTIM_init(void)
{
	//1MS 48m/16/3000
	BTIM_TimeBaseInitTypeDef BTIM_InitStruct;
	
	__RCC_BTIM_CLK_ENABLE();
	
	__disable_irq(); 
  NVIC_EnableIRQ(BTIM1_IRQn); 
  __enable_irq();
	
	BTIM_InitStruct.BTIM_Mode = BTIM_Mode_TIMER; //1ms定时器
  BTIM_InitStruct.BTIM_OPMode = BTIM_OPMode_Repetitive;
  BTIM_InitStruct.BTIM_Period = 3000;
  BTIM_InitStruct.BTIM_Prescaler = BTIM_PRS_DIV16;
  BTIM_TimeBaseInit(CW_BTIM1, &BTIM_InitStruct);
	
  BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);
  BTIM_Cmd(CW_BTIM1, ENABLE);
}

//void UART3_IRQHandler()
//{ //未用
//  // unsigned char tx;
//	
//  if(USART_GetITStatus(CW_UART3, USART_IT_RC) != RESET)
//  {
//			USART_ClearITPendingBit(CW_UART3, USART_IT_RC); 
//		//	tx = USART_ReceiveData_8bit(CW_UART3);  	
//	 }
//}
