#include "File.h"

uint8_t xdata User_ADC_Buffer[ADC_DMA_Buffer_Lengh]={0};//ADC DMA接收缓冲区数组
uint8_t ADC_DMA_Flag=0;//ADC_DMA转换完成标志位

//用户ADC初始化函数
void User_ADC_Init(void) {
  P0M0 = 0x00; P0M1 |= 0x55;//P00 P02 P04 P06设置为高阻输入模式
	P0NCS |= 0xaa;//P00 P02 P04 P06使能施密特输入,用于滤除输入信号的干扰
  ADC_CONTR=0X80+8;//使能ADC电源,初始化通道为通道8
  delay_ms(5);//延时5毫秒等待稳定
  /*****ADC转换速度 400KSPS********* */
	ADCCFG &= ~0x0f;		//SPEED(0)
  ADCCFG |= 0X20;     //右对齐
	ADCTIM = 0xff;			//CSSETUP(1), CSHOLD(3), SMPDUTY(31)
  ADCEXCFG=0X00;//禁止ETR触发功能,转换1次
  User_ADC_DMA_Init();//初始化ADC_DMA
}

//用户ADC触发函数
void User_ADC_Trigger(void) {
  ADC_CONTR|=0X40;//触发ADC转换
  while(!(ADC_CONTR&0X20));//等待转换完成
  ADC_CONTR&=~0X20;//清除转换完成请求标志位
}

//用户ADC获取结果函数
uint16_t User_ADC_Get_Val(uint8_t channel) {
  uint8_t h,l;//高位,低位
  uint16_t temp;//暂存变量

  ADC_CONTR|=channel;//选择转换的通道
  User_ADC_Trigger();//启动ADC转换
  h=ADC_RES&0X0F;//获取ADC高8位
  l=ADC_RESL&0XFF;//获取ADC低8位
  temp=h*256+l;//获取ADC值
  return temp;//返回ADC值
}

//用户ADC_DMA初始化函数
void User_ADC_DMA_Init(void) {
  uint8_t addr_h,addr_l;//地址高8位,地址低8位
	uint16_t addr;

  DMA_ADC_CFG=0X85;//开启ADC_DMA中断,中断优先级0,DMA总线中断优先级0
  DMA_ADC_CR=0X80;//使能ADC_DMA功能
  DMA_ADC_AMTH=(uint8_t)((u16)ADC_DMA_Convert_Cnt>>8);//ADC_DMA转换次数高8位
  DMA_ADC_AMT=(uint8_t)((u16)ADC_DMA_Convert_Cnt&0XFF);//ADC_DMA转换次数低8位
  addr=(uint16_t)User_ADC_Buffer;//取数组首地址
  addr_h=(uint8_t)((uint16_t)addr>>8);//取数组地址高8位
  addr_l=(uint8_t)(addr&0xff);//取数组地址低8位
  DMA_ADC_RXAH=addr_h;//数组地址高8位
  DMA_ADC_RXAL=addr_l;//数组地址低8位
  DMA_ADC_CFG2=0X0B;//进行ADC_DMA操作时,对每个ADC通道转换16次
  DMA_ADC_CHSW0=0X00;//CH0-CH7不使能扫描
  DMA_ADC_CHSW1=0XD5;//扫描CH8,CH10,CH12,CH14,CH15通道
  DMA_ADC_ITVL=0X00;//ADC_DMA转换间隔时间为255个系统时钟,6.375μs
  DMA_ADC_ITVH=0X00;//ADC_DMA转换间隔时间为255个系统时钟,6.375μs
  DMA_ADC_STA&=~0X01;//手动清零ADC_DMA转换完成请求标志位
}

//用户ADC_DMA触发函数
void User_ADC_DMA_Trig(void) {
  DMA_ADC_CR|=0X80;//使能ADC_DMA功能
  DMA_ADC_CR|=0X40;//开启ADC_DMA转换
  while(!ADC_DMA_Flag);//等待ADC_DMA转换完成
  ADC_DMA_Flag=0;//重置ADC_DMA标志位
  DMA_ADC_CR&=~0X80;//使能ADC_DMA功能
}

//用户ADC_DMA中断回调处理函数
void User_ADC_DMA_Callback(void) interrupt DMA_ADC_VECTOR {
  if(DMA_ADC_STA&0x01) {//转换完成,触发ADC_DMA中断
    DMA_ADC_STA&=~0X01;//手动清零ADC_DMA转换完成请求标志位
    ADC_DMA_Flag=1;//转换完成
  }
}