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.

[参考译文] CCS/TMS570LS0432:如何使用 CAN 消息从睡眠状态唤醒 CPU

Guru**** 2455560 points
Other Parts Discussed in Thread: TMS570LS0432

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/640687/ccs-tms570ls0432-how-to-wakeup-cpu-from-sleep-using-can-message

器件型号:TMS570LS0432

工具/软件:Code Composer Studio

你(们)好  

在阅读 Tms570ls0432的参考手册时、我发现我们可以使用从低功耗模式唤醒 CPU  

GIO 中断、
CAN 消息、
SCI 消息

在这里,我要从其它控制器发送的 CAN 消息唤醒我的控制器。

但在 DCAN 模块参考手册中,没有任何说明。  

如何从 CAN 消息唤醒控制器,唤醒需要哪种类型的 CAN 消息?

谢谢。

  

 

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

    您好 Indrajit、

    我认为这一过程在 TRM 的以下两个部分中进行了说明。

    本节说明您需要为 DCAN ES 寄存器启用中断、以便获取状态更新中断。 此外、您还需要清除 CAN_init 位。 当 DCAN 模块处于此状态时、您需要使用与负责唤醒的 DCAN 模块关联的 PSPWRDWNCLR 寄存器位将该模块置于断电模式、从而启用总线活动检测电路。 通过 PCR 断电后、检测电路将保持通电状态并检测 CAN 总线上的活动、以开始唤醒序列。 如前所述、唤醒序列期间的第一条消息将丢失。

    VIM 将所有唤醒中断漏斗为一个到 GCM 的 WAKE_INT。 为了确定只有您想要的源才会唤醒器件、您可以使用 WAKEENASET 和 WAKEENACLR 寄存器启用或禁用从每个潜在中断源唤醒。

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

    谢谢,我明白了。 我将介绍 TRM 的这两个部分。  

    非常感谢!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好,我阅读了这两节。
    我还有一个疑问。
    如果我们在检测到 GIO 中断等有效条件后将微控制器编程为进入睡眠模式、则它将退出睡眠模式、但在该模式之后、它将开始执行指令。

    下面我已经编写了用于睡眠模式的程序,但它不起作用。 我的意思是它将进入睡眠模式,但在 GPIO 中断后它不起作用。 我不知道这是否正确。
    请帮帮我。

    int main (空)

    /*用户代码开始(3)*/
    gioInit();
    _enable_IRQ ();

    #ifdef 睡眠
    Sleep (睡眠);
    #endif

    int i=0;
    while (1)

    gioPORTA->DSET =(uint32) 1U <<2;
    for (i=0;i<100000;i++);
    gioPORTA->DCLR =(uint32) 1U <<2;
    for (i=0;i<100000;i++);


    /*用户代码结束*/




    /*用户代码开始(4)*/
    空睡眠()

    flashWREG->FBAC =(0x0F <<8)|(0x0F);
    flashWREG->FBFALBACK = 0x000000000000
    |(UINT32)((UINT32) SYS_SLEEP << 14U)
    |(UINT32)((UINT32) SYS_SLEEP << 0U);
    flashWREG->FPAC1 = 0x00;

    systemREG1->GHVSRC = 0x00000000;
    systemREG1->VCLKASRC= 0x00000000;
    systemREG1->RCLKSRC = 0x00000300;

    systemREG1->CSDIS =(uint32)((uint32) 1U << 1U)
    |(uint32)((uint32) 1U << 3U)
    |(uint32)((uint32) 1U << 4U)
    |(uint32)((uint32) 1U <<5U);

    systemREG1->CDDIS = 0x0
    |(uint32)((uint32) 1U <<0U)
    |(uint32)((uint32) 1U << 1U)
    |(uint32)((uint32) 1U << 2U)
    |(UINT32)((UINT32) 1U <<3U)
    |(uint32)((uint32) 1U <<4U)
    |(uint32)((uint32) 1U <<9U);
    asm (" NOP");
    asm (" NOP");
    asm (" NOP");
    asm (" WFI");
    asm (" NOP");
    asm (" NOP");
    asm (" NOP");






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

    您需要禁用所有时钟源和所有时钟域:
    systemREG1->CSDIS = 0xCF;
    systemREG1->CDDIS = 0x26F;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Indrajit、

    请在 CSDIS 和 CDDIS 之前添加一条语句:

    asm (" DSB");

    这是为了确保此指令之前的所有指令完成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢,它能为我提供很多帮助。

    正如您说过的、您需要使用禁用所有时钟源  

    systemREG1->CSDIS = 0xCF;

     但此行不会禁用内部两个时钟。

    当我禁用内部两个时钟时、它也不起作用、否则与一起工作  

    这种情况

    systemREG1->CSDIS = 0xCF;  

    配置工作正常。

    谢谢。