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.

[参考译文] TMS570LC4357:FreeRTOS 和睡眠模式。

Guru**** 2460140 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1118896/tms570lc4357-freertos-and-sleep-mode

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

您好!

我 准备 通过 TMS570LC 和 FreeRTOS HALCoGen 项目实现空闲睡眠。 我可以通过执行以下操作使处理器进入睡眠状态:

void vApplicationIdleHook( void )

{  

   systemPowerDown (SYS_SLEEP_MODE);

并且具有 SCI3接口、可实现唤醒。  使用唤醒标志初始化 SCI3接口:

/**-设置中断使能*/
sciREG3->SETINT =(uint32)((uint32) 0U <<26U)//帧错误
|(uint32)((uint32) 0U << 25U)/*溢出错误*/
|(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/
|(uint32)((uint32) 1U <<9U)/*接收*/
|(uint32)((uint32) 1U << 1U)/*唤醒*/
|(uint32)((uint32) 0U << 0U);/*中断检测*

但是、一旦入睡、它就不会再次唤醒!:  

1)。 我是否需要进行呼叫以再次唤醒它、如果是、在哪里(勾选挂钩?)

2)。 应将唤醒/断电时钟源设置为什么?

3)。  我是否可以通过 SCI3发送任何用于唤醒的信号?

非常感谢。

此致

Pablo

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

    您好、Pablo、

    您是否启用了 VIM 唤醒寄存器: WAKEENASETx?

    以下是 RM46器件的示例:

    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/3788091?tisearch=e2e-sitesearch&keymatch=LPM%20AND%20wakeup#3788091

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

    您好、QJ Wang、

    感谢您的请求。 我启用过孔唤醒、如下所示:

    vimREG->WAKEMASKSET2 = 1<<0 | 1<< 10;// SCI3高电平、低电平

    但这不奏效。

    此致

    Pablo

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

    我确信这在实施中是愚蠢的。 您是否有任何 展示 TMS570打盹/睡眠模式用法的 HALCoGen 生成的示例?

    Pablo

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

    您好、Pablo、

    我没有 TMS570LC43x 的示例。

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

    器件是否进入睡眠模式?

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

    您好 QJ、

    抱歉耽误你的时间。  是的、它会 进入睡眠模式。 但当它通过 sci 接收数据时、它不会唤醒。

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

    谢谢你。 您能否与我分享您的代码、以便我可以在电路板上进行测试?

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

    是的、我在 main 中有一个用于初始化硬件和创建几个任务以及初始化 FreeRTOS 调度程序的函数:

    static void hardwareInit(void)
    {
    /* Enable IRQ via VIC controller */
        _enable_interrupt_();
    
        sciInit();
        sciEnableNotification(sciREG3, SCI_RX_INT);
        sciReceive(sciREG3,1,&cmd);
    
        vimREG->WAKEMASKSET2 = 1<<0 | 1<< 10; // SCI3 High, Low
    }
    
    

    这是用于初始化通信接口 SCI3以 启用唤醒的函数

    void sciInit(void)
    {
     /** @b initialize @b SCI3 */
    
        /** - bring SCI3 out of reset */
        sciREG3->GCR0 = 0U;
        sciREG3->GCR0 = 1U;
    
        /** - Disable all interrupts */
        sciREG3->CLEARINT    = 0xFFFFFFFFU;
        sciREG3->CLEARINTLVL = 0xFFFFFFFFU;
    
        /** - global control 1 */
        sciREG3->GCR1 =  (uint32)((uint32)1U << 25U)  /* enable transmit */
                      | (uint32)((uint32)1U << 24U)  /* enable receive */
                      | (uint32)((uint32)1U << 5U)   /* internal clock (device has no clock pin) */
                      | (uint32)((uint32)(2U-1U) << 4U)  /* number of stop bits */
                      | (uint32)((uint32)0U << 3U)  /* even parity, otherwise odd */
                      | (uint32)((uint32)0U << 2U)  /* enable parity */
                      | (uint32)((uint32)1U << 1U);  /* asynchronous timing mode */
    
        /** - set baudrate */
        sciREG3->BRS = 40U;  /* baudrate */
    
        /** - transmission length */
        sciREG3->FORMAT = 8U - 1U;  /* length */
    
        /** - set SCI3 pins functional mode */
        sciREG3->PIO0 = (uint32)((uint32)1U << 2U)  /* tx pin */
                     | (uint32)((uint32)1U << 1U); /* rx pin */
    
        /** - set SCI3 pins default output value */
        sciREG3->PIO3 = (uint32)((uint32)0U << 2U)  /* tx pin */
                     | (uint32)((uint32)0U << 1U); /* rx pin */
    
        /** - set SCI3 pins output direction */
        sciREG3->PIO1 = (uint32)((uint32)0U << 2U)  /* tx pin */
                     | (uint32)((uint32)0U << 1U); /* rx pin */
    
        /** - set SCI3 pins open drain enable */
        sciREG3->PIO6 = (uint32)((uint32)0U << 2U)  /* tx pin */
                     | (uint32)((uint32)0U << 1U); /* rx pin */
    
        /** - set SCI3 pins pullup/pulldown enable */
        sciREG3->PIO7 = (uint32)((uint32)0U << 2U)  /* tx pin */
                     | (uint32)((uint32)0U << 1U); /* rx pin */
    
        /** - set SCI3 pins pullup/pulldown select */
        sciREG3->PIO8 = (uint32)((uint32)1U << 2U)  /* tx pin */
                     | (uint32)((uint32)1U << 1U);  /* rx pin */
    
        /** - set interrupt level */
        sciREG3->SETINTLVL = (uint32)((uint32)0U << 26U)  /* Framing error */
                          | (uint32)((uint32)0U << 25U)  /* Overrun error */
                          | (uint32)((uint32)0U << 24U)  /* Parity error */
                          | (uint32)((uint32)0U << 9U)  /* Receive */
                          | (uint32)((uint32)0U << 8U)  /* Transmit */
                          | (uint32)((uint32)1U << 1U)  /* Wakeup */
                          | (uint32)((uint32)0U << 0U);  /* Break detect */
    
        /** - set interrupt enable */
        sciREG3->SETINT = (uint32)((uint32)0U << 26U)  /* Framing error */
                       | (uint32)((uint32)0U << 25U)  /* Overrun error */
                       | (uint32)((uint32)0U << 24U)  /* Parity error */
                       | (uint32)((uint32)1U << 9U)  /* Receive */
                       | (uint32)((uint32)1U << 1U)  /* Wakeup */
                       | (uint32)((uint32)0U << 0U);  /* Break detect */
    
        /** - initialize global transfer variables */
        g_sciTransfer_t[2U].mode   = (uint32)0U << 8U;
        g_sciTransfer_t[2U].tx_length = 0U;
    	g_sciTransfer_t[2U].rx_length = 0U;
    
        /** - Finaly start SCI3 */
        sciREG3->GCR1 |= 0x80U;
    
    
    }

     

    当 FreeRTOS 运行空闲任务时。 该任务调用一个空闲任务挂钩、该挂钩是将微控制器置于低功耗模式的位置:

    void vApplicationIdleHook(void)
    {
        for( ;; )
        {
            systemPowerDown(SYS_SLEEP_MODE);
        }
    }

    请告诉我发送的代码是否有用。

    Pablo

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

    您好、Pablo、

    我是否可以拥有 systemPowerDown ()?

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

    是的、 我复制代码:

    /* SourceId : SYSTEM_SourceId_007 */
    /* DesignId : SYSTEM_DesignId_007 */
    /* Requirements : HL_CONQ_SYSTEM_SR8 */
    void systemPowerDown(uint32 mode)
    {
    
    /* USER CODE BEGIN (23) */
    /* USER CODE END */
    
        /* Disable clock sources */
        systemREG1->CSDISSET = mode & 0x000000FFU;
    
        /* Disable clock domains */
        systemREG1->CDDIS = (mode >> 8U) & 0x00000FFFU;
    
        /* Idle CPU */
        /*SAFETYMCUSW 88 S MR:2.1 <APPROVED> "Assembly in C needed" */
        _gotoCPUIdle_();
    
    /* USER CODE BEGIN (24) */
    /* USER CODE END */
    
    }

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

    您好、Pablo、

    闪存组和闪存泵也应编程为睡眠模式。  

    LC4357上的 L2FMC 不同于其他 Cortex-R4F 器件上使用的 FMC。 L2FMC 没有 BAGP (组活动宽限期)和 PAgP。 (泵激活宽限期)。  当泵电源模式切换到睡眠模式(通过清除 FPAC1寄存器中的 PUMPPWR 位)时、L2FMC 将立即对泵应用新的电源模式。 当 Bank1、Bank2和 BANK7电源模式切换到非工作模式(FBPWRMODE 寄存器)时、L2FMC 将立即对受影响的组应用新的电源模式。

    这意味着禁用时钟源和时钟域的代码应该从 SRAM 执行。

    BTW、TMS570器件不是低功耗器件。 即使在睡眠模式下、也会出现一些电流泄漏。

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

    您好 QJ、

    谢谢您! 解释的很好。

    Pablo