|
从电源板取出两个掉电信号,这个当然很好的。 但是我是后看到那个帖子的,另外,三层板的结构,把两个掉电信号引上去,稍微有点麻烦。我手里没有三菱plc,老是看着西门子做参考,西门子的掉电保护是用法拉电容做掉电保护的。
掉电保存的数据我设置了三块,都做校验,每次上电是读入掉电数据区,然后擦除掉电数据区,如果上次掉电时数据没有完整或有错误,则这次上电时就会加载掉电保存备份区的数据,如果备份区的数据也错误,那就回复出厂设定值。掉电时,PVD检测到Vcc电压到2.9V是,在PVD中断中,把新的数据写入掉电保存数据区中。
void EE_Read(void)
{
static vu32 a,b,c;
a = EE_Addr;
b = EE_Addr_BAK;
c = EE_Addr_DEF;
//-----------------------------------------------------//
// 断电保存数据CRC32 校验
//-----------------------------------------------------//
if( FlashCRC32CHK(EE_Addr, EE_U16_Size) )
{
//-----------------------------------------------------//
// 读取断电保存数据
FlashRead(EE_Addr, EE_U16_Size);
//-----------------------------------------------------//
// 更新断电保存数据备份区
//-----------------------------------------------------//
FlashErasePage( EE_Addr_BAK, EE_U16_Size);
FlashProgram( EE_Addr_BAK, EE_U16_Size );
}
else
{
//-----------------------------------------------------//
// 断电保存数据备份CRC32 校验
//-----------------------------------------------------//
if( FlashCRC32CHK(EE_Addr_BAK, EE_U16_Size) )
{
//-----------------------------------------------------//
// 读取断电保存数据备份
//-----------------------------------------------------//
FlashRead(EE_Addr_BAK, EE_U16_Size);
}
else
{
//-----------------------------------------------------//
// 读取断电保存数据默认值
//-----------------------------------------------------//
FlashRead(EE_Addr_DEF, EE_U16_Size);
//-----------------------------------------------------//
// 更新断电保存数据备份区
//-----------------------------------------------------//
FlashErasePage( EE_Addr_BAK, EE_U16_Size);
FlashProgram( EE_Addr_BAK, EE_U16_Size );
}
}
//-----------------------------------------------------//
// 擦除断电保存数据区
//-----------------------------------------------------//
FlashErasePage( EE_Addr, EE_U16_Size);
} |
|