📄 init.c
字号:
/*-----------------------------------------------------------------------*
* 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 + -