This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L852:如何使用 CAN 消息从睡眠状态唤醒处理器

Guru**** 2392635 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1024007/rm46l852-how-to-wakeup-processor-from-sleep-using-can-message

器件型号:RM46L852

我将 处理器置于 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");

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jinho、

    睡眠低功耗模式的唤醒选项包括 GIO 中断、CAN 消息和 SCI 消息。  

    任何具有任何 ID 的 CAN 消息都可以唤醒器件。 所有唤醒中断(GIO、CAN、SCI)被或成一个单一唤醒信号来唤醒器件。 默认情况下、这些唤醒中断处于启用状态。

    如果 CAN 模块处于全局断电模式(PSPWRDWNSET)、并且 CAN 总线活动检测电路未激活(WUBA)、则 CAN 总线消息将不会设置唤醒中断。 如果 WUBA 被激活、任何 CAN 总线电平活动(主 CAN 总线电平)将生成唤醒中断、然后您的代码可以启动唤醒序列。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我已经设置了 WUBA 位。

    我删除 了 PSPWRDWNSET 函数调用、 但它无法通过 CAN 消息唤醒。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的设备在运行代码后是否进入睡眠模式? 您能否使用 GIO 或 RTI 唤醒器件?

    附件是一个测试 RM46器件低功耗模式的示例。 该器件由 GIOA[2]引脚进行唤醒。

    您能否尝试此示例以确保器件进入 LPM 并可通过 GIO 中断进行唤醒?

    e2e.ti.com/.../RM46_5F00_LPM_5F00_Wakeup.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jinho、

    请在进入睡眠模式之前将以下代码添加到我的示例项目中的 main()函数。 您可以使用 GIOA[2](上升沿)或 CAN 消息(下拉 RX 引脚)将器件从睡眠模式唤醒。

    canInit();

    vimREG->WAKEMASKSET0 = 1<<16 | 1<<23;//CAN1高电平、GIO 低电平

    canREG1->CTL |=((uint32_t) 1U <<2);//启用状态中断*/

    在我的示例中、要进入睡眠模式、请上拉 GIOA[0]和 GIOA[1]引脚。  

    更新了 sys_main()文件:

    e2e.ti.com/.../2311.sys_5F00_main.c

    我刚刚在 RM46Lx launchpad 上进行了测试、它的工作原理与预期的一样。