From 051c659614a0de23d90a7e846f2034cbeb5b30a3 Mon Sep 17 00:00:00 2001 From: d0kuhn Date: Thu, 14 Dec 2023 18:40:43 +0100 Subject: [PATCH] first time using RTC --- include/main.h | 2 + include/stm32l0xx_hal_conf.h | 2 +- include/stm32l0xx_it.h | 1 + src/main.c | 158 ++++++++++++++++++++++++++++++++--- src/stm32l0xx_hal_msp.c | 50 +++++++++++ src/stm32l0xx_it.c | 15 ++++ 6 files changed, 214 insertions(+), 14 deletions(-) diff --git a/include/main.h b/include/main.h index 1f1a92d..c93e5f4 100644 --- a/include/main.h +++ b/include/main.h @@ -36,6 +36,8 @@ extern "C" { /* Exported types ------------------------------------------------------------*/ /* USER CODE BEGIN ET */ +RTC_HandleTypeDef hrtc; + TIM_HandleTypeDef htim2; SPI_HandleTypeDef hspi1; diff --git a/include/stm32l0xx_hal_conf.h b/include/stm32l0xx_hal_conf.h index c7a957e..8a77be4 100644 --- a/include/stm32l0xx_hal_conf.h +++ b/include/stm32l0xx_hal_conf.h @@ -49,7 +49,7 @@ /*#define HAL_LCD_MODULE_ENABLED */ /*#define HAL_LPTIM_MODULE_ENABLED */ /*#define HAL_RNG_MODULE_ENABLED */ -/*#define HAL_RTC_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED /*#define HAL_TSC_MODULE_ENABLED */ diff --git a/include/stm32l0xx_it.h b/include/stm32l0xx_it.h index 832ca06..9733211 100644 --- a/include/stm32l0xx_it.h +++ b/include/stm32l0xx_it.h @@ -51,6 +51,7 @@ void HardFault_Handler(void); void SVC_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void RTC_IRQHandler(void); void EXTI4_15_IRQHandler(void); void TIM2_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/src/main.c b/src/main.c index 0adcc70..bc3f4f7 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,7 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ + /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -52,6 +53,7 @@ static void MX_SPI1_Init(void); static void MX_USART1_UART_Init(void); static void MX_USART2_UART_Init(void); static void MX_TIM2_Init(void); +static void MX_RTC_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -141,15 +143,7 @@ static void reportfunc (osjob_t* j) { LMIC.frame[1] = val; LMIC_setTxData2(1, LMIC.frame, 2, 0); // (port 1, 2 bytes, unconfirmed) // reschedule job in 60 seconds - os_setTimedCallback(j, os_getTime()+sec2osticks(300), reportfunc); -} - -static osjob_t testjob; - -static void testfunc (osjob_t* j){ - debug_str("Hallo Welt \n"); - // reschedule job in 6 seconds - os_setTimedCallback(j, os_getTime()+sec2osticks(1), testfunc); + // os_setTimedCallback(j, os_getTime()+sec2osticks(300), reportfunc); } ////////////////////////////////////////////////// @@ -201,6 +195,8 @@ void onEvent (ev_t ev) { debug_str((const char*)LMIC.dataLen); debug_str(" bytes of payload\r\n"); } + /* ### Enter in Stop mode ########################################### */ + // HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); break; case EV_LOST_TSYNC: debug_str("EV_LOST_TSYNC\r\n"); @@ -259,6 +255,7 @@ int main(void) MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_TIM2_Init(); + MX_RTC_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim2); // <----------- change to your setup @@ -277,7 +274,7 @@ int main(void) os_setCallback(&initjob, initfunc); // execute scheduled jobs and events // os_setTimedCallback(&testjob, os_getTime()+sec2osticks(1), testfunc); - os_setTimedCallback(&reportjob, os_getTime()+sec2osticks(300), reportfunc); + // os_setTimedCallback(&reportjob, os_getTime()+sec2osticks(300), reportfunc); os_runloop(); // (not reached) return 0; @@ -295,7 +292,6 @@ int main(void) /* USER CODE END 3 */ } - /** * @brief System Clock Configuration * @retval None @@ -313,9 +309,10 @@ void SystemClock_Config(void) /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI; RCC_OscInitStruct.HSIState = RCC_HSI_DIV4; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8; @@ -338,15 +335,101 @@ void SystemClock_Config(void) { Error_Handler(); } - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2; + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2 + |RCC_PERIPHCLK_RTC; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } +/** + * @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 */ + + RTC_TimeTypeDef sTime = {0}; + RTC_DateTypeDef sDate = {0}; + RTC_AlarmTypeDef sAlarm = {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 = 99; + hrtc.Init.SynchPrediv = 369; + 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 Check_RTC_BKUP */ + + /* USER CODE END Check_RTC_BKUP */ + + /** Initialize RTC and set the Time and Date + */ + sTime.Hours = 0; + sTime.Minutes = 0; + sTime.Seconds = 0; + sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + sTime.StoreOperation = RTC_STOREOPERATION_RESET; + if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) + { + Error_Handler(); + } + sDate.WeekDay = RTC_WEEKDAY_MONDAY; + sDate.Month = RTC_MONTH_JANUARY; + sDate.Date = 1; + sDate.Year = 0; + + if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) + { + Error_Handler(); + } + + /** Enable the Alarm A + */ + sAlarm.AlarmTime.Hours = 0; + sAlarm.AlarmTime.Minutes = 5; + sAlarm.AlarmTime.Seconds = 0; + sAlarm.AlarmTime.SubSeconds = 0; + sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; + sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS + |RTC_ALARMMASK_SECONDS; + sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; + sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; + sAlarm.AlarmDateWeekDay = 1; + sAlarm.Alarm = RTC_ALARM_A; + if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + /** * @brief SPI1 Initialization Function * @param None @@ -549,7 +632,56 @@ static void MX_GPIO_Init(void) } /* USER CODE BEGIN 4 */ +void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { + RTC_AlarmTypeDef sAlarm; + // RTC_TimeTypeDef sTime; + reportfunc(&reportjob); + + // HAL_RTC_GetTime(hrtc,&sTime, RTC_FORMAT_BIN); + HAL_RTC_GetAlarm(hrtc,&sAlarm,RTC_ALARM_A,FORMAT_BIN); + + uint8_t next_minutes = sAlarm.AlarmTime.Minutes + 5; + if (next_minutes > 59) next_minutes = 0; + + + sAlarm.AlarmTime.Minutes = next_minutes; + + while(HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BIN)!=HAL_OK){} + + +} + +// void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { +// RTC_TimeTypeDef sTime; +// RTC_DateTypeDef sDate; + +// reportfunc(&reportjob); + +// HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BCD); +// // HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BCD); + +// uint8_t next_minutes = sTime.Minutes + 5; +// if (next_minutes > 59) next_minutes = 0; + +// RTC_AlarmTypeDef sAlarm; +// sAlarm.AlarmTime.Hours = 0; +// sAlarm.AlarmTime.Minutes = next_minutes; +// sAlarm.AlarmTime.Seconds = 0; +// sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT_24; +// sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; +// sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; +// sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS +// |RTC_ALARMMASK_SECONDS; +// sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; +// sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; +// sAlarm.AlarmDateWeekDay = 1; +// sAlarm.Alarm = RTC_ALARM_A; + +// while(HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, RTC_FORMAT_BCD)!=HAL_OK){} + + +// } /* USER CODE END 4 */ /** diff --git a/src/stm32l0xx_hal_msp.c b/src/stm32l0xx_hal_msp.c index cabf774..328baf2 100644 --- a/src/stm32l0xx_hal_msp.c +++ b/src/stm32l0xx_hal_msp.c @@ -77,6 +77,56 @@ void HAL_MspInit(void) /* USER CODE END MspInit 1 */ } +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* RTC interrupt Init */ + HAL_NVIC_SetPriority(RTC_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(RTC_IRQn); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + + /* RTC interrupt DeInit */ + HAL_NVIC_DisableIRQ(RTC_IRQn); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + /** * @brief SPI MSP Initialization * This function configures the hardware resources used in this example diff --git a/src/stm32l0xx_it.c b/src/stm32l0xx_it.c index adabda6..5c27acc 100644 --- a/src/stm32l0xx_it.c +++ b/src/stm32l0xx_it.c @@ -55,6 +55,7 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ +extern RTC_HandleTypeDef hrtc; extern TIM_HandleTypeDef htim2; /* USER CODE BEGIN EV */ @@ -140,6 +141,20 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32l0xx.s). */ /******************************************************************************/ +/** + * @brief This function handles RTC global interrupt through EXTI lines 17, 19 and 20 and LSE CSS interrupt through EXTI line 19. + */ +void RTC_IRQHandler(void) +{ + /* USER CODE BEGIN RTC_IRQn 0 */ + + /* USER CODE END RTC_IRQn 0 */ + HAL_RTC_AlarmIRQHandler(&hrtc); + /* USER CODE BEGIN RTC_IRQn 1 */ + + /* USER CODE END RTC_IRQn 1 */ +} + /** * @brief This function handles EXTI line 4 to 15 interrupts. */