您好;
我尝试将 TMS570LS3137置于睡眠模式并通过 CAN 总线唤醒。 唤醒后、我希望 CPU 自行复位。 因此、我将此函数写在下面:
#define SYS_doze_mode 0x000F3F02U
#define SYS_snooze_MODE 0x000F3F03U
#define SYS_SLEEP_MODE 0x000FFFFFU
void EnterLowPowerMode (uint32模式)
{
/*启用唤醒中断*/
vimREG->WAKEMASKSET0 = 0xFFFFFFU;
vimREG->WAKEMASKSET1 = 0x000000000000U;
vimREG->WAKEMASKSET2 = 0x000000000000;
vimREG->WAKEMASKSET3 = 0x000000000000U;
/*关闭 CAN 模块以启用 CAN 活动检测电路*/
canREG1->CTL |=((uint32_t) 1U <<2);//启用状态中断*/
canREG1->CTL &=~(uint32)(0x00000041U);/*清除初始位*/
pcrREG->PSPWRDWNSET1 &=~(UINT32)(0x00000003U);/*关闭 DCAN1*/
/*将闪存组置于睡眠状态*/
flashWREG->FBAC = 0x00000000U |(UINT32)(UINT32) 15U <<8U)/* BAGP*/|(UINT32)(UINT32) 15U);/* VREADST*/
flashWREG->FBFALLBACK = 0x00000000U |(UINT32)((UINT32) SYS_SLEEP << 14U)|(UINT32)((UINT32) SYS_SLEEP << 2U)|(UINT32)((UINT32) SYS_SLEEP << 0U);
flashWREG->FPAC2 = 0x0;
flashWREG->FPAC1 = 0x0;
/*禁用时钟源*/
systemREG1->CSDISSET = MODE & 0x000000FFU;
/*禁用时钟域*/
systemREG1->CDDIS =(模式>> 8U)和0x00000FFFU;
/*以空闲周期执行 ARM 指令以触发 CPU 时钟停止*/
asm (" NOP");
asm (" NOP");
asm (" NOP");
asm (" WFI");
asm (" NOP");
asm (" NOP");
asm (" NOP");
asm (" NOP");
asm (" NOP");
/*CPU 重置*/
if (systemREG1->CPUSTCR == 0x000000000000)
{
systemREG1->CPUSTCR = 0x00000001U;
}
其他
{
systemREG1->CPUSTCR = 0x000000000000U;
}
}
控制器在执行该功能后似乎处于睡眠模式、但不会通过 CAN 唤醒。 你对此有什么建议吗? 此外、唤醒后、程序在何处继续? (或者、我应该将 CPU 复位置于何处?)
-