/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : app.c
 * Description : app source file
 * Author(s)   : Dan
 * version     : V1.0
 * Modify date : 2022-07-10
 ***********************************************************************/
#include  "app.h"
#include  "config.h"
#include  "common.h"
#include  "uart0.h"
#include  "uart1.h"
#include  "uart2.h"
#include  "adc.h"
#include  "gtimer.h"


uint32_t g_data_buf[512];

#ifdef UART0_COMM
uint8_t uart0_rx_flag = 0;
uint8_t uart0_rx_buf[64];
uint8_t uart0_rx_count = 0;
#endif

#ifdef UART1_COMM
uint8_t uart1_rx_flag = 0;
uint8_t uart1_rx_buf[64];
uint8_t uart1_rx_count = 0;
#endif

#ifdef UART2_COMM
uint8_t uart2_rx_flag = 0;
uint8_t uart2_rx_buf[64];
uint8_t uart2_rx_count = 0;
#endif

#ifdef UART0_COMM
/************************************************************************
 * function   : uart0_rec_pro
 * Description: uart0 rec pro 串口接收处理回调函数
 * input : none
 * return: none
 ************************************************************************/
void uart0_rec_pro(void)
{
	uart0_rx_buf[uart0_rx_count] = uart0_recv_byte();
	uart0_rx_count++;
	uart0_rx_flag = 1;	
}
#endif

#ifdef UART1_COMM
/************************************************************************
 * function   : uart1_rec_pro
 * Description: uart1 rec pro 串口接收处理回调函数
 * input : none
 * return: none
 ************************************************************************/
void uart1_rec_pro(void)
{
	uart1_rx_buf[uart1_rx_count] = uart1_recv_byte();
	uart1_rx_count++;
	uart1_rx_flag = 1;	
}
#endif

#ifdef UART2_COMM
/************************************************************************
 * function   : uart1_rec_pro
 * Description: uart1 rec pro 串口接收处理回调函数
 * input : none
 * return: none
 ************************************************************************/
void uart2_rec_pro(void)
{
	uart2_rx_buf[uart2_rx_count] = uart2_recv_byte();
	uart2_rx_count++;
	uart2_rx_flag = 1;	
}
#endif
/************************************************************************
 * function   : uart_init
 * Description: uart_init 串口初始化
 * input : none
 * return: none
 ************************************************************************/
void uart_init(void)
{
#ifdef  UART0_COMM     
	uart0_rx_flag = 0;
	uart0_init(PCLK, UART0_BAUD_RATE);
	uart0_irq_init(UART0_IRQ_ENABLE, uart0_rec_pro);
#endif

#ifdef  UART1_COMM	
	uart1_rx_flag = 0;	
	uart1_init(PCLK, UART1_BAUD_RATE);
	uart1_irq_init(UART1_IRQ_ENABLE, uart1_rec_pro);
#endif

#ifdef  UART2_COMM    
    uart2_rx_flag = 0;	
	uart2_init(PCLK, UART2_BAUD_RATE);
	uart2_irq_init(UART2_IRQ_ENABLE, uart2_rec_pro);
#endif
}

/************************************************************************
 * function   : adc_hardware_trig_test
 * Description: adc_hardware_trig_test
 * input : none
 * return: none
 ************************************************************************/
void adc_hardware_trig_test(void)
{
	printfS("adc single mode --- single channel start!!!\r\n");	

	adc_init(ADC_REF_VDDH,ADC_SAMPL_RATE_50K_SPS,ADC_CONTINUOUS_MODE);		//ADC初始化，选择ADC参考电压源、ADCCLK分频和采样模式	
	adc_channel_gpio_config(ADC_CH1_EN|ADC_CH2_EN|ADC_CH3_EN|ADC_CH4_EN,\
							ADC_PF0|ADC_PA6|ADC_PB0|ADC_PB1);//配置ADC转换通道:通道3_PB1	
	
#if 1		/*GTIM0/1/2 PWM OUT，将函数中的gtimer数字分别改为0/1/2*/
	gtimer2_pwm_init(VAL_GTIM_TSSEL_APBCLK,48000-1,12000,1000-1);					//100KHz的PWM输出，占空比为25%
	REG_GTIM2_CR |= (1<<28);
	REG_GTIM2_CARS1 = (((uint32_t)(48000-1)<<16) | (12000<<0));
	gtimer2_start();													//启动GTIMER0计数
	gtimer2_moe_set(GTIM_MOE_ENABLE);									//使能通道输出
	adc_hardware_trig_config(ADC_HARDWARE_TRIG_GTIM2, ADC_HARDWARE_POLARITY_DOWNEDGE, ENABLE);
#elif 0		/*GTIM0/1/2 TRGO，将函数中的gtimer数字分别改为0/1/2*/
	gtimer2_count_init(VAL_GTIM_TSSEL_APBCLK,48000-1,1000-1);				//时钟源为系统时钟32M，1000分频，1S溢出产生中断
	REG_GTIM2_CR |= (1<<7);
	gtimer2_start();													//启动GTIMER0计数
	adc_hardware_trig_config(ADC_HARDWARE_TRIG_GTIM2TRGO, ADC_HARDWARE_POLARITY_DOWNEDGE, ENABLE);	

#endif	
							
	while(1)
	{		
		printfS("adc_get_data(1) = %d \r\n", adc_get_data(1));
		printfS("adc_get_data(2) = %d \r\n", adc_get_data(2));
		printfS("adc_get_data(3) = %d \r\n", adc_get_data(3));
		printfS("adc_get_data(4) = %d \r\n", adc_get_data(4));
	}		
		
}

/************************************************************************
 * function   : soc_test
 * Description: soc_test
 * input : none
 * return: none
 ************************************************************************/
void soc_test(void)
{

	adc_hardware_trig_test();
	
}
