📄 base.c
字号:
{
pCHAR1 = "退出";
}
for (; i < JUMPER_NAME; i++)
{
if (*pCHAR1 != '\0')
*pCHAR2++ = *pCHAR1++;
else
break;
}
for (; i < JUMPER_NAME; i++)
{
*pCHAR2++ = '\0';
}
pSOE->SOE_Inf = ptr->jum_inf; //103规约的INF号
pSOE->DPI = ptr->jum_status + 1; //103规约的DPI状态
READ_DEC_TIME(&pSOE->Year); //压板改变时的时间
pJumperReport->pro_report_data_number = 0; //无模拟量报告数据
pJumperReport->pro_report_flag = 1; //报告标志
pJumperReport->mmi_flag = 0; //不显示
Fill_Report(&JumperReport); //填入报告区
NU_Change_Preemption(old_preempt); //可以切换任务
}
/**********************************************************/
/* public code for output */
/* 使用范围:多个任务用 */
/**********************************************************/
void Start_up(void) /*start up 24V */
{
Qdj();
}
void Signal(void) /*alarm operation*/
{
Qdj();
Gxj();
}
/**********************************************************/
/* public code for protect logic */
/* 使用范围:保护任务用 */
/**********************************************************/
void ClearFlag(PROTECT *ptr)
{
ptr->pro_startup_flag = 0;
ptr->pro_pickup_flag = 0;
ptr->pro_reserve4 = TMD_System_Clock;//delaytime1
}
/**********************************************************/
void NoPlunge(PROTECT *ptr)
{
ClearFlag(ptr);
}
/**********************************************************/
void NoStartup(PROTECT *ptr)
{
if(ptr->pro_reserve1 > 0) //flag1
ptr->pro_reserve1 = 0;
if(ptr->pro_reserve1 >= -1)
{
ptr->pro_reserve1--;
return;
}
ClearFlag(ptr);
}
/**********************************************************/
UNSIGNED EraseBurr(PROTECT *ptr)
{
if(ptr->pro_reserve1 < 0)
ptr->pro_reserve1 = 0;
if(ptr->pro_reserve1 <= 0)
{
ptr->pro_reserve1 ++;
return(1);
}
return(0);
}
/**********************************************************/
UNSIGNED StartPro(PROTECT *ptr)
{
if(!ptr->pro_startup_flag)
{
ptr->pro_startup_flag = 1;
return(0);
}
return(0);
}
/**********************************************************/
UNSIGNED TimeWait(PROTECT *ptr,float Time_Fix_Value)
{
if(!DOChn[BSJ].state)return(1);
if(DOChn[TZJ].state)
{
ptr->pro_reserve4 = TMD_System_Clock;
return(1);
}
if(ptr->pro_pickup_flag)return(1);
if(TMD_System_Clock - ptr->pro_reserve4 < (UNSIGNED)(Time_Fix_Value * 1000))
return(1);
return(0);
}
/***********************************************************************************/
/* 函数名: SaveToEEP(VOID) */
/* 功能: 存储遥信报告,事件报告,自检报告,故障录波 */
/* 使用范围:自检任务用 */
/***********************************************************************************/
VOID StartSaveToEEP(VOID)
{
UNSIGNED i;
static UNSIGNED PulseSaveTime;
if (TMD_System_Clock - PulseSaveTime > 10000) //保存脉冲计数
{
PulseSaveTime = TMD_System_Clock;
i = SAVE_PULSE;
NU_Send_To_Queue(&SaveQueue,&i,1,NU_SUSPEND);
}
}
/***********************************************************************************/
/* 函数名: VOID WriteEEP(UNSIGNED* pSource, UNSIGNED* pDest, Length) */
/* 功能: 以DMA方式将RAM内容移到EEPROM中 */
/* 说明: 如果按页写EEPROM,就必须用DMA方式,因为写入时,相邻字节时间间隔必须小于200*/
/* us */
/* 使用范围:自检任务用 */
/***********************************************************************************/
VOID WriteEEP(UNSIGNED *pSource, UNSIGNED *pDest, UNSIGNED Length)
{
static REPORT EEPErrorReport;
register UNSIGNED *pEEP, *pRAM, i, *j, k, error_flag;
register REPORT *pRPT;
register SOE *pSOE;
if (EEP_ErrorFlag) return;
while (Length)
{
j = (UNSIGNED *)((UNSIGNED)pDest & ~(EEPPAGELENGTH - 1)); //计算EEP页地址
pEEP = j;
pRAM = EEPPage; //将EEPROM一页拷贝到RAM中
for (i = 0; i < EEPPAGELENGTH; i++)
*pRAM++ = *pEEP++;
i = (UNSIGNED)pDest & (EEPPAGELENGTH - 1); //目的地址相对于页的偏移值
pRAM = EEPPage + i; //RAM的偏移地址
for (; i < EEPPAGELENGTH && Length != 0; i++)
{
*pRAM++ = *pSource++;
Length--;
pDest++;
}
k = 0;
do
{
k++;
error_flag = 0;
NU_Suspend_Task(&Task_2_CB);
NU_Suspend_Task(&Task_3_CB);
NU_Suspend_Task(&Task_4_CB);
DMAWriteEEP(j);
NU_Sleep(8);
NU_Resume_Task(&Task_2_CB);
NU_Resume_Task(&Task_3_CB);
NU_Resume_Task(&Task_4_CB);
NU_Sleep(6);
pEEP = j;
pRAM = EEPPage;
for (i = 0; i < EEPPAGELENGTH; i++)
{
if ((*pRAM++ & 0xff) == (*pEEP++ & 0xff))
continue;
else
{
error_flag = 1;
break;
}
}
}while (error_flag && k < 3);
if (error_flag)
{
EEP_ErrorFlag = 1;
pRPT = &EEPErrorReport;
pSOE = &pRPT->pro_report_soe;
pSOE->pSOE_name = pSOE->SOE_name;
strcpy(pSOE->SOE_name,"EEPROM故障");
pSOE->SOE_Inf = 196;
pSOE->DPI = 1;
READ_DEC_TIME(&pSOE->Year);
pRPT->pro_report_data_number = 0;
pRPT->pro_report_flag = 1;
pRPT->mmi_flag = MMIDISPLAY + MMIPICKUP;
Fill_Report(pRPT);
break;
}
}
}
/***********************************************************************************/
/* 函数名: VOID DMAWriteEEP(UNSIGNED*) */
/* 功能: 启动DMA,将RAM内容移到EEPROM中 */
/* 说明: 先打开软件写保护,再启动DMA传送 */
/***********************************************************************************/
UNSIGNED uWriteEEP;
UNSIGNED *pWriteEEP,*pEEPPage = EEPPage;
VOID DMAWriteEEP(UNSIGNED *p)
{
/*
*(UNSIGNED *)0x808010 = 0x1450; //DMA1 global control register
*(UNSIGNED *)0x808014 = (UNSIGNED)EEPPage; //DMA1 source address register
*(UNSIGNED *)0x808016 = (UNSIGNED)p; //DMA1 destination address register
*(UNSIGNED *)0x808018 = EEPPAGELENGTH; //DMA1 transfer length register
IE = 0x10100; //只允许发采样脉冲中断,因为该中断不会超过200us
*(UNSIGNED *)0x205555 = 0xaa; //打开EEP软件写保护
*(UNSIGNED *)0x202aaa = 0x55;
*(UNSIGNED *)0x205555 = 0xa0;
*(UNSIGNED *)0x808010 |= 0x3; //DMA1 global control register,开始DMA1传送
IE = NU_ENABLE_USE_INTERRUPTS; //开放所有中断
*/
uWriteEEP = 1;
pWriteEEP = p;
}
/***********************************************************************************/
/* 函数名: VOID SaveToEEP(UNSIGNED SaveType) */
/* 功能: 启动DMA,将RAM内容移到EEPROM中 */
/* 说明: 先打开软件写保护,再启动DMA传送 */
/***********************************************************************************/
extern Clock DS1302Time;
VOID SaveToEEP(UNSIGNED SaveType)
{
UNSIGNED PulseData[4*PULSENUM];
float fvar;
register UNSIGNED *p,*p1,i,j,k,l;
register PROTECT *protect;
register SETTING *pSets;
register REPORT *pRPT;
register EEP_REPORT *pEEP_RPT;
register SOE *pSOE;
register VALUE *pVAL;
register EEP_VALUE *pEEPV;
register PRO_CHANNEL *pChl;
register Clock *pDS;
switch(SaveType)
{
case SAVE_PULSE: //存电度脉冲
{
p = PulseData;
p1 = PulseCounter;
for (i = 0; i < PULSENUM; i++)
{
j = *p1++;
*p++ = j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -