/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename     : app.c
 * Description  : app source file
 * Author(s)    : Mason
 * version      : V1.0
 * Modify date  : 2022-08-04
 ***********************************************************************/
#include  "app.h"
#include  "config.h"
#include  "common.h"
#include  "uart0.h"
#include  "uart1.h"
#include  "uart2.h"
#include  "gpio.h"
#include  "cache.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     : uart2_rec_pro
 * Description  : uart2 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     : gpio_speed
 * Description  : gpio speed  GPIO翻转速率测试
 * Input        : none
 * Return       : none
 ************************************************************************/
void gpio_speed(void)
{
    gpio_init(GPIOA, PIN6, 0);                  //时钟初始化，模块正常工作
	gpio_dir(GPIOA, PIN6, GPIO_DIR_OUT);        //配置为输出
	gpio_in_enable(GPIOA, PIN6, DISABLE);       //输入禁止
	gpio_config_pu(GPIOA, PIN6, ENABLE);        //上拉禁止
	gpio_config_pd(GPIOA, PIN6, DISABLE);       //下拉禁止
    
    while(1)
    {     
        REG_GPIO_CLR(GPIOA) = (1<<6);           //PA6输出低电平
        REG_GPIO_SET(GPIOA) = (1<<6);           //PA6输出高电平
        REG_GPIO_CLR(GPIOA) = (1<<6);
        REG_GPIO_SET(GPIOA) = (1<<6);
        REG_GPIO_CLR(GPIOA) = (1<<6);
        REG_GPIO_SET(GPIOA) = (1<<6);
        REG_GPIO_CLR(GPIOA) = (1<<6);
        REG_GPIO_SET(GPIOA) = (1<<6);
        REG_GPIO_CLR(GPIOA) = (1<<6);
        REG_GPIO_SET(GPIOA) = (1<<6);
        REG_GPIO_CLR(GPIOA) = (1<<6);
        REG_GPIO_SET(GPIOA) = (1<<6);
        REG_GPIO_CLR(GPIOA) = (1<<6);
        REG_GPIO_SET(GPIOA) = (1<<6);
    }
}

/************************************************************************
 * Function     : cache_test
 * Description  : cache test
 * Input        : none
 * Return       : none
 ************************************************************************/
void cache_test(void)
{
    printfS("System run at %dHz\r\n", SystemCoreClock);
	printfS("start cache test! \r\n");
    
    cache_init();                               //cache时钟初始化，模块正常工作
    cache_enable();                             //cache使能
    
    gpio_speed();                               //开启cache后，IO的翻转速率明显提升
}

/************************************************************************
 * Function     : soc_test
 * Description  : soc test
 * Input        : none
 * Return       : none
 ************************************************************************/
void soc_test(void)
{
	cache_test(); 
}
