cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 4 MCU

ErGo_3681856
New Contributor

We are using the CY8C4248 and having an intermittent, irregular lock-up of the main loop. Interrupts are still able to occur, so our WatchDogTimer still fires. After 60 of not running all the way through the main loop, we print the main stack (__get_MSP) and compare memory addresses to the elf file. The main stack trace appears to read:

InterruptPointer(Same address as _getPSP)

ll_wait_to_enter_dsm (possibly deep sleep mode?)

ll_enter_sm_mode

ll_derive_ce_length_for_s

llft_service_queue

CyBle_SignalBleStackTask

OS_scheduler

enterLowPowerStateIfPossible (where we call CySysPmDeepSleep())

main

1) Is it possible for deep sleep mode to stop waking when our timer is fired?

2) What tools other than the debugger does cypress have to trace the source of lockups? We are using the bootloader, deep sleep mode, and interrupts. All of which aren't happy with attaching a debug tool.

0 Likes
4 Replies
ErGo_3681856
New Contributor

Here is the deep sleep mode code:

void enterLowPowerStateIfPossible(void) {

    CYBLE_LP_MODE_T bleMode;

    uint8 interruptStatus;

if((CyBle_GetState() == CYBLE_STATE_ADVERTISING) ||

   (CyBle_GetState() == CYBLE_STATE_CONNECTED)) {

        bleMode = CyBle_EnterLPM(CYBLE_BLESS_DEEPSLEEP);

        interruptStatus = CyEnterCriticalSection(); // Disable global interrupts

        if(bleMode == CYBLE_BLESS_DEEPSLEEP) { // When BLE subsystem has been put into Deep-Sleep mode

if( (CyBle_GetBleSsState() == CYBLE_BLESS_STATE_ECO_ON) ||

(CyBle_GetBleSsState() == CYBLE_BLESS_STATE_DEEPSLEEP)) {

CySysPmDeepSleep();

}

}

else {

            // And hardware doesn't finish Tx/Rx opeation - put the CPU into Sleep mode

if(CyBle_GetBleSsState() != CYBLE_BLESS_STATE_EVENT_CLOSE) {

CySysPmSleep();

}

}

CyExitCriticalSection(interruptStatus); // Enable global interrupt

}

CyBle_ProcessEvents();

gblIRQ.watchdogTriggered = false;

}

0 Likes
VenkataD_41
Moderator
Moderator

Hi,

>>"Is it possible for deep sleep mode to stop waking when our timer is fired?"

--> You can disable the Watch dog timer interrupt near the NVIC. Please check the IRQ number for Watch dog timer for the device you are using in the device Architecture TRM. Once you find the IRQ number, you can disable the interrupt using NVIC registers. Please refer ARM Cortex Mx Generic user guide for this.

To debug the issue, I recommend you to remove the bootloader, Watchdog timer as well as DeepSleep API from the project and check if other functionality is working fine. Then you can introduce bootloader and Watchdog timer. Later you can use deep sleep commands and check.

Please attach your project to understand the firmware flow.

Thanks

Ganesh

0 Likes
ErGo_3681856
New Contributor

Hello Ganesh,

I do not want to disable the watch dog timer. I am wondering why the watch dog timer stops waking up the device from deep sleep.

When I remove the deep sleep mode, the device runs fine. With deep sleep, the device locks up randomly every 1-6 hours. The device appear to not leave  "enterLowPowerStateIfPossible()" as writen above, which is in our main loop.

Thanks,

Eric

0 Likes
ErGo_3681856
New Contributor

1) Is enterLowPowerStateIfPossible() written correctly?

2) Is there an errata sheet for the CY8C4248? I can not locate one on the product webpage.

0 Likes