Quantcast
Channel: MultiTech Developer Resources » All Posts
Viewing all articles
Browse latest Browse all 7111

mDot wakeup by RTC and interrupt

$
0
0

Hi everyone,

I have an issue with my mDot. I can’t wake it up from sleep.

The function I’m using is sleep_wake_rtc_or_interrupt from Dot-Examples/dot_util.
The issue pops up whenever I compile offline with GNU Arm Embedded Toolchain version other than 6 (6 2017-q2-update).

I’ve made a few modifications to the function to accept variable sleep time:


void sleep_wake_rtc_or_interrupt(bool deepsleep, uint32_t time)
{
    // in some frequency bands we need to wait until another channel is available before transmitting again
    // wait at least 10s between transmissions
    //uint32_t delay_s = dot->getNextTxMs() / 1000;
    uint32_t delay_s = time;
    /*
    if (delay_s < SLEEP_TIME )
    {
        delay_s = SLEEP_TIME ;
    }
    */

    if (deepsleep)
    {
        // for mDot, XBEE_DIO7 pin is the only pin that can wake the processor from deepsleep
        // it is automatically configured when INTERRUPT or RTC_ALARM_OR_INTERRUPT is the wakeup source and deepsleep is true in the mDot::sleep call
    }
    else
    {
        // configure XBEE_DIO7 pin as the pin that will wake the mDot from low power modes
        //      other pins can be confgured instead: XBEE_DIO2-6, XBEE_DI8, XBEE_DIN
        dot->setWakePin(XBEE_DIO7);    
    }

    logInfo("%ssleeping %lus or until interrupt on %s pin", deepsleep ? "deep" : "", delay_s, deepsleep ? "DIO7" : mDot::pinName2Str(dot->getWakePin()).c_str());

    logInfo("application will %s after waking up", deepsleep ? "execute from beginning" : "resume");

    // lowest current consumption in sleep mode can only be achieved by configuring IOs as analog inputs with no pull resistors
    // the library handles all internal IOs automatically, but the external IOs are the application's responsibility
    // certain IOs may require internal pullup or pulldown resistors because leaving them floating would cause extra current consumption
    // for xDot: UART_*, I2C_*, SPI_*, GPIO*, WAKE
    // for mDot: XBEE_*, USBTX, USBRX, PB_0, PB_1
    // steps are:
    //   * save IO configuration
    //   * configure IOs to reduce current consumption
    //   * sleep
    //   * restore IO configuration
    if (! deepsleep)
    {
        logInfo("Save IO configuration\n\r\n\r"); 
        wait_us(200000);
        // save the GPIO state.
        sleep_save_io();
    
        // configure GPIOs for lowest current
        sleep_configure_io();
    }
   
    // go to sleep/deepsleep and wake using the RTC alarm after delay_s seconds or rising edge of configured wake pin (only the WAKE pin in deepsleep)
    // whichever comes first will wake the xDot  
    dot->sleep(delay_s, mDot::RTC_ALARM_OR_INTERRUPT, deepsleep);

    if (! deepsleep)
    {
        // restore the GPIO state.
        sleep_restore_io();
        logInfo("Restore IO configuration");  
    }
}

But unmodified function does not work for me either. As well as calling dot->sleep(300, mDot::RTC_ALARM_OR_INTERRUPT, false) directly.
mDot just goes to sleep and never wakes up.
Though sleep_wake_rtc_only (mDot::RTC_ALARM) works as expected.

I tried setting the wakeup pin to 0 before going into sleep (as suggested in this thread), but it did not help.

Everything works as expected if compiled with the toolchain v6. But then I get the following warning:
Compiler version mismatch: Have 6.3.1; expected version >= 9.0.0 and < 10.0.0

I’m using:
libmDot v3.3.5
mbed-os v5.15.1
mbed-cli v1.8.3
GNU Arm Embedded Toolchain v9 (9-2019-q4-major)

What am I doing wrong?

Thanks


Viewing all articles
Browse latest Browse all 7111

Trending Articles