Stm32 待命后加入

Stm32 待命后加入,stm32,standby,lorawan,Stm32,Standby,Lorawan,我在STM32WB上使用LoRaWAN发送一些信息,然后进入待机模式。 问题是在我待机后,一个新的加入就完成了。 我听说我的连接可以使用MIB函数保存在内存中,但我无法正确使用它们并继续进行连接根本不进行连接。。。 有人知道如何使用它们吗?或者在什么地方有好的教程吗?(我暂时什么也没找到) 以下是我实际上正在尝试的: uint32_t last_time = 0; int main(void) { /* USER CODE BEGIN 1 */ data_t data; LoraF

我在STM32WB上使用LoRaWAN发送一些信息,然后进入待机模式。 问题是在我待机后,一个新的加入就完成了。 我听说我的连接可以使用MIB函数保存在内存中,但我无法正确使用它们并继续进行连接根本不进行连接。。。 有人知道如何使用它们吗?或者在什么地方有好的教程吗?(我暂时什么也没找到)

以下是我实际上正在尝试的:

uint32_t last_time = 0;

int main(void)
{
  /* USER CODE BEGIN 1 */
  data_t data;
  LoraFlagStatus join_status = LORA_RESET;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_I2C1_Init();
  MX_LPTIM1_Init();
  MX_LPUART1_UART_Init();
  MX_RF_Init();
  HW_RTC_Init();
  MX_SPI1_Init();
  MX_I2C3_Init();
  MX_SPI2_Init();
  /* USER CODE BEGIN 2 */
  /* Reduce the System clock to below 2 MHz */
  SystemClock_Decrease();

  /* Set regulator voltage to scale 2 */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2);

  HAL_PWREx_EnableLowPowerRunMode();

  float iaq;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

  MibRequestConfirm_t mibReq;

  mibReq.Type = MIB_NETWORK_ACTIVATION;

  LoRaMacMibGetRequestConfirm( &mibReq );

  if( mibReq.Param.NetworkActivation == ACTIVATION_TYPE_NONE )
  {
      lora_init();
      join_status = lora_join();
  }

  while (1)
  {

    //sensor code and lora send

      lora_update(); /* Must be called for the LoRa stack to work */

      pres = false;


      /* Enable and set RTC_WKUP_IRQ */
      HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 2, 0);
      HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);

      /* Check if the system was resumed from StandBy mode */
      /* Note: On STM32WB, both CPU1 and CPU2 must be in standby mode to set the entire system in standby mode */
      if(   (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
         && (__HAL_PWR_GET_FLAG(PWR_FLAG_C2SB) != RESET)
        )
      {
        /* Clear Standby flag */
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_C2SB);
      }

      /* Insert 5 seconds delay */
      HAL_Delay(5000);

      /* Disable all used wakeup sources*/
      HAL_RTCEx_DeactivateWakeUpTimer(&RtcHandle);

      /* Clear all related wakeup flags */
      __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

      /* Re-enable wakeup source */
      /* ## Setting the Wake up time ############################################*/
      HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, 60, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);;

      /* Specific procedure on STM32WB, in case of initial power-up and RF stack no started */
      if(   (LL_PWR_IsActiveFlag_C1SB() == 0)
         || (LL_PWR_IsActiveFlag_C2SB() == 0)
        )
      {
        /* Set the lowest low-power mode for CPU2: shutdown mode */
        LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);
      }

      /* Enter the Standby mode */
      HAL_PWR_EnterSTANDBYMode();

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


/* USER CODE BEGIN 4 */
/**
  * @brief  System Clock Speed decrease
  *         The system Clock source is shifted from HSI to MSI
  *         while at the same time, MSI range is set to RCC_MSIRANGE_5
  *         to go down to 2MHz
  * @param  None
  * @retval None
  */
void SystemClock_Decrease(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  /* Select MSI as system clock source */
  /* Note: Keep AHB and APB prescaler settings from previous structure initialization */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }

  /* Disable PLL to reduce power consumption since MSI is used from that point */
  /* Change MSI frequency */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
}

/* USER CODE END 4 */

嘿欢迎来到SO!你能发布一些你试过的代码吗?这样你的问题更容易得到回答。嘿,谢谢,我已经用我的实际代码编辑了我的帖子。你在使用I-Cube LRWAN吗?我不认为有任何代码可以确保LoRa状态在待机模式下保持不变,如果我的内存正常,待机模式不会将所有RAM保留在STM32上(但您的MCU可能与我使用的STM32L4不同)。我假设链接器脚本决定了保留区域中的最终结果。我在STM32L4上看到了stopmode(保留所有RAM)的良好效果,即无需重新连接。我认为
lora_update
功能对于了解系统上发生的情况至关重要。是的,我正在使用I-Cube LRWAN。如果在待机状态下无法使用,我将使用其他功能。。。我已经开始尝试使用停止模式,但我的外围设备在醒来后不再工作,我不知道为什么它们可能不工作,因为您没有重新启用它们。在停止模式下取消外围设备的配置。