Stop Momde, Allarm and stm32L152RE

380 Views Asked by At

I have a NUCLEO STM32L152RE. I want to use the low power features of this board and wrote this easy example. I use CubeMX to configure the board.

I want to wake up every 3 minutes, but 6 minutes later the system freezes.

/* Private variables */ 
ADC_HandleTypeDef hadc;
I2C_HandleTypeDef hi2c1;
RTC_HandleTypeDef hrtc;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim11;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
 /* USER CODE BEGIN PV */
 /* USER CODE END PV */
  void SystemClock_Config(void);
  void Error_Handler(void);
 static void MX_GPIO_Init(void);
 static void MX_RTC_Init(void);
 static void MX_USART1_UART_Init(void);
 static void MX_USART2_UART_Init(void);
 static void MX_ADC_Init(void);
 static void MX_I2C1_Init(void);
static void MX_TIM3_Init(void);
static void MX_TIM11_Init(void);
static void MX_USART3_UART_Init(void);


 uint8_t data[]={3,3};
 uint8_t data2[]={2,3};
 uint8_t data3[]={5,6};
 uint8_t dataS4[]={4,4};
 uint8_t dataS5[]={5,5};
 uint8_t dataS6[]={6,6};
 uint8_t dataS7[]={9,9};
 uint8_t dataD[]={7,7};
 uint8_t dataS1[]={1,1};
 uint8_t command1[]="default;"; //  
 uint8_t command2[]="up;";      // THE SYSTEM UP
 int i = 0;
/* USER CODE END 0 */

int main(void)
{
  /* USER CODE BEGIN 1 */
  HAL_PWR_EnableBkUpAccess(); //enable PWR backup domain access (RTC,BKReg)
   __HAL_RCC_RTC_ENABLE();   //Enable RTC. not created by cube because the RTC can run.
  /* USER CODE END 1 */
   /* MCU Configuration------*/
   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();
 /* Configure the system clock */
 SystemClock_Config();
 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_RTC_Init();
 MX_USART1_UART_Init();
 MX_USART2_UART_Init();
 MX_ADC_Init();
 MX_I2C1_Init();
 MX_TIM3_Init();
 MX_TIM11_Init();
 MX_USART3_UART_Init();
 /* USER CODE BEGIN 2 */
 HAL_UART_Transmit(&huart2,data,2,1000); 
 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {

  // here i have code....... 

 HAL_Delay(500);
 HAL_UART_Transmit(&huart2,dataS7,2,1000); 
 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);   // stop mode
  }
  }

RTC Initialization

/* RTC init function */
static void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
RTC_AlarmTypeDef sAlarm;

/**Initialize RTC Only  */
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
 if (HAL_RTC_Init(&hrtc) != HAL_OK)
 {
 Error_Handler();
 }
  /**Initialize RTC and set the Time and Date     */
 sTime.Hours = 0x0;
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
 {
  Error_Handler();
  }
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 0x1;
sDate.Year = 0x0;
 if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
 Error_Handler();
 }

 /**Enable the Alarm A     */
 sAlarm.AlarmTime.Hours = 0x0;
 sAlarm.AlarmTime.Minutes = 0x3;
 sAlarm.AlarmTime.Seconds = 0x0;
 sAlarm.AlarmTime.SubSeconds = 0x0;
 sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
 sAlarm.AlarmMask =RTC_ALARMMASK_NONE;
 sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
 sAlarm.AlarmDateWeekDay = 0x1;
 sAlarm.Alarm = RTC_ALARM_A;
 if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
  {
   Error_Handler();
  }

   }

Here I have the code for handling the interrupt:

    /* interrupt callback */
    void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
    RTC_AlarmTypeDef sAlarm;
    HAL_RTC_GetAlarm(hrtc,&sAlarm,RTC_ALARM_A,FORMAT_BIN);
    if(sAlarm.AlarmTime.Minutes>58){
    sAlarm.AlarmTime.Minutes=0;
    }else{
    sAlarm.AlarmTime.Minutes=sAlarm.AlarmTime.Minutes+1;
      }
     while(HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BIN)!=HAL_OK){} 
     SystemClock_Config();                           // UP THE SYSTEM
     HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);          //TAGGLE THE  LED
     HAL_UART_Transmit(&huart2,data3,2,1000);
     HAL_UART_Transmit(&huart1,command2,sizeof(command2),1000);
      }

I want that every 3 minutes the system wakes up and later goes in stop mode, but the system doesn't work. After 60 minutes the system doesn't do anything. Can you help me?

0

There are 0 best solutions below