//======================================================================
//文件名称：main.c（应用工程主函数）
//框架提供：SD-Arm（sumcu.suda.edu.cn）
//版本更新：20191108-20200419
//功能描述：见本工程的..\01_Doc\Readme.txt
//移植规则：【固定】
//======================================================================
#define GLOBLE_VAR
#include "includes.h"      //包含总头文件

//----------------------------------------------------------------------
//声明使用到的内部函数
//main.c使用的内部函数声明处
//----------------------------------------------------------------------
//主函数，一般情况下可以认为程序从此开始运行（实际上有启动过程，参见书稿）
int main(void)
{
    //（1）======启动部分（开头）==========================================
    //（1.1）声明main函数使用的局部变量（声明时不准赋值）
    vuint32_t mMainLoopCount;  //主循环次数变量（设为不优化，保持延时统一）
    uint8_t  muFlag;     //更新状态标志
    //（1.2）【不变】关总中断
    DISABLE_INTERRUPTS;
    //（1.3）给全局变量及主函数使用的局部变量赋初值
    mMainLoopCount=0;    //主循环次数变量
    muFlag=0;            //更新状态标志=0，默认进入User
    if(IS_POWERON_RESET)
	{
		memcpy((void*)gcUpdateFlag,"POWSTART\0",9); //初始化字符串，默认进入User
	}
    //（1.4）用户外设模块初始化
    emuart_init(UART_UPDATE,115200);      //初始化BIOS程序更新串口
    gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_ON);        //初始化绿灯
    flash_init();                         //初始化Flash构件
    shakeDataInit();                      //初始化握手数据
    //（1.5）使能模块中断
    uart_enable_re_int(UART_UPDATE);   //使能UART_UPDATE模块中断
    //（1.6）【不变】开总中断
    ENABLE_INTERRUPTS;
    //（1.7）按键复位判断
    pin_reset_judge(); //如果短时间发生了多次按键复位，则不进入用户程序
    //（1.8）判断是否需要进行更新操作
    muFlag = updateJudge(); 
    //返回 0：无需更新；1：串口更新；2：远程更新；3：无User程序
    if(muFlag != 0)
    {
        gFunFlag = 1;   //需进行更新提示操作
    }
    else                //无需更新
    {
        gcRecvLen = 0;
        gFunFlag = 0;
    }
    //（1）======启动部分（结尾）==========================================
    
    //（2）======主循环部分（开头）========================================
    for(;;)   //for(;;)（开头）
    {
        switch(gFunFlag)   //根据gFunFlag跳转执行
        {
            case 0:   //无需更新数据，跳转User程序执行
            gpio_set(LIGHT_GREEN,LIGHT_OFF);  //关闭绿灯
            uart_send_string (UART_UPDATE,(uint8_t *)
                  "  【BIOS提示】：本版BI0S驻留RT-Thread实时操作系统\r\n");
            uart_send_string (UART_UPDATE,(uint8_t *)
                  "        即将进入User程序运行，请关注User程序提示...\r\n");
            while(mMainLoopCount<0x10000)//延时
            {
                mMainLoopCount++;
            }
            mMainLoopCount=0;
            user_reset(GEC_USERBASE);   //跳转User程序
            break;
            case 1:   //需进行更新提示操作
            gFunFlag = 10;
            break;
            default:  //其他情况，绿灯闪烁，提示处于BIOS程序
            mMainLoopCount++;
            if (mMainLoopCount> 0x18ffff)
            {
                mMainLoopCount = 0;
                gpio_reverse(LIGHT_GREEN);
            }
        }
    }  //for(;;)结尾
    //（2）======主循环部分（结尾）========================================
}   //main函数（结尾）


//======以下为主函数调用的子函数===========================================


//=========================================================================
/*
知识要素：
（1）main.c是一个模板，该文件所有代码均不涉及具体的硬件和环境，通过调用构件
实现对硬件的干预。
（2）本文件中对宏GLOBLE_VAR进行了定义，所以在包含"includes.h"头文件时，会定
义全局变量，在其他文件中包含"includes.h"头文件时，
编译时会自动增加extern
*/





