/***********************************************************************
 * Copyright (c)  2017 - 2020, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : app.c
 * Description : app driver source file
 * Author(s)   : wanyi
 * version     : V1.0
 * Modify date : 2020-07-27
 ***********************************************************************/
#include  "system_um800x.h"
#include  "app.h"
#include  "config.h"
#include  "common.h"
#include  "uart0.h"
#include  "adc.h"

volatile uint8_t rx_flag ;
volatile uint8_t uart0_rx_buf[32];
volatile uint8_t uart0_tx_buf[32];
volatile uint16_t rx_count = 0;
volatile uint16_t tx_count = 0;

volatile uint8_t adc_rx_flag = 0;
volatile uint8_t adc_rx_count = 0;
volatile uint16_t adc_data = 0;
volatile uint16_t adc_converte_val[40];
/************************************************************************
 * function   : uart0_rec_pro
 * Description: uart0_rec_pro 串口接收处理回调函数
 * input : none
 * return: none
 ************************************************************************/
void uart0_rec_pro(void)
{
	uart0_rx_buf[rx_count++]= uart0_recv_byte();
	rx_flag = 1;	
}
/************************************************************************
 * function   : uart_init
 * Description: uart_init 串口初始化
 * input : none
 * return: none
 ************************************************************************/
void uart_init(void)
{
	rx_flag = 0;
	uart0_init(UART0_BAUD_RATE);
    uart0_irq_init(UART0_IRQ_ENABLE,uart0_rec_pro);
}



void adc_single_mode_func(void)
{
	adc_data = get_adc_value();
	adc_rx_flag = 1;
}
	
void adc_single_mode_test(void)
{
	uint8_t i;
    uint16_t adc_converte_data;
    
	/* ADC采样速率设置1Msps，ADC采样速率 = f(ADCCLK) / (采样时间+转换时间) = 16MHz/(4clk+12clk) = 1Msps */
	adc_init(ADC_CH3,1,ADC_SINGLE_MODE);		        //ADC初始化，VREF选择VDDH，单次工作模式，时钟源选择系统时钟发生器产生的时钟时，ADCCDR分频无效
	adc_io_config(ADC_CH3);												//配置ADC输入通道
    discard_invalid_data();                                      //舍弃第一个数据
#ifdef ADCIRQ_ENABLE											        //ADC中断模式
	adc_irq_config(ADC_IRQ_ENABLE,adc_single_mode_func);		        //使能中断
	while(1)
	{
		adc_convert_start(ADC_CH3);
		while(!adc_rx_flag);
		printfS("adc single mode irq test,adc_data = %d, adc_vol = %.3fV\r\n",adc_data,((float)adc_data/4096*(float)3.3));
		adc_rx_flag = 0;
		
		delay1ms(1000);
	}

#else	

	//十次单次采样
	for(i=0; i<10; i++)
	{
		
		adc_converte_data = get_adc();
		printfS("adc single mode normal test,adc_converte_data = %d,adc_vol = %.3fV\r\n",adc_converte_data,((float)adc_converte_data/4096*(float)3.3));	
		delay1ms(5);
	
	}
#endif

}

void adc_continous_mode_func(void)
{
	adc_converte_val[adc_rx_count] = get_adc_value();
	adc_rx_count++;
	if(adc_rx_count == 10)
	{
		adc_convert_stop();						//ADC停止转换
	}

}
	
void adc_continous_mode_test(void)
{
	uint8_t i;
	
    /*用ADC_CH4(P2_3)采样0~3.3V电压*/
	/* ADC采样速率设置1Msps，ADC采样速率 = f(ADCCLK) / (采样时间+转换时间) = 16MHz/(4clk+12clk) = 1Msps */

	adc_init(ADC_CH3,1,ADC_CONTINOUS_MODE);	//ADC初始化，连续工作模式，时钟源选择系统时钟发生器产生的时钟时，ADCCDR分频无效
    adc_io_config(ADC_CH3);										//配置ADC输入通道
    adc_irq_config(ADC_IRQ_ENABLE,adc_continous_mode_func);		//使能中断
    adc_start();
    
	while(adc_rx_count != 10);
	for(i=0; i<adc_rx_count; i++)
	{
		printfS("adc continous mode irq test,adc_converte_data = %d,adc_value = %.3fV\r\n",adc_converte_val[i],((float)adc_converte_val[i]/4096*(float)3.3));
	}


}
	
void adc_test(void)
{
	printfS("UM800x run at %ldHz\n",SystemCoreClock);	
	
//	adc_single_mode_test();

	adc_continous_mode_test();
	
	
}
