⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.c

📁 一个串口终端解释程序。用于单片机调试串口的超级终端应用。
💻 C
📖 第 1 页 / 共 3 页
字号:
/*-----------------------------------------------------------------------*
* Copyright (c) 2005,北京四方同创保护与控制设备有限公司稳控事业部
* All rights reserved.
*
* 文件名称:main.c
* 摘    要:软硬件初始化子程序
*           采用CSS-200/1规约V1.02版
* 当前版本:2.00
* 作    者:胡炯
* 完成日期:2007.1
*-----------------------------------------------------------------------*/

#include "56807.h"
#include "CSFU107.h"

void Init(void);                    //软硬件初始化子程序

void InitRunStat(void);             //初始化设定装置运行状态

void InitPpsVariable(void);         //初始化与GPS脉冲对时相关的变量
void InitGpsColckVariable(void);    //初始化与GPS时钟相关的变量
void InitFlashVariable(void);       //初始化与FLASH操作相关的变量
void InitAngleVariable(void);       //初始化与内电势角度测量相关的变量
void InitButtonVariable(void);      //初始化与调节按钮相关的变量
void InitDaVariable(void);          //初始化与D/A操作相关的变量
void InitStateVariable(void);       //初始化装置状态变量
void InitSci0TransVariable(void);   //初始化与SCIO发送相关的变量(与RCM3200通信)
void InitSci0RecVariable(void);     //初始化与SCIO接收相关的变量(与RCM3200通信)
void InitSci1TransVariable(void);   //初始化与SCI1发送相关的变量(向数据表发送数据)
void InitSci1RecVariable(void);     //初始化与SCI1接收相关的变量(接收GPS时钟信号)

void InitTimerA(void);          //初始化TimerA
void InitTimerB(void);          //初始化TimerB
void InitTimerC0(void);         //初始化TimerC0
void InitTimerC1(void);         //初始化TimerC1
void InitTimerD(void);          //初始化TimerD
void StartTimer(void);          //启动多个定时器开始同步计数
void InitPortB(void);           //初始化GPIO PORTB
void InitPortD(void);           //初始化GPIO PORTD
void InitPortE(void);           //初始化GPIO PORTE
void InitSci0(void);            //初始化SCI0(与RCM3200通信)
void InitSci1Trans(void);       //初始化SCI1的发送(向数据表发送数据)
void InitSci1Rec(void);         //初始化SCI1的接收(接收GPS时钟信号)
void InitIPL (void);            //初始化中断优先级

void InitPulseCapture(void);    //允许捕捉键相脉冲和A相电压脉冲中断

void InitTestVariable(void);    //初始化测试用变量

extern void ReadDataFromFlash(void); //从FLASH中读取数据

/*****软硬件初始化*****/
void Init(void)
{
    asm (BFSET #0x0300, SR);    //禁用所有可屏蔽中断

    InitRunStat();              //初始化设定装置运行状态

    InitPpsVariable();          //初始化与GPS脉冲对时相关的变量
    InitGpsColckVariable();     //初始化与GPS时钟相关的变量
    InitFlashVariable();        //初始化与FLASH操作相关的变量
    InitAngleVariable();        //初始化与内电势角度测量相关的变量
    InitButtonVariable();       //初始化与调节按钮相关的变量
    InitDaVariable();           //初始化与D/A操作相关的变量
    InitStateVariable();        //初始化装置状态变量
    InitSci0TransVariable();    //初始化与SCIO发送相关的变量(与RCM3200通信)
    InitSci0RecVariable();      //初始化与SCIO接收相关的变量(与RCM3200通信)
    InitSci1TransVariable();    //初始化与SCI1发送相关的变量(向数据表发送数据)
    InitSci1RecVariable();      //初始化与SCI1接收相关的变量(接收GPS时钟信号)

    InitTimerA();           //初始化TimerA
    InitTimerB();           //初始化TimerB
    InitTimerC0();          //初始化TimerC0
    InitTimerC1();          //初始化TimerC1
    InitTimerD();           //初始化TimerD
    StartTimer();           //启动多个定时器开始同步计数
    InitPortB();            //初始化GPIO PORTB
    InitPortD();            //初始化GPIO PORTD
    InitPortE();            //初始化GPIO PORTE
    InitSci0();             //初始化SCI0(与RCM3200通信)
    InitSci1Trans();        //初始化SCI1的发送(向数据表发送数据)
    //InitSci1Rec();            //初始化SCI1的接收(接收GPS时钟信号)
    InitIPL ();             //初始化中断优先级

    InitTestVariable();     //初始化测试用变量

    asm (BFCLR #0x0200, SR);        //开启可屏蔽中断
}
/*****end of 软硬件初始化*****/


/*****初始化设定装置运行状态*****/
void InitRunStat(void)
{
    DaMode = 0;
    MeterType = 0;
    MeterAddress = 0;
    RunStat = 0;
    E.CompensateValue = 0;
    U.CompensateValue = 0;
    ReadDataFromFlash();
    E.WriteFlashCompensateValue = E.CompensateValue;
    U.WriteFlashCompensateValue = U.CompensateValue;
    WriteFlashRunStat = RunStat;
}
/*****end of 初始化设定装置运行状态*****/


/*****初始化与GPS脉冲对时相关的变量*****/
void InitPpsVariable(void)
{
    unsigned int i;

    AveragePpsPeriod = STANDARD_PPS_PERIOD;

    MinPpsPeriod = AveragePpsPeriod - INIT_MAX_PPS_PERIOD_ERROR;
    MaxPpsPeriod = AveragePpsPeriod + INIT_MAX_PPS_PERIOD_ERROR;

    PpsPeriodRecBufPtr = &PpsPeriodRecBuf[0];
    PpsPeriodRecBufFullFlag = 0;
    for (i=0; i<PPS_PERIOD_REC_BUF_SIZE; i++)
    {
        PpsPeriodRecBuf[i] = 0;
    }

    PpsPeriodCalRecBufPtr = &PpsPeriodCalRecBuf[0];
    PpsPeriodCalSum = 0;
    PpsPeriodCalRecBufFullFlag = 0;
    for (i=0; i<PPS_PERIOD_REC_BUF_SIZE; i++)
    {
        PpsPeriodCalRecBuf[i] = 0;
    }

    AveragePpsPeriod = STANDARD_PPS_PERIOD;
    AveragePpsResidue = 0;
    AveragePpsPeriodBak = 0;
    AveragePpsResidueBak = 0;

    AveragePpsPeriodCalStartFlag = 0;
    AveragePpsPeriodCalNoEffectFlag = 0;

    CurrInputPpsCounter = 0;
    LastInputPpsCounter = 0;
    CurrInputPpsPeriod = 0;
    LastInputPpsPeriod = 0;
    PpsPeriodGap = 0;

    InputPpsStableCounter = 0;

    OutputPpsCounter = 0;
    OutputPpsPeriod = 0;
    OutputPpsResidue = 0;
    PpsOutputFlag = 0;
    FirstOutputPpsFlag = 0;

    for (i=0; i<PPS_ERR_REC_BUF_SIZE; i++)
    {
        PpsInputOutputErrCnt[i] = 0;
    }

    InputPpsComeFlag = 0;
    PpsSyncErrorFlag = 0;
    PpsSyncErrorNum = 0;
    NotOkNumGPS = 0;

    ResidueAdd = 0;

    CurrTD3IntCounter = 0;

    CurrSmpcnt = 0;
    for (i=0; i<50; i++)
    {
        PeriodCounterQueue[i] = 0;
    }
    PeriodCounterQueuePtr = &PeriodCounterQueue[0];
}
/*****end of 初始化与GPS脉冲对时相关的变量*****/


/*****初始化与GPS时钟相关的变量*****/
void InitGpsColckVariable(void)
{
    Time = 0;
    LastTime = 0;
    Soc = 0;
    UploadSoc = 0;  //2007.1
    LeapSecond = 0;
    UploadLeapSecond = 0;
    LastLeapSecond = 0; //2007.1
    FixType = 0;
    GpsFixCounter = 0;
    RealFixFlag = 0;
    GpsNotFixCnt = 0;	//2007.1

    NoSocCounter = 0;
    Sci1RecErrTime = 0;

    GpsReportReachTimeCounter = 0;
    GpsReportReachTime = 0;
    SocStableCounter = 0;
}
/*****end of 初始化与GPS时钟相关的变量*****/


/*****初始化与FLASH操作相关的变量*****/
void InitFlashVariable(void)
{
    WriteFlashFlag = 0;
    WriteFlashStartFlag = 0;
}
/*****end of 初始化与FLASH操作相关的变量*****/


/*****初始化与内电势角度测量相关的变量*****/
void InitAngleVariable(void)
{
    unsigned int i;

    PolePairsNum = 1;

    E.NowState = 0;
    E.ChangeCounter = 0;
    E.ChangeCounterLimit = 8;
    E.IntTimes = 0;
    E.IntTimesLimit = 30;
    E.OneSecondTrigTimes = 0;
    E.OneSecondTrigTimesLimit = 300;
    E.FilterLastTime = 0;
    E.MaxDelayTime = 20;
    E.ErrFlag = TRUE;
    E.CurrRisingEdgeCounter = 0;
    E.LastRisingEdgeCounter = 0;
    E.LastLastRisingEdgeCounter = 0;
    for (i=0; i<COUNTER_QUEUE_SIZE; i++)
    {
        E.RisingEdgeCounterBuf[i] = 0;
        E.PeriodBuf[i] = 0;
    }
    E.RisingEdgeWritePtr = &E.RisingEdgeCounterBuf[COUNTER_QUEUE_SIZE-1];
    E.PeriodBufWritePtr = &E.PeriodBuf[COUNTER_QUEUE_SIZE-1];
    E.BufFullFlag = FALSE;
    E.OldRisingEdgeBufPtr = &E.RisingEdgeCounterBuf[0];
    E.MinPeriod = (MAIN_FREQ_PERIOD - E_PERIOD_MAX_ERROR) * PolePairsNum;
    E.MaxPeriod = (MAIN_FREQ_PERIOD + E_PERIOD_MAX_ERROR) * PolePairsNum;
    //E.CompensateValue = ReadDataFromFlash();
    //E.WriteFlashCompensateValue = E.CompensateValue;
    E.ErrorLastTime = 0;

    U.NowState = 0;
    U.ChangeCounter = 0;
    U.ChangeCounterLimit = 12;
    U.IntTimes = 0;
    U.IntTimesLimit = 30;
    U.OneSecondTrigTimes = 0;
    U.OneSecondTrigTimesLimit = 300;
    U.FilterLastTime = 0;
    U.MaxDelayTime = 20;
    U.ErrFlag = TRUE;
    U.CurrRisingEdgeCounter = 0;
    U.LastRisingEdgeCounter = 0;
    U.LastLastRisingEdgeCounter = 0;
    for (i=0; i<COUNTER_QUEUE_SIZE; i++)
    {
        U.RisingEdgeCounterBuf[i] = 0;
        U.PeriodBuf[i] = 0;
    }
    U.RisingEdgeWritePtr = &U.RisingEdgeCounterBuf[COUNTER_QUEUE_SIZE-1];
    U.PeriodBufWritePtr = &U.PeriodBuf[COUNTER_QUEUE_SIZE-1];
    U.BufFullFlag = FALSE;
    U.OldRisingEdgeBufPtr = &U.RisingEdgeCounterBuf[0];
    U.MinPeriod = MAIN_FREQ_PERIOD - U_PERIOD_MAX_ERROR;
    U.MaxPeriod = MAIN_FREQ_PERIOD + U_PERIOD_MAX_ERROR;
    //U.CompensateValue = 900 - 5;      //U正向过零点领先正向最大值90度,带通滤波在50Hz处的滞后相移约为0.5度
    //U.WriteFlashCompensateValue = U.CompensateValue;
    U.ErrorLastTime = 0;

    UnCompensatedEAbsoluteAngle = 0xffff;
    CompensatedEAbsoluteAngle = 0xffff;

    UnCompensatedPowerAngle = 0xffff;
    CompensatedPowerAngle = 0xffff;

    RotateSpeed = 0xffff;

    OutputMetereData = 0;
    RealDisplayData = 0;
    CurrMeterOutputDataType = 0;    
}
/*****end of 初始化与内电势角度测量相关的变量*****/


/*****初始化与调节按钮相关的变量*****/
void InitButtonVariable(void)
{
    AddAngleFilterCnt = 0;
    SubAngleFilterCnt = 0;
    InitAngleLockCnt = 0;
    AngleAdjustFinishCnt = 0;
    AngleAdjustFlag = 0;
    FastAngleAdjustFlag = 0;
}
/*****end of 初始化与调节按钮相关的变量*****/


/*****初始化与D/A操作相关的变量*****/
void InitDaVariable(void)
{
    DaValue = 16384;    //输出8mA,对应0度
    OutputDaValue = 0;
    InitDaFlag = TRUE;
    DaOutputFlag = FALSE;
    DaOutputStep = 0;
    DaOutputJudgeFlag = FALSE;
}
/*****end of 初始化与D/A操作相关的变量*****/


/*****初始化装置状态变量*****/
void InitStateVariable(void)
{
    unsigned int i;

    MaskBit[0] = 0x0001;
    for (i=1; i<=15; i++)
    {
        MaskBit[i] = (MaskBit[0] << i);
    }
    DetailErrInfo.Word = 0;
    EinErrFlag = 1;
    UinErrFlag = 1;
    DaErrFlag = 1;
    Sci0ErrFlag = 1;
    Sci1RecErrFlag = 1;

    GpsStat.Word = 0;
    LeapSecFlag = FALSE;    //2007.1
    LeapSecDir = 0;     //2007.1
    SocErr = 1;
    GpsLockStat = 3;	//2007.1
    PpsSyncStat = 3;
    GpsLockErr = 0;
    
    PpsLedOnFlag = FALSE;	//2007.1

    Sci0RecErrCounter = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -