这篇主要记录一下基于MPC5744bootloader的基础上,嵌入TLF35584。
在与bootloader的联合调试中,在boot程序中,有必要关闭窗狗和错误状态监测功能,否则在程序下载与跳转过程中,得不到喂狗触发,芯片将复位。在app程序中,将窗狗使能,设定喂狗周期,周期喂狗,即可正常使用TLF35584。
要关闭窗狗和错误状态监测功能,需要对寄存器SYSPCFG0(地址0x04)、SYSPCFG1(地址0x05)、WDCFG0(地址0x06)进行写入配置,而这些是受保护的寄存器,需要先对寄存器PROTCFG(地址0x03)进行开锁。开锁(UNLOCK序列):连续写入:0xAB, 0xEF, 0x56, 0x12(必须在没有其他SPI写访问的情况下发送)。开锁成功后即可对受保护寄存器进行写操作,结束后需要对寄存器PROTCFG(地址0x03)进行加锁,加锁(LOCK序列):连续写入:0xDF, 0x34, 0xBE, 0xCA。只有加锁成功后,配置寄存器和所有内部函数才会使用受保护的配置请求寄存器的值进行更新。
可以通过读取寄存器PROTSTAT(地址0x28)来检查序列是否正确写入。同样的,写入加锁序列后,必须考虑有大于60us时间,确保新的配置生效。
因此boot程序中,在长开窗阶段喂狗、关闭窗狗、关闭错误监测。:
uint16_t Storage_35584[];
Storage_35584[1] =SPI35584_readvalue(0x2E00); // 读寄存器WWDSCMD(地址0x17)
if ((Storage_35584[1]&0x0100) == 0x0100)
{
SPI35584_sendvalue(0xAE01); //往寄存器WWDSCMD写数据(地址0x17),喂狗
}
else
{
SPI35584_sendvalue(0xAE02); //往寄存器WWDSCMD写数据(地址0x17),喂狗
}
SPI35584_sendvalue(0x8756); //往寄存器PROTCFG(地址0x03) 写数据0xAB
SPI35584_sendvalue(0x87DE); //往寄存器PROTCFG(地址0x03) 写数据0xEF
SPI35584_sendvalue(0x86AD); //往寄存器PROTCFG(地址0x03) 写数据0x56
SPI35584_sendvalue(0x8625); //往寄存器PROTCFG(地址0x03) 写数据0x12
Storage_35584[2] =SPI35584_readvalue(0x5000);// 读寄存器PROTSTAT(地址0x28),检查开锁成功了吗?
SPI35584_sendvalue(0x8811); //往寄存器SYSPCFG0(地址0x04) 写数据
SPI35584_sendvalue(0x8A01); //往寄存器SYSPCFG1(地址0x05) 写数据,
SPI35584_readvalue(0x8D27); // 寄存器WDCFG0(地址0x06) 0x8D27:禁用看门狗 0x8D35:0.1ms滴答周期 0x8D36:1ms滴答周期
SPI35584_sendvalue(0x87BE); //往寄存器PROTCFG(地址0x03) 写数据0xDF
SPI35584_sendvalue(0x8668); //往寄存器PROTCFG(地址0x03) 写数据0x34
SPI35584_sendvalue(0x877D); //往寄存器PROTCFG(地址0x03) 写数据0xBE
SPI35584_sendvalue(0x8795); //往寄存器PROTCFG(地址0x03) 写数据0xCA
Storage_35584[3] =SPI35584_readvalue(0x5000); //读寄存器PROTSTAT(地址0x28),检查加锁了吗?
Storage_35584[4] =SPI35584_readvalue(0x1A01); //读寄存器RWDCFG0(地址0x0D),检查窗狗是否关闭
Storage_35584[5] =SPI35584_readvalue(0x1800); //读寄存器RSYSPCFG1(地址0x0C),检查错误状态检测功能
app程序中,长开窗阶段使能窗狗、设置Closed Window、Open Window时间。
uint16_t Storage_35584[];
Storage_35584[1] =SPI35584_readvalue(0x2E00); // 读寄存器WWDSCMD(地址0x17)
if ((Storage_35584[1]&0x0100) == 0x0100)
{
SPI35584_sendvalue(0xAE01); //往寄存器WWDSCMD写数据(地址0x17),喂狗
}
else
{
SPI35584_sendvalue(0xAE02); //往寄存器WWDSCMD写数据(地址0x17),喂狗
}
SPI35584_sendvalue(0x8756); //往寄存器PROTCFG(地址0x03) 写数据0xAB
SPI35584_sendvalue(0x87DE); //往寄存器PROTCFG(地址0x03) 写数据0xEF
SPI35584_sendvalue(0x86AD); //往寄存器PROTCFG(地址0x03) 写数据0x56
SPI35584_sendvalue(0x8625); //往寄存器PROTCFG(地址0x03) 写数据0x12
Storage_35584[2] =SPI35584_readvalue(0x5000);// 读寄存器PROTSTAT(地址0x28),检查开锁成功了吗?
SPI35584_sendvalue(0x8811); //往寄存器SYSPCFG0(地址0x04) 写数据
SPI35584_sendvalue(0x8A01); //往寄存器SYSPCFG1(地址0x05) 写数据,
SPI35584_readvalue(0x8D35); // 寄存器WDCFG0(地址0x06) 0x8D27:禁用看门狗 0x8D35:0.1ms滴答周期 0x8D36:1ms滴答周期
SPI35584_readvalue(0x9402); // 往寄存器WWDCFG1(地址0x0A)写数据,设置open window time,0x9402:100个窗狗滴答周期
SPI35584_readvalue(0x9202); // 往寄存器WWDCFG0(地址0x09)写数据,设置 closed window time,0x9202:100个窗狗滴答周期
SPI35584_sendvalue(0x87BE); //往寄存器PROTCFG(地址0x03) 写数据0xDF
SPI35584_sendvalue(0x8668); //往寄存器PROTCFG(地址0x03) 写数据0x34
SPI35584_sendvalue(0x877D); //往寄存器PROTCFG(地址0x03) 写数据0xBE
SPI35584_sendvalue(0x8795); //往寄存器PROTCFG(地址0x03) 写数据0xCA
Storage_35584[3] =SPI35584_readvalue(0x5000); //读寄存器PROTSTAT(地址0x28),检查加锁了吗?
Storage_35584[4] =SPI35584_readvalue(0x1A01); //读寄存器RWDCFG0(地址0x0D),检查窗狗是否关闭
Storage_35584[5] =SPI35584_readvalue(0x1800); //读寄存器RSYSPCFG1(地址0x0C),检查错误状态检测功能
Storage_35584[6] =SPI35584_readvalue(0x2200); //读寄存器RWWDCFG1(地址0x11),检查open window time
Storage_35584[7] =SPI35584_readvalue(0x2001); //读寄存器RWWDCFG0(地址0x10),检查closed window time
然后在周期任务调度里,15ms喂一次窗狗即可。