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.

[参考译文] RTOS/MSP432P401R:寻找示例和设计帮助

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/578747/rtos-msp432p401r-looking-for-examples-and-design-help

部件号:MSP432P401R

工具/软件:TI-RTOS

我需要MSP432定期从内部计时器和I2C请求唤醒(MSP432在两个独立总线上作为I2C从属设备)。

同时,我需要将功耗降至最低。 从读取TRM,它可以从LPM0中的I2C请求自动唤醒?

但是,我相信LPM3消耗的电量会少得多。 我必须使用RTC进行内部唤醒,我可以添加来自两个I2C主控的中断线路,以便在MSP432需要I2C数据时唤醒它们。 这会有点复杂。 或者,最好的选择是使用低频LPM0并在唤醒时提高频率?

您能否提供这三种选择的功耗估计值?

此外,我还在寻找一些简单的示例,说明如何进入这些模式。

我运行了提供的DeepSleep示例,但无法使其脱离睡眠状态。 我添加了一个GPIO按钮中断,用于切换LED,但它只会触发一次。

睡眠示例使用~2.6mA,这太多了,所以我想尝试低频LPM0,但不确定如何达到。

谢谢。

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

    我尝试修改powerdeepsleep示例,以便在DeepSleep和'regular'睡眠策略之间切换。 我可以先把它放入DeepSleep,然后再出来,但是它再也不会进入DeepSleep。

    main_tirtos.c (添加了第二个线程)

    /*
    ========= main_tirtos.c =========
    */
    #include <stdint.h>/*
    
    POSIX头文件*/
    #include <pthread.h>/*
    
    RTOS头文件*/
    #include <ti/exterBIOS/BIOS.h>/*
    
    example/Board Header文件*/
    #include "Board.h"
    
    extern void *deepslead(void*arg0);Sysn
    *slevoid/*scle=
    
    #scle=#tle=#tle/*
    exdefine =
    
    
    主====
    */
    int main (void)
    {
    pthread_t 螺纹;
    pthread_attr_t. pAttrs;
    结构sched_param priParam;
    内部 Retc;
    内部 分遣国;
    
    /*调用驱动程序初始化函数*/
    Board_initGeneral ();
    Board_initGPIO ();
    
    /*设置优先级和堆栈大小属性*/
    pthread_attr_init(&pAttrs);
    priParam.sched_priority = 1;
    
    detachState = pthread_create_detach;
    retc = pthread_attr_setdetachstate(&pAttrs, detachstate);
    如果(retc !=0){
    /* pthread_attr_setdetachstate()失败*/
    同时(1);}
    
    
    pthread_attr_setschedparam(&pAttrs,&priParam);
    
    retc |= pthread_attr_setstacksize(&pAttrs, THREADSTACKSIZ);
    如果(retc !=0){
    /* pthread_attr_setstacksize()失败*/
    同时(1);}
    
    
    retc = pthread_create(&thread,&pAttrs, sleepThread, NULL);
    如果(retc !=0){
    /* pthread_create()失败*/
    同时(1);}
    
    
    retc = pthread_create(&thread,&pAttrs, deepThread, NULL);
    如果(retc !=0){
    /* pthread_create()失败*/
    同时(1);}
    
    
    BIOS_START();
    
    返回(0);
    } 

    powersleep.c

    /*
    ========= powersleep.c =========
    */*
    
    驱动程序头文件*/
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerMSP432.h>/*
    
    
    Driverlib头文件*/
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/*
    
    include Board Headerfile
    =/="#="
    
    
    gpioButtonFxn0 =========
    *用于BOARD_GPIO _BUTTON0上GPIO中断的回调函数。
    */
    
    void gpioButtonFxn1(uint_least8_t x)
    {
    GPIO_clearInt (Board_GPIO按钮1);
    
    GPIO切换(板_GPIO _LED1);
    
    Power_setPolicy((Power_PolicyFxn)PowerMSP432_SleepPolicy);
    }/*
    
    
    ========= sleepThread =========
    */
    void *sleepThread (void *arg0)
    {
    GPIO写入(Board_GPIO _LED1,Board_GPIO _LED_ON);
    
    GPIO_setCallback (Board_GPIO按钮1,gpioButtonFxn1);
    gPIO_enableInt (Board_gPIO_Button1);
    
    返回NULL;
    } 

    powerdeepsleep.c.

    /*
    ========= powerdeepsleep.c =========
    */*
    
    驱动程序头文件*/
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerMSP432.h>/*
    
    
    Driverlib头文件*/
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/*
    
    include Board Headerfile
    =/="#="
    
    
    gpioButtonFxn0 =========
    *用于BOARD_GPIO _BUTTON0上GPIO中断的回调函数。
    */
    
    void gpioButtonFxn0(uint_least8_t x)
    {
    GPIO_clearInt (BOD_GPIO _BUTTON0);
    
    //gPIO_WRITE (Board_gPIO_LED0,Board_gPIO_LED_OFF);
    //gPIO_WRITE (Board_gPIO_LED1,Board_gPIO_LED_OFF);
    GPIO切换(Board_GPIO LED0);
    
    /*选择PowerMSP432_deepPolicy以启用过渡
    *进入PowerMSP432_DeepSleep_1 (LPM4)状态
    */
    Power_setPolicy((Power_PolicyFxn)PowerMSP432_deepPolicy);
    
    /*请参阅设备数据表,了解从低功耗模式唤醒源的信息
    * PowerMSP432_DeepSleep_1
    */
    }/*
    
    
    ==== deepThread =========
    */
    void *deepThread(void *arg0)
    {
    GPIO写入(Board_GPIO _LED0,Board_GPIO _LED_ON);
    
    GPIO _setCallback (BOD_GPIO _BUTTON0,gpioButtonFxn0);
    gPIO_enableInt (BOD_gPIO_BUTTON0);
    
    返回NULL;
    } 

    在'free run'中,它似乎只进入 gpioButtonFxn0()在第一次按下button0时。 随后按下button0不会切换LED,因此它不会再次进入DeepSleep。 但是,如果我在该函数中插入断点,它会转到该处并切换LED。Button1按预期工作并切换LED。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我将开始研究这个问题。 我没有看到MSP432或TI_RTOS的版本号。 如果您能告诉我,那会很有帮助。

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

    Ferdster,


    请参阅随附的文件。 这是一个使用RTC唤醒的LPM3示例。 请注意,附件是release.cfg文件。 此文件是CCS中包含的tirtos内核项目的一部分。 为了启用RTC,在powerdeepsleep项目的main_tirtos.c下,您会注意到RTC_C_IRQHandler调用Clock_tick();。 这将调用release.cfg中的时钟配置,您可以在其中指定用户定义时钟嘀嗒信号源和周期。 要打开release.cfg,请右键单击它,单击打开方式,然后单击XDCscript编辑器。


    在powerdeepsleep.c中,您将注意到行power_setConstraint(PowerMSP432_disallow_DeepSleep_1);阻止TIRTOS在电源策略中输入LPM4,从而有效地使TIRTOS在空闲时自动将设备发送到LPM3。 如果您需要更多说明或有任何疑问,请告诉我。

    e2e.ti.com/.../LPM3RTC.zip

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

    我还要指出,我们正在努力提供更多有关RTOS和管理电源策略及其他事项的培训内容。 这肯定是我们将来会更具体地关注的事情:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan:

    感谢您举个例子。 我有几个问题。

    1. release.cfg文件的参数'Clock.tickPeriod'在您的示例中设置为2000us。 这是什么? 将其更改为真正大的值(如 2500万us (25ms))似乎不会影响任何内容-中断处理程序仍每2 ms调用一次。

    2.最长的时间是否为8毫秒(MAP_RTC_C_DefinePrescaleEvent (RTC_C_prescale_0,RTC_C_PSEVENTDIVIDER_256);)? 如果我想每隔90秒唤醒一次,我需要使用自己的计数器进行唤醒吗?

    3.我测量了电流,电流为0.236mA,电流仍然过高,这是在所有跳线都被卸下的情况下,由外部3.3V PSU供电。

    4. LPM3还支持GPIO中断。 需要添加什么才能使BUTTON0从LPM3工作?

    谢谢。

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

    Ferdster,


    我想告诉您,我将调查您的后续问题,但我已经出国出差,现在正在跟进我的论坛问题。

    会尽快回复的:)

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

    再次感谢您的耐心等待。

    1)使用默认版本.cfg时,您的时钟配置默认设置为1000US (1ms)。 当您呼叫sleep(1)时,在代码中,您要求设备休眠1秒钟。 因此,在RTOS知道需要唤醒它之前,需要发生1000ms/1ms =1000 tick。 默认情况下,源不是RTC,而是如您所见的TimerA。

    当我们将其更改为RTC并将RTC的中断间隔设置为2毫秒时,我们需要调整所需的时钟信号,以确保我们的设备按预期保持休眠1秒。 因此,如果您将RTC更改为2毫秒,则需要2000个嘀嗒声来确保SLEEP (1);仍保持休眠状态1秒钟。

    如果要更改时钟信号以反映25毫秒,则需要调整中断,以便RTC也每25毫秒唤醒一次。

    2)因此,您应参阅MSP432 TRM (slau356)的18.2 6节。 此处说明RT0PSIFG和RT1PSIFG结合使用以创建更大的中断间隔。 在这种情况下,您需要设置RT0PS来获取RT1PS并将预校准器调整到所需的长度,并在函数调用'MAP_RTC_C_enableInterrupt (RTC_C_prescale_Timer1_interrupt)中将RT1PSIE设置为启用,而不是RT0PSIE;

    3)您是使用我发送给您的代码还是您自己的项目进行测量? 您是否确保终止所有GPIO? 您使用的是什么硬件,即LaunchPad?

    4)在第一个答复中附加的示例中,在'powerdeepsleep.c'中,我设置了回调函数并在*mainThread代码中启用了中断。

    回调函数是"gpioButtonFxn0",它基本上会唤醒,清除中断,清除进入while (1)之前设置的LED,然后返回休眠状态。 如果需要,可以将此代码更改为只切换LED。 这是否足够?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于不活动而关闭此线程。如果您有其他与此主题相关的问题,请随时提问,它将重新打开,否则,请在新线程中发布任何新问题! 谢谢!