Skocz do zawartości

Kurs STM32L4 – #6 – oszczędzanie energii (5 lat na baterii?)


Pomocna odpowiedź

Pod tym linkiem jest zgłoszony ten bug do ST:

https://community.st.com/s/question/0D53W00001U3x5oSAB/does-not-generate-halrtcexsetwakeuptimerit?t=1673531776852

Wygląda na to że w wersji CubeMX 6.6 naprawili to ale ja uzywam teraz wersji 6.7.0-RC2 i bug jest więc mają chyba regresje. Napisałem im to. Zobaczymy

Link do komentarza
Share on other sites

@Treker Problem związany z potrzebą ręcznego dodania fragmentu:

  if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 20479, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
  {
    Error_Handler();
  }

w funkcji static void MX_RTC_Init(void) nadal występuje. Jeżeli istnieje opcja zgłoszenia problemu "innymi kanałami", to być może prawdopodobieństwo rozwiązania problemu zostanie zwiększone.

  • Lubię! 1
Link do komentarza
Share on other sites

@Kabestan dzięki za aktualizację. Ostatnio zgłaszałem to 13 lutego. Już 15 lutego dostałem potwierdzenie, że błąd faktycznie występuję i zostało to przekazane do zespołu zajmującego się STM32CubeMX. 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Przerabiam teraz właśnie ten rozdział kursu, napotkałem problem z wybudzeniem układu przy pomocy alarmu RTC. Konfiguracja RTC wygląda następująco:

pyt_FORBOT.thumb.png.ce0f4907e8711314928b0359e26f5ec3.png

( w zakładce NVIC Settings ustawiłem przerwanie jako "Enabled").

Korzystam z następującej konfiguracji zegara:

forbot_pyt_clk.thumb.png.ed35b7d3015d8376feda1501a21a2f0e.png

Po uruchomieniu dioda LD2 błyska jeden raz - zasymulowanie wykonania pierwszego pomiaru, amperomierz wskazuje 0,9μA - układ jest w trybie uśpienia. Problemem jest to, że układ się nie wybudza.

Z góry dziękuję za pomoc.

Link do komentarza
Share on other sites

@Gieneq Oczywiście:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_RTC_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*void HAL_Delay(uint32_t Delay){
	uint32_t tickstart = HAL_GetTick();
	uint32_t wait = Delay;

	if(wait < HAL_MAX_DELAY){
		wait += (uint32_t)uwTickFreq;
	}

	while((HAL_GetTick() - tickstart) < wait){
		__WFI();
	}
}*/



void start_measure(void){
	HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);

}

void stop_measure(void){
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);

}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* 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_RTC_Init();
  /* USER CODE BEGIN 2 */

  start_measure();
  HAL_Delay(50);
  stop_measure();

  // Enter the Standby mode
  HAL_PWR_EnterSTANDBYMode();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

	  /*start_measure();
	  HAL_Delay(50);
	  stop_measure();

	  // przerwa
	  HAL_Delay(10000);*/


    /* USER CODE END WHILE */

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

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure LSE Drive Capability
  */
  HAL_PWR_EnableBkUpAccess();
  __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_LSE
                              |RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = 0;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

  /** Enable MSI Auto calibration
  */
  HAL_RCCEx_EnableMSIPLLMode();
}

/**
  * @brief RTC Initialization Function
  * @param None
  * @retval None
  */
static void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */

  /* USER CODE END RTC_Init 0 */

  /* USER CODE BEGIN RTC_Init 1 */

  /* USER CODE END RTC_Init 1 */

  /** 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.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */

  /* USER CODE END RTC_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LD2_Pin */
  GPIO_InitStruct.Pin = LD2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

 

Link do komentarza
Share on other sites

@Gieneq Usunąłem funkcję

HAL_PWR_EnterSTANDBYMode();

stawiłem pułapkę na funkcji:

/**
  * @brief This function handles RTC wake-up interrupt through EXTI line 20.
  */
void RTC_WKUP_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_WKUP_IRQn 0 */

  /* USER CODE END RTC_WKUP_IRQn 0 */
  HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_WKUP_IRQn 1 */

  /* USER CODE END RTC_WKUP_IRQn 1 */
}

w pliku stm32l4xx_it.c, ale po wybraniu "Resume" (lub F8) debugger nie zatrzymuje się na niej tylko wchodzi do pętli głównej (po wybraniu "Suspend" strzałka wskazuje while(1)). 

Link do komentarza
Share on other sites

@Kuba_3737 wygląda na to że jest ok, ale coś nie startuje RTC. Możnaby sprawdzić bity kontrolne peryferiów RTC z dokumentacji.

Ale jeszcze na szybko. Nie pamiętam czy ta płytka nucleo ma LSE, ale w projekcie przy którym teraz robię RTC nie może być taktowany z wewnętrznego źródła tylko musi mieć dedykowany LSE. Na zrzucie z zegarów masz podłączenie do LSI. 

Link do komentarza
Share on other sites

@Gieneq Zgadza się był podłączony do LSI. Na forum STM znalazłem podobny przykład (https://community.st.com/t5/stm32-mcus/how-to-configure-the-rtc-to-wake-up-the-stm32-periodically-from/ta-p/49836). W tym przykładzie RTC jest taktowany z LSE (i na to źródło sygnału zmieniłem konfigurację w CubeMX), polecenia:

HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);

zastąpiłem:

void start_measure(void);
void stop_measure(void);

(jak w kursie).

Reszty przykładu nie zmieniałem i uzyskałem działający program. Jego działanie nieco odbiega od tego z kursu (kosztem większego poboru prądu - w stanie uśpienia 1.7μA zachowywana jest konfiguracja rejestrów oraz pamięć RAM).

  • Lubię! 1
Link do komentarza
Share on other sites

@Kuba_3737 O super, cieszę się że roszyło 🙂 tak BTW, polecam Ci zajrzeć do folderu repo dla L4. U mnie jest to folder użytkownika / STM32Cube / Repository. Przykładowo dla U5 jest kilka przykładów dla RTC:

image.thumb.png.cd73744e1c51ddef4cff887d8936a468.png

Dobrze jest je wciągnąć do Cuba - otwierasz plik projektu. Przykłady te składają się polinkowanych wspólnych plików i mogą wydawać się niekompletne w eksploratorze plików.

  • Lubię! 1
Link do komentarza
Share on other sites

Bardzo fajnie poprowadzony tok rozumowania, po kolei krok po kroku kolejne sposoby które powodują dalsze zmniejszanie zapotrzebowania na energie przez kontroler. Bardzo doceniam takie poukładane kursy, mogę się tylko domyślać ile czasu pochłonęło przygotowanie tego kursu. Tyczy się to także wcześniejszych części oraz kursów, graty dla Was.😀

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.