我将 处理器置于 SLEEP_MODE 中。
我想使用 DCAN1唤醒 MCU。
但它不起作用。
如何从 CAN 消息唤醒过程?
我的测试代码如下所示。
void mcusleep (void)(空)
{
canREG1->CTL |=(((uint32_t) 1U <<2)/*启用状态中断*/
|(uint32_t)(((uint32_t) 0x1U << 25U));
canREG1->ES |=((uint32_t) 0x1 <<9);
canREG1->CTL &=~(uint32)(0x00000041U);/*清除初始位*/
pcrREG->PSPWRDWNSET1 &=~(UINT32)(0x00000003U);/*关闭 DCAN1*/
vimREG->WAKEMASKSET0 =0xFFFFFFFF;
vimREG->WAKEMASKSET1 =0xFFFFFFFF;
vimREG->WAKEMASKSET2 = 0xFFFFFFFF;
vimREG->WAKEMASKSET3 = 0xFFFFFFFF;
vimREG->WAKEMASKCLR0 = 0xFFFFFFFF;
vimREG->WAKEMASKCLR1 = 0xFFFFFFFF;
vimREG->WAKEMASKSET0 = 1U <<16U | 1U <<29U;
_enable_IRQ ();
/**设置闪存 Banck 访问控制**/
//flashWREG->FBAC =(0x0F <<8)|(0x0F);
flashWREG->FBAC = 0x000000000000
|(uint32)((uint32) 15U<<8U)//BAGP
|(uint32)((uint32) 15U);//VREADST
/**-设置闪存组电源模式*/
flashWREG->FBFALBACK = 0x000000000000
|(UINT32)((UINT32) SYS_SLEEP << 14U)//组7 */
|(UINT32)((UINT32) SYS_SLEEP << 2U)/*组1 */
|(UINT32)((UINT32) SYS_SLEEP << 0U);//组0 */
//闪存泵-所有泵电路被禁用
flashWREG->FPAC1 = flashWREG->FPAC1 &~(0x1U);
flashWREG->FPAC2 = 0x0;
/**-为正常运行、断电模式和唤醒后设置 GCLK、HCLK 和 VCLK 时钟源*/
systemREG1->GHVSRC =(UINT32)((UINT32) SYS_LPO_HIGH << 24U)
|(UINT32)(((UINT32) SYS_LPO_HIGH << 16U)
|(UINT32)((UINT32) SYS_PLL1 << 0U);
/**-为 AVCLK1和 AVCLK2设置异步外设时钟源*/
systemREG1->VCLKASRC =(uint32)((uint32) SYS_LPO_HIGH << 8U)
|(UINT32)(((UINT32) SYS_LPO_HIGH << 0U);
SLEEP_CLK =(uint32)((uint32) 1U << 0U)
|(uint32)((uint32) 0U << 1U)
|(uint32)((uint32) 1U << 3U)
|(uint32)((uint32) 1U << 4U)
|(UINT32)((UINT32) 0U << 5U)
|(uint32)((uint32) 1U <<6U)
|(uint32)((uint32) 1U <<7U);
systemREG1->CSDIS = SLEEP_CLK;
while ((systemREG1->CSDIS & sleep_clk)!= sleep_clk)
{
/*等待*/
}
systemREG1->CDDIS = 0x1 //RTICLK 被使能用于唤醒
|(uint32)((uint32) 1U <<0U)/* GCLKOFF */
|(UINT32)((UINT32) 0U << 1U)/* HCLK 关闭*/
|(uint32)((uint32) 0U << 2U)/* VCLKP 关闭*/
|(uint32)((uint32) 1U << 3U)/* VCLK2 off */
|(uint32)((uint32) 0U << 4U)/* AVCLK 1关闭*/
|(uint32)((uint32) 1U << 5U)// AVCLK 2 off */
|(uint32)((uint32) 1U << 8U)/* VCLK3关闭*/
|(uint32)((uint32) 1U <<9U)/* VCLK4关闭*/
|(uint32)((uint32) 1U << 10U)/* AVCLK 3关闭*/
|(uint32)((uint32) 1U << 11U);// AVCLK 4 off */
asm (" NOP");
asm (" NOP");
asm (" NOP");
asm (" WFI");
asm (" NOP");
asm (" NOP");
asm (" NOP");
}