/********************************************************************************
 * @file    OP_AmplifiesVoltage.c
 * @author  SOC AE Team
 * @version V1.1
 * @date    2025-06-27
 * @brief   配置OP ，反相放大采集后的电压信号至ADC输出
 *         通过宏定义OP_MODE选择OP的同相、反相放大模式：
 *          0：NonInvert_MODE 同相放大 1：Invert_MODE 反相放大
 *******************************************************************************/
#if defined(SC32f12xx)
#include "sc32_conf.h"
#include "Function_Init.h"
static volatile FlagStatus ADC_Flag;
uint8_t offset_flag;
/* OP 同相反相放大配置 */
//(OP_MODE:NonInvert_MODE=0,OP_MODE:Invert_MODE=1)
#define OP_MODE 1

void OP_AmplifiesVoltage_Function(void)
{
#if defined(SC32f12xx)
#if (OP_MODE == 0)
#if defined(SC32f12xx)
  GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO初始化结构体变量
  /* PA3设置为高阻输入 */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_HI;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif
#endif
#if (OP_MODE == 1)
#if defined(SC32f12xx)
  GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO初始化结构体变量
  /* PA4设置为高阻输入 */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_HI;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif
#endif
  //ADC初始化配置
  volatile uint16_t ADC_Value;
  RCC_APB2Cmd(ENABLE);                                //ADC、PGA外设挂载在APB2时钟上
  
  ADC_InitTypeDef ADC_InitStruct;                     //定义ADC初始化结构体变量
  
  ADC_StructInit(&ADC_InitStruct);
  ADC_InitStruct.ADC_ConvMode = ADC_ConvMode_Single;  //ADC单次转换模式
  ADC_InitStruct.ADC_Prescaler = ADC_Prescaler_3CLOCK;//转换时间为3个周期
  ADC_InitStruct.ADC_VREF = ADC_VREF_VDD;             //参考电压为VDD
  
  ADC_Init(ADC, &ADC_InitStruct);                     //根据结构体标志位配置ADC
  ADC_SetChannel(ADC,ADC_Channel_OP);                //选择PGA通道
  
  ADC_ITConfig(ADC,ADC_IT_ADCIF,ENABLE);              //使能ADC中断
  NVIC_EnableIRQ(ADC_IRQn);
  ADC_Cmd(ADC,ENABLE);	                              //使能ADC；
  
 #if (OP_MODE == 0)
  //PGA初始化配置,同相相放大
  OP_InitTypeDef OP_InitStruct;                      //定义PGA初始化结构体变量
  OP_InitStruct.OP_ShortCircuit = OP_ShortCircuit_OFF;//PGA同相反相不短接
  OP_InitStruct.OP_FDBResisrance = OP_FDBResisrance_VSS; //反馈电阻端连接VSS
  OP_InitStruct.OP_PGAGain = OP_PGAGain_NonInvert8_Invert7;//同相8倍反相7倍增益
  OP_InitStruct.OP_Posittive = OP_Posittive_OPP0;     //同相端OP_0
  OP_InitStruct.OP_Negative = OP_Negative_PGA;        //反相端接内部电阻
  OP_InitStruct.OP_Output = OP_Output_ON;           //连接OP_O输出端口

  OP_Init(OP,&OP_InitStruct);                             //对OP进行初始化
 #endif
 #if (OP_MODE == 1)
  //PGA初始化配置,反相放大
  OP_InitTypeDef OP_InitStruct;                            //定义PGA初始化结构体变量
  OP_InitStruct.OP_ShortCircuit = OP_ShortCircuit_OFF;      //PGA同相反相不短接
  OP_InitStruct.OP_FDBResisrance = OP_FDBResisrance_OPN;          //反馈电阻端连接OP_N口
  OP_InitStruct.OP_PGAGain = OP_PGAGain_NonInvert8_Invert7; //同相8倍反相7倍增益
#if defined(SC32f12xx)
  OP_InitStruct.OP_Posittive = OP_Posittive_VSS;            //同相端接地
#endif
  OP_InitStruct.OP_Negative = OP_Negative_PGA;             //反相端接内部电阻
  OP_InitStruct.OP_Output = OP_Output_ON;           //连接OP_O输出端口
  
  OP_Init(OP,&OP_InitStruct);                        //对OP进行初始化
#endif
  OP_Cmd(OP,ENABLE);                                 //OP使能
  
  while(1)
  {
		if(offset_flag==0)
		{
			printf("\r\n OP的校验值写入出厂设置成功 \r\n");
		}
		else
		{
				printf("\r\n OP的校验值写入出厂设置失败 \r\n");
		}
    ADC_SoftwareStartConv(ADC); //开启转换
    while(ADC_Flag == RESET); //等待ADC转换完成
    ADC_Value = ADC_GetConversionValue(ADC);  //获取ADC转换值
    printf("\r\n ADC Conversion Value is 0x%x \r\n",ADC_Value);
    for (int i=0;i<5000;i++);
  }
  

#endif
}
#if defined(SC32f12xx)
void OP_AmplifiesVoltage_ADCHandler(void)
{
  if(ADC_GetFlagStatus(ADC,ADC_Flag_ADCIF)) //判断ADC标志位
  {
    ADC_ClearFlag(ADC,ADC_Flag_ADCIF);  //清除ADC标志位
    ADC_Flag = SET;  //自定义标志置起
  }
}
#endif
#endif
