2024-03-22 08:07 AM
Hi everyone!
I have an u585 related question:
Can I configure RTC internal wakeup line other than PWR_WAKEUP_PIN7_HIGH_3 ?
In all u5xx examples used this line, but We have an external wakeup source on PB.15.
I can't change it in CubeMX and I can't find any reference to change the RTC wakeup line, and if I use PWR_WAKEUP_PIN_HIGH_3, the RTC isn't weak up the CPU anymore.
On the stm32u5xx_hal_pwr.h defined more than one pin as RTC wakeup:
Another question:
We are using standby mode, but sometimes the processor does not go into standby, but into unknown stop mode.
We noticed this by not doing a reset after wakeup.
Is there any condition to make the CPU go to stop mode instead of standby mode even though HAL_PWR_EnterSTANDBYMode() is called?
Thank you!
2024-04-15 06:07 AM
Hi @ccuebler,
Concerning you first question, as indicated in the Table 97 of RM0456 (or bellow), You cannot use both B15 and (RTC_ALRA, RTC_ALRB, RTC_WUT, or RTC_TS) as Wakeup source for WKUP7.
Attention : WKUP7 can only use RTC wakeup line if:
About your second point, I have several ones in order to clarify your application and understand the MCU behavior:
Best regards,
Alexis LOUIS
ST Embedded Software Engineer
2024-04-15 07:11 AM
Hi @AlexisL !
Thank you for reply.
The wakeup problem:
So if the RTC is secured, it use the WKUP6 instead of WKUP7. I get it.
The second :
No, we didn't clear the Pending IRQs. I will modify my code.
My standby part of code has an branch, because we decide which mode to use (stop or standy) depending on the battery SOC, so if the MCU can not go to standby or stop, we see it in the log:
Debug("================= ENTER SEEP/STANDBY for %d sec ==========================\n", sec);
// Clear WDT...
HAL_IWDG_Refresh(&hiwdg);
HAL_SuspendTick();
if (battery.soc < 70) {
HAL_PWR_EnterSTANDBYMode();
}
else {
HAL_PWREx_EnterSTOP2Mode(PWR_SLEEPENTRY_WFI);
}
HAL_IWDG_Refresh(&hiwdg);
// After sleep
HAL_Init();
SystemClock_Config();
HAL_ResumeTick();
Debug("================= WAKEUP! ==========================\n");
In the PWR->SR was nothing, all the bits are cleared, but In the RCC_CSR the PINRSTF and the OBLRSTF was set.
And now after an OTA routine, we seen same behavior.
/*************************************
* @brief Apply option bytes
*************************************/
static void prvOptionByteApply( void ){
HAL_IWDG_Refresh(&hiwdg);
Debug( "Option Byte Launch in progress.\n" );
( void ) HAL_FLASH_Unlock();
( void ) HAL_FLASH_OB_Unlock();
/* Generate System Reset to load the new option byte values ***************/
/* On successful option bytes loading the system should reset and control should not return from this function. */
( void ) HAL_FLASH_OB_Launch();
}
After the OB_Launch, the MCU was reseting, and run from the second bank. But after the STOP2, on wakeup time, the MCU was restarted, and the OBLRSTF was set. And repeated again after STOP2.
Only the full FLASH erase was solve that problem.
I use the OTA code from https://github.com/FreeRTOS/iot-reference-stm32u5/blob/main/Projects/b_u585i_iot02a_ntz/Src/ota_pal/ota_pal_stm32u5_ntz.c
The major difference, I need to clear all flash error flags before erase or program the FLASH, like this:
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
if( HAL_FLASHEx_Erase( &pEraseInit, &pageError ) != HAL_OK )
{
getFlashError();
ERROR( "Failed to erase the flash bank, errorCode = %u, pageError = %u.\n", HAL_FLASH_GetError(), pageError );
xResult = false;
}
Otherwise we alwasy get a HAL_FLASH_ERROR_PGS error.
Best regards
Krisztian
2024-04-16 07:58 AM
Hi @ccuebler,
Thank you for the additional data you provided.
Concerning the HAL_FLASH_ERROR_PGS, you can find page 295 of RM0456 that a PGS Error is triggered when "An error like INCERR, WRPERR, PGSERR, STRBERR, OPTCHANGEERR, OBKERR or OBKWERR have not been cleared before requesting a new write or erase operation, OBK operation or options change." (chapter 7.9.4), so the behavior your observed is the expected one.
I hope those explanations will help you to solve your issue.
Best regards,
Alexis LOUIS
ST Embedded Software Engineer
2024-04-17 02:59 AM
Hi @AlexisL,
Thank you, I will testing with cleared pending IRQs.
According to RM045, I clear that bit after reset, using __HAL_RCC_CLEAR_RESET_FLAGS,
but after the MCU wakes up from STOP, it set again, and the MCU reseting on wakeup time instead of countinues the code.
int main( void ){
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
uint32_t resetf = RCC->CSR; //RESET Flags
uint32_t standbyf = PWR->SR; //Standby flags
uint32_t wakeupf = PWR->WUSR;// Wakeup flags
standbyFlag = (
__HAL_PWR_GET_FLAG(PWR_FLAG_SBF) == SET || // Standby Flag
__HAL_PWR_GET_FLAG(PWR_WAKEUP_FLAG6) == SET || // TOF Interrupt wakeup
__HAL_PWR_GET_FLAG(PWR_WAKEUP_FLAG7) == SET || // TOF Interrupt wakeup
__HAL_PWR_GET_FLAG(PWR_WAKEUP_FLAG8) == SET // RTC Interrupt wakeup
);
TOFInterrupt = __HAL_PWR_GET_FLAG(PWR_WAKEUP_FLAG7) == SET;
//Clear reset flags
__HAL_RCC_CLEAR_RESET_FLAGS();
// Clear standby flags
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SBF);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_STOPF);
// Configure the system clock
SystemClock_Config();
3. Maybe the OTA code in the RTOS's reference was wrong. I revise it.
Best regards,
Krisztian
2024-05-22 08:29 AM
Hi @ccuebler,
I hope that our exchange helped you and that you've found a solution to your issue.
Best regards,
Alexis LOUIS
ST Embedded Software Engineer