- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Tags:
- lockup
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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;
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
1) Is enterLowPowerStateIfPossible() written correctly?
2) Is there an errata sheet for the CY8C4248? I can not locate one on the product webpage.