LoRaWAN присоединяется после ожидания - PullRequest
3 голосов
/ 19 июня 2020

Я отправляю некоторую информацию с помощью LoRaWAN на STM32WB и после этого перехожу в режим ожидания. Проблема в том, что после моего ожидания выполняется новое соединение. Я слышал, что мое соединение можно сохранить в памяти с помощью функций 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 */
...