14 #include "stm32f4xx_hal.h" 20 RTC_HandleTypeDef hrtc;
26 RTC_TimeTypeDef sTime;
27 RTC_DateTypeDef sDate;
28 RTC_AlarmTypeDef sAlarm;
30 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
32 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
33 PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
34 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
39 hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
40 hrtc.Init.AsynchPrediv = 127;
41 hrtc.Init.SynchPrediv = 255;
42 hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
43 hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
44 hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
52 sTime.TimeFormat = RTC_HOURFORMAT12_AM;
53 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
54 sTime.StoreOperation = RTC_STOREOPERATION_RESET;
55 HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD);
57 sDate.WeekDay = RTC_WEEKDAY_MONDAY;
58 sDate.Month = RTC_MONTH_JANUARY;
61 HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD);
65 sAlarm.AlarmTime.Hours = 0;
66 sAlarm.AlarmTime.Minutes = 0;
67 sAlarm.AlarmTime.Seconds = 0;
68 sAlarm.AlarmTime.SubSeconds = 0;
69 sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM;
70 sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
71 sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
72 sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
73 sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
74 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
75 sAlarm.AlarmDateWeekDay = 1;
76 sAlarm.Alarm = RTC_ALARM_A;
77 HAL_RTC_SetAlarm(&hrtc, &sAlarm, FORMAT_BCD);
81 sAlarm.Alarm = RTC_ALARM_B;
82 HAL_RTC_SetAlarm(&hrtc, &sAlarm, FORMAT_BCD);
86 HAL_RTCEx_SetWakeUpTimer(&hrtc, 0, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
90 void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
92 #ifdef GSC_TARGET_SYSTEM_32F469IDISCOVERY 93 RCC_OscInitTypeDef Osc;
96 Osc.OscillatorType = RCC_OSCILLATORTYPE_LSE;
97 Osc.LSEState = RCC_LSE_ON;
98 Osc.HSIState = RCC_HSI_OFF;
99 Osc.HSICalibrationValue = 0;
100 Osc.LSIState = RCC_LSI_OFF;
101 Osc.PLL.PLLState = RCC_PLL_NONE;
102 HAL_RCC_OscConfig(&Osc);
104 __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSE);
105 __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
108 if(hrtc->Instance==RTC) {
109 __HAL_RCC_RTC_ENABLE();
113 void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
120 void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
127 static int rtc_register(
struct st_device *dev,
char *param)
135 static int rtc_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
142 RTC_DateTypeDef sDate;
143 RTC_TimeTypeDef sTime;
145 sDate.Year = tp->
year - 2000;
146 sDate.Month = tp->
month;
147 sDate.Date = tp->
day;
150 sTime.TimeFormat = RTC_HOURFORMAT12_AM;
151 sTime.Hours = tp->
hour;
152 sTime.Minutes = tp->
min;
153 sTime.Seconds = tp->
sec;
154 sTime.SubSeconds = 256 - ((tp->
msec * 256) / 1000);
155 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
156 sTime.StoreOperation = RTC_STOREOPERATION_RESET;
158 HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BIN);
159 HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BIN);
167 RTC_TimeTypeDef gTime;
168 RTC_DateTypeDef gDate;
170 HAL_RTC_GetTime(&hrtc, &gTime, FORMAT_BIN);
171 HAL_RTC_GetDate(&hrtc, &gDate, FORMAT_BIN);
173 DKPRINTF(0x01,
"%04d-%02d-%02d ",
174 2000 + gDate.Year, gDate.Month, gDate.Date);
175 DKPRINTF(0x01,
"%02d:%02d:%02d\n",
176 gTime.Hours, gTime.Minutes, gTime.Seconds);
178 tp->
year = gDate.Year + 2000;
179 tp->
month = gDate.Month;
180 tp->
day = gDate.Date;
183 if(gTime.TimeFormat == RTC_HOURFORMAT12_AM) {
184 tp->
hour = gTime.Hours;
186 tp->
hour = gTime.Hours + 12;
188 tp->
min = gTime.Minutes;
189 tp->
sec = gTime.Seconds;
190 tp->
msec = ((256 - gTime.SubSeconds) * 1000) / 256;
197 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
206 .explan =
"STM32F4 RTC",
207 .register_dev = rtc_register,
#define IOCMD_RTC_GET
時刻を取得する
#define IOCMD_RTC_SET
時刻を設定する
char dayofweek
曜日 0:日曜日〜6:土曜日
#define DEF_DEV_NAME_RTC
標準リアルタイムクロックデバイス名
char name[MAX_DEVNAMELRN]
デバイス名文字列