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.

MSP432P401R怎样降低功耗

Other Parts Discussed in Thread: SYSBIOS

我正在使用MSP432 LaunchPad ,现在烧入了例程GPIO interrupt,,测量最低电流在1.8~2.1mA之间浮动,请问怎样降低功耗并稳定电流?

  • 您可以看一下 采用 SimpleLink™ MSP432™ 微控制器设计超低功耗 (ULP)应用 这个文档

    www.ti.com.cn/.../zhca686a.pdf
  • 没有使用到的io,注意将其设置为输出;或者是设置为输入,但是将管脚的电平固定,可以通过外部电路将管脚连接至Vcc或者GND,也可使能内部上下拉电阻,将管脚电平固定。

  • 我是个新手,有没有更简单明了的东西呢?谢谢
  • 我下载了一个Ti官方低功耗例程,就是您说的设置io电平,以及进入LPM3模式,烧入后电流可以降到1.2uA左右,然后使用Empty Project例程整合低功耗例程到Task返回函数里,只能降低到1.0mA左右,而且无法唤醒。不知道有没有什么更好的方法降低功耗。新手的我现在很绝望啊。谢谢了
  • 要结合具体的应用来分析的,建议详细描述下你的需求,并提供下现在的代码
  • 以下为代码
    /* XDCtools Header files */
    #include <xdc/std.h>
    #include <xdc/runtime/System.h>

    /* BIOS Header files */
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>

    /* TI-RTOS Header files */
    #include <ti/drivers/GPIO.h>
    // #include <ti/drivers/I2C.h>
    // #include <ti/drivers/SDSPI.h>
    // #include <ti/drivers/SPI.h>
    // #include <ti/drivers/UART.h>
    // #include <ti/drivers/Watchdog.h>
    // #include <ti/drivers/WiFi.h>

    /* Board Header file */
    #include "Board.h"
    void MSP_LOWPOWER(void);
    #define TASKSTACKSIZE 512
    Task_Struct task0Struct;
    Char task0Stack[TASKSTACKSIZE];
    /*
    * ======== heartBeatFxn ========
    * Toggle the Board_LED0. The Task_sleep is determined by arg0 which
    * is configured for the heartBeat Task instance.
    */
    Void heartBeatFxn(UArg arg0, UArg arg1)
    {
    Task_sleep((UInt)arg0);
    /* Hold the watchdog */
    WDTCTL = WDTPW | WDTHOLD;
    /* Configuring P1.0 as output and P1.1 (switch) as input with pull-up resistor*/
    /* Rest of pins are configured as output low */
    /* Notice intentional '=' assignment since all P1 pins are being deliberately configured */
    P1DIR = ~(uint8_t) BIT1;
    P1OUT = BIT1;
    P1REN = BIT1; // Enable pull-up resistor (P1.1 output high)
    P1SEL0 = 0;
    P1SEL1 = 0;
    P1IFG = 0; // Clear all P1 interrupt flags
    P1IE = BIT1; // Enable interrupt for P1.1
    P1IES = BIT1; // Interrupt on high-to-low transition

    // Enable Port 1 interrupt on the NVIC
    NVIC->ISER[1] = 1 << ((PORT1_IRQn) & 31);

    // Terminate all remaining pins on the device
    P2DIR |= 0xFF; P2OUT = 0;
    P3DIR |= 0xFF; P3OUT = 0;
    P4DIR |= 0xFF; P4OUT = 0;
    P5DIR |= 0xFF; P5OUT = 0;
    P6DIR |= 0xFF; P6OUT = 0;
    P7DIR |= 0xFF; P7OUT = 0;
    P8DIR |= 0xFF; P8OUT = 0;
    P9DIR |= 0xFF; P9OUT = 0;
    P10DIR |= 0xFF; P10OUT = 0;

    /* Configure Port J */
    PJDIR |= (BIT2 | BIT3); PJOUT &= ~(BIT2 | BIT3);

    /* PJ.0 & PJ.1 configured for XT1 */
    PJSEL0 |= BIT0 | BIT1;
    PJSEL1 &= ~(BIT0 | BIT1);

    /* Starting LFXT in non-bypass mode without a timeout. */
    CS->KEY = CS_KEY_VAL ;
    CS->CTL1 &= ~(CS_CTL1_SELA_MASK | CS_CTL1_SELB | CS_CTL1_SELM_MASK);
    CS->CTL1 |= CS_CTL1_SELA__LFXTCLK; // Source LFXTCLK to ACLK & BCLK
    CS->CTL2 &= ~(CS_CTL2_LFXTDRIVE_MASK); // Configure to lowest drive-strength
    CS->CTL2 |= CS_CTL2_LFXT_EN;
    while (CS->IFG & CS_IFG_LFXTIFG)
    CS->CLRIFG |= CS_IFG_LFXTIFG;
    CS->KEY = 0;
    /* Turn off PSS high-side supervisors */
    PSS->KEY = PSS_KEY_KEY_VAL;
    PSS->CTL0 |= PSS_CTL0_SVSMHOFF;
    PSS->KEY = 0;

    /* Enable PCM rude mode, which allows to device to enter LPM3 without waiting for peripherals */
    PCM->CTL1 = PCM_CTL0_KEY_VAL | PCM_CTL1_FORCE_LPM_ENTRY;

    /* Enable all SRAM bank retentions prior to going to LPM3 */
    SYSCTL->SRAM_BANKRET |= SYSCTL_SRAM_BANKRET_BNK7_RET;
    __enable_interrupt();
    SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; // Do not wake up on exit from ISR


    /* Setting the sleep deep bit */
    SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk);
    /* Go to LPM3 */
    __sleep();
    }

    /*
    * ======== main ========
    */
    int main(void)
    {
    Task_Params taskParams;

    /* Call board init functions */
    Board_initGeneral();
    Board_initGPIO();
    // Board_initI2C();
    // Board_initSDSPI();
    // Board_initSPI();
    // Board_initUART();
    // Board_initWatchdog();
    // Board_initWiFi();



    /* Construct heartBeat Task thread */
    Task_Params_init(&taskParams);
    taskParams.arg0 = 5000;
    taskParams.stackSize = TASKSTACKSIZE;
    taskParams.stack = &task0Stack;
    Task_construct(&task0Struct, (Task_FuncPtr)heartBeatFxn, &taskParams, NULL);

    /* Turn on user LED */
    GPIO_write(Board_LED0, Board_LED_ON);

    /* Start BIOS */
    BIOS_start();

    return (0);
    }
    /* Port1 ISR */
    void PORT1_IRQHandler(void)
    {
    volatile uint32_t i, status;
    /* Toggling the output on the LED */
    if(P1IFG & BIT1)
    P1OUT ^= BIT0;

    /* Delay for switch debounce */
    for(i = 0; i < 10000; i++)

    P1IFG &= ~BIT1;

    }
    代码是结合了empty project与论坛下载的官方低功耗例程。
    应用就是在学习怎样在一个task里进入LPM3,并且要做到可以随时唤醒。
  • 你少如的这个例子是没有实现低功耗的,你要进入几种低功耗模式再测就不一样了。