first time using RTC

This commit is contained in:
Dominik Kuhn 2023-12-14 18:40:43 +01:00
parent 70df292948
commit 051c659614
6 changed files with 214 additions and 14 deletions

View File

@ -36,6 +36,8 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
RTC_HandleTypeDef hrtc;
TIM_HandleTypeDef htim2;
SPI_HandleTypeDef hspi1;

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */
/**

View File

@ -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

View File

@ -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.
*/