Library used during 1 day workshops presented by Skool and ARM Hungary in 2015.
Fork of Skool_wkshp_lib2015 by
rtc.cpp@1:68d1a8c4970b, 2015-10-01 (annotated)
- Committer:
- lvagasi
- Date:
- Thu Oct 01 19:17:25 2015 +0000
- Revision:
- 1:68d1a8c4970b
- Parent:
- 0:3ad0af8abf43
Almost complete version. Functionally working. Sometimes some keys are repeated. There is no value check.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lvagasi | 0:3ad0af8abf43 | 1 | #include "rtc.h" |
lvagasi | 0:3ad0af8abf43 | 2 | #include "menu.h" |
lvagasi | 0:3ad0af8abf43 | 3 | #include "serial_lcd.h" |
lvagasi | 0:3ad0af8abf43 | 4 | #include "keypad.h" |
lvagasi | 0:3ad0af8abf43 | 5 | |
lvagasi | 0:3ad0af8abf43 | 6 | HAL_StatusTypeDef HAL_status; |
lvagasi | 0:3ad0af8abf43 | 7 | HAL_LockTypeDef HAL_lock; |
lvagasi | 0:3ad0af8abf43 | 8 | RTC_HandleTypeDef rtch; |
lvagasi | 0:3ad0af8abf43 | 9 | HAL_RTCStateTypeDef rtc_state; |
lvagasi | 0:3ad0af8abf43 | 10 | RTC_InitTypeDef rtc_init; |
lvagasi | 0:3ad0af8abf43 | 11 | RTC_TimeTypeDef rtc_time; |
lvagasi | 0:3ad0af8abf43 | 12 | RTC_DateTypeDef rtc_date; |
lvagasi | 0:3ad0af8abf43 | 13 | RTC_AlarmTypeDef rtc_alarm; |
lvagasi | 0:3ad0af8abf43 | 14 | volatile int tmp_date, tmp_sec; |
lvagasi | 0:3ad0af8abf43 | 15 | volatile int AlarmA_Enabled = 0; |
lvagasi | 0:3ad0af8abf43 | 16 | volatile int AlarmA_triggered = 0; |
lvagasi | 0:3ad0af8abf43 | 17 | extern FSM_State Main_FSM_States; |
lvagasi | 0:3ad0af8abf43 | 18 | |
lvagasi | 0:3ad0af8abf43 | 19 | const char BCD2HEX[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; |
lvagasi | 1:68d1a8c4970b | 20 | const char DOW[8][3] = { {' ',' ',' '}, {'H',' ',' '}, {'K',' ',' '}, {'S','z','e'}, {'C','s',' '}, {'P',' ',' '}, {'S','z','o'}, {'V',' ',' '} }; |
lvagasi | 0:3ad0af8abf43 | 21 | const char Yes_No[16] = {'*',':','O','K',' ',' ',' ',' ',' ','#',':','M',0x82,'g','s','e'};//"*:OK #:Mégse"}; |
lvagasi | 0:3ad0af8abf43 | 22 | |
lvagasi | 0:3ad0af8abf43 | 23 | void RTC_AlarmAEventCallback(void) { |
lvagasi | 0:3ad0af8abf43 | 24 | AlarmA_triggered = 1; |
lvagasi | 0:3ad0af8abf43 | 25 | } |
lvagasi | 0:3ad0af8abf43 | 26 | |
lvagasi | 0:3ad0af8abf43 | 27 | void RTC_AlarmIRQHandler(void) { |
lvagasi | 0:3ad0af8abf43 | 28 | if(RTC->ISR & RTC_ISR_ALRAF) { |
lvagasi | 0:3ad0af8abf43 | 29 | /* Get the status of the Interrupt */ |
lvagasi | 0:3ad0af8abf43 | 30 | if ((RTC->CR & RTC_IT_ALRA) != 0) { |
lvagasi | 0:3ad0af8abf43 | 31 | /* AlarmA callback */ |
lvagasi | 0:3ad0af8abf43 | 32 | RTC_AlarmAEventCallback(); |
lvagasi | 0:3ad0af8abf43 | 33 | |
lvagasi | 0:3ad0af8abf43 | 34 | /* Clear the Alarm interrupt pending bit */ |
lvagasi | 0:3ad0af8abf43 | 35 | RTC->ISR &= ~(RTC_FLAG_ALRAF); |
lvagasi | 0:3ad0af8abf43 | 36 | } |
lvagasi | 0:3ad0af8abf43 | 37 | } |
lvagasi | 0:3ad0af8abf43 | 38 | |
lvagasi | 0:3ad0af8abf43 | 39 | /* Clear the EXTI's line Flag for RTC Alarm */ |
lvagasi | 0:3ad0af8abf43 | 40 | EXTI->PR = RTC_EXTI_LINE_ALARM_EVENT; |
lvagasi | 0:3ad0af8abf43 | 41 | __HAL_RTC_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT); |
lvagasi | 0:3ad0af8abf43 | 42 | |
lvagasi | 0:3ad0af8abf43 | 43 | /* Change RTC state */ |
lvagasi | 0:3ad0af8abf43 | 44 | rtch.State = HAL_RTC_STATE_READY; |
lvagasi | 0:3ad0af8abf43 | 45 | } |
lvagasi | 0:3ad0af8abf43 | 46 | |
lvagasi | 0:3ad0af8abf43 | 47 | void ShowAlarm(void) { |
lvagasi | 0:3ad0af8abf43 | 48 | char tt[16]; |
lvagasi | 0:3ad0af8abf43 | 49 | |
lvagasi | 0:3ad0af8abf43 | 50 | write_ser_lcd(0x01, false); // Clear display |
lvagasi | 0:3ad0af8abf43 | 51 | wait_us(1100); |
lvagasi | 0:3ad0af8abf43 | 52 | write_ser_lcd(0x06, false); // Entry mode set |
lvagasi | 0:3ad0af8abf43 | 53 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 54 | write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 55 | tt[0] = BCD2HEX[((rtc_alarm.AlarmTime.Hours & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 56 | tt[1] = BCD2HEX[(rtc_alarm.AlarmTime.Hours & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 57 | tt[2] = ':'; |
lvagasi | 0:3ad0af8abf43 | 58 | tt[3] = BCD2HEX[((rtc_alarm.AlarmTime.Minutes & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 59 | tt[4] = BCD2HEX[(rtc_alarm.AlarmTime.Minutes & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 60 | tt[5] = ':'; |
lvagasi | 0:3ad0af8abf43 | 61 | tt[6] = BCD2HEX[((rtc_alarm.AlarmTime.Seconds & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 62 | tt[7] = BCD2HEX[(rtc_alarm.AlarmTime.Seconds & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 63 | tt[8] = ' '; |
lvagasi | 1:68d1a8c4970b | 64 | tt[9] = DOW[rtc_alarm.AlarmDateWeekDay][0]; |
lvagasi | 1:68d1a8c4970b | 65 | tt[10] = DOW[rtc_alarm.AlarmDateWeekDay][1]; |
lvagasi | 1:68d1a8c4970b | 66 | tt[11] = DOW[rtc_alarm.AlarmDateWeekDay][2]; |
lvagasi | 0:3ad0af8abf43 | 67 | write_ser_text(tt, 12); |
lvagasi | 0:3ad0af8abf43 | 68 | write_ser_lcd(0xC0, false); |
lvagasi | 0:3ad0af8abf43 | 69 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 70 | write_ser_text(Yes_No, 16); |
lvagasi | 0:3ad0af8abf43 | 71 | } |
lvagasi | 0:3ad0af8abf43 | 72 | |
lvagasi | 0:3ad0af8abf43 | 73 | void ShowTime(void) { |
lvagasi | 0:3ad0af8abf43 | 74 | char tt[16]; |
lvagasi | 0:3ad0af8abf43 | 75 | |
lvagasi | 0:3ad0af8abf43 | 76 | write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 77 | tt[0] = BCD2HEX[((rtc_time.Hours & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 78 | tt[1] = BCD2HEX[(rtc_time.Hours & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 79 | tt[2] = ':'; |
lvagasi | 0:3ad0af8abf43 | 80 | tt[3] = BCD2HEX[((rtc_time.Minutes & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 81 | tt[4] = BCD2HEX[(rtc_time.Minutes & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 82 | tt[5] = ':'; |
lvagasi | 0:3ad0af8abf43 | 83 | tt[6] = BCD2HEX[((rtc_time.Seconds & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 84 | tt[7] = BCD2HEX[(rtc_time.Seconds & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 85 | tmp_sec = rtc_time.Seconds; |
lvagasi | 0:3ad0af8abf43 | 86 | tt[8] = ' '; |
lvagasi | 0:3ad0af8abf43 | 87 | if (AlarmA_Enabled) { |
lvagasi | 0:3ad0af8abf43 | 88 | tt[9] = 0x01; |
lvagasi | 0:3ad0af8abf43 | 89 | } else { |
lvagasi | 0:3ad0af8abf43 | 90 | tt[9] = ' '; |
lvagasi | 0:3ad0af8abf43 | 91 | } |
lvagasi | 0:3ad0af8abf43 | 92 | write_ser_text(tt, 10); |
lvagasi | 0:3ad0af8abf43 | 93 | } |
lvagasi | 0:3ad0af8abf43 | 94 | |
lvagasi | 0:3ad0af8abf43 | 95 | void ShowDate(void) { |
lvagasi | 0:3ad0af8abf43 | 96 | char tt[16]; |
lvagasi | 0:3ad0af8abf43 | 97 | |
lvagasi | 0:3ad0af8abf43 | 98 | write_ser_lcd(0xC0, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 99 | tt[0] = BCD2HEX[2]; |
lvagasi | 0:3ad0af8abf43 | 100 | tt[1] = BCD2HEX[0]; |
lvagasi | 0:3ad0af8abf43 | 101 | tt[2] = BCD2HEX[((rtc_date.Year & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 102 | tt[3] = BCD2HEX[(rtc_date.Year & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 103 | tt[4] = '.'; |
lvagasi | 0:3ad0af8abf43 | 104 | tt[5] = BCD2HEX[((rtc_date.Month & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 105 | tt[6] = BCD2HEX[(rtc_date.Month & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 106 | tt[7] = '.'; |
lvagasi | 0:3ad0af8abf43 | 107 | tt[8] = BCD2HEX[((rtc_date.Date & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 108 | tt[9] = BCD2HEX[(rtc_date.Date & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 109 | tt[10] = '.'; |
lvagasi | 0:3ad0af8abf43 | 110 | tmp_date = rtc_date.Date; |
lvagasi | 0:3ad0af8abf43 | 111 | tt[11] = ' '; |
lvagasi | 1:68d1a8c4970b | 112 | tt[12] = DOW[rtc_date.WeekDay][0]; |
lvagasi | 1:68d1a8c4970b | 113 | tt[13] = DOW[rtc_date.WeekDay][1]; |
lvagasi | 1:68d1a8c4970b | 114 | tt[14] = DOW[rtc_date.WeekDay][2]; |
lvagasi | 0:3ad0af8abf43 | 115 | write_ser_text(tt,15); |
lvagasi | 0:3ad0af8abf43 | 116 | } |
lvagasi | 0:3ad0af8abf43 | 117 | |
lvagasi | 0:3ad0af8abf43 | 118 | void ShowTimeforSet(char * tt) { |
lvagasi | 0:3ad0af8abf43 | 119 | write_ser_lcd(0x01, false); // Clear display |
lvagasi | 0:3ad0af8abf43 | 120 | wait_us(1100); |
lvagasi | 0:3ad0af8abf43 | 121 | write_ser_lcd(0x06, false); // Entry mode set |
lvagasi | 0:3ad0af8abf43 | 122 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 123 | write_ser_lcd(0x0E, false); // Display ON, Cursor ON, Blink OFF |
lvagasi | 0:3ad0af8abf43 | 124 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 125 | write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 126 | tt[0] = BCD2HEX[((rtc_time.Hours & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 127 | tt[1] = BCD2HEX[(rtc_time.Hours & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 128 | tt[2] = ':'; |
lvagasi | 0:3ad0af8abf43 | 129 | tt[3] = BCD2HEX[((rtc_time.Minutes & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 130 | tt[4] = BCD2HEX[(rtc_time.Minutes & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 131 | tt[5] = ':'; |
lvagasi | 0:3ad0af8abf43 | 132 | tt[6] = BCD2HEX[((rtc_time.Seconds & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 133 | tt[7] = BCD2HEX[(rtc_time.Seconds & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 134 | write_ser_text(tt, 8); |
lvagasi | 0:3ad0af8abf43 | 135 | write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 136 | } |
lvagasi | 0:3ad0af8abf43 | 137 | |
lvagasi | 0:3ad0af8abf43 | 138 | void ShowAlarmforSet(char * tt) { |
lvagasi | 0:3ad0af8abf43 | 139 | write_ser_lcd(0x01, false); // Clear display |
lvagasi | 0:3ad0af8abf43 | 140 | wait_us(1100); |
lvagasi | 0:3ad0af8abf43 | 141 | write_ser_lcd(0x06, false); // Entry mode set |
lvagasi | 0:3ad0af8abf43 | 142 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 143 | write_ser_lcd(0x0E, false); // Display ON, Cursor ON, Blink OFF |
lvagasi | 0:3ad0af8abf43 | 144 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 145 | write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 146 | tt[0] = BCD2HEX[((rtc_alarm.AlarmTime.Hours & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 147 | tt[1] = BCD2HEX[(rtc_alarm.AlarmTime.Hours & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 148 | tt[2] = ':'; |
lvagasi | 0:3ad0af8abf43 | 149 | tt[3] = BCD2HEX[((rtc_alarm.AlarmTime.Minutes & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 150 | tt[4] = BCD2HEX[(rtc_alarm.AlarmTime.Minutes & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 151 | tt[5] = ':'; |
lvagasi | 0:3ad0af8abf43 | 152 | tt[6] = BCD2HEX[((rtc_alarm.AlarmTime.Seconds & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 153 | tt[7] = BCD2HEX[(rtc_alarm.AlarmTime.Seconds & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 154 | tt[8] = ' '; |
lvagasi | 1:68d1a8c4970b | 155 | tt[9] = DOW[rtc_date.WeekDay][0]; |
lvagasi | 1:68d1a8c4970b | 156 | tt[10] = DOW[rtc_date.WeekDay][1]; |
lvagasi | 1:68d1a8c4970b | 157 | tt[11] = DOW[rtc_date.WeekDay][2]; |
lvagasi | 0:3ad0af8abf43 | 158 | write_ser_text(tt, 8); |
lvagasi | 0:3ad0af8abf43 | 159 | write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 160 | } |
lvagasi | 0:3ad0af8abf43 | 161 | |
lvagasi | 0:3ad0af8abf43 | 162 | void ShowDateforSet(char * tt) { |
lvagasi | 0:3ad0af8abf43 | 163 | write_ser_lcd(0x01, false); // Clear display |
lvagasi | 0:3ad0af8abf43 | 164 | wait_us(1100); |
lvagasi | 0:3ad0af8abf43 | 165 | write_ser_lcd(0x06, false); // Entry mode set |
lvagasi | 0:3ad0af8abf43 | 166 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 167 | write_ser_lcd(0x0E, false); // Display ON, Cursor ON, Blink OFF |
lvagasi | 0:3ad0af8abf43 | 168 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 169 | write_ser_lcd(0x80, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 170 | tt[0] = BCD2HEX[2]; |
lvagasi | 0:3ad0af8abf43 | 171 | tt[1] = BCD2HEX[0]; |
lvagasi | 0:3ad0af8abf43 | 172 | tt[2] = BCD2HEX[((rtc_date.Year & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 173 | tt[3] = BCD2HEX[(rtc_date.Year & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 174 | tt[4] = '.'; |
lvagasi | 0:3ad0af8abf43 | 175 | tt[5] = BCD2HEX[((rtc_date.Month & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 176 | tt[6] = BCD2HEX[(rtc_date.Month & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 177 | tt[7] = '.'; |
lvagasi | 0:3ad0af8abf43 | 178 | tt[8] = BCD2HEX[((rtc_date.Date & 0xF0) >> 4)]; |
lvagasi | 0:3ad0af8abf43 | 179 | tt[9] = BCD2HEX[(rtc_date.Date & 0x0F)]; |
lvagasi | 0:3ad0af8abf43 | 180 | tt[10] = '.'; |
lvagasi | 0:3ad0af8abf43 | 181 | tt[11] = ' '; |
lvagasi | 1:68d1a8c4970b | 182 | tt[12] = DOW[rtc_date.WeekDay][0]; |
lvagasi | 1:68d1a8c4970b | 183 | tt[13] = DOW[rtc_date.WeekDay][1]; |
lvagasi | 1:68d1a8c4970b | 184 | tt[14] = DOW[rtc_date.WeekDay][2]; |
lvagasi | 0:3ad0af8abf43 | 185 | write_ser_text(tt,15); |
lvagasi | 0:3ad0af8abf43 | 186 | write_ser_lcd(0x82, false); // set DDRAM addr to 0x00, beginning of 1st line |
lvagasi | 0:3ad0af8abf43 | 187 | } |
lvagasi | 0:3ad0af8abf43 | 188 | |
lvagasi | 0:3ad0af8abf43 | 189 | void InitRTC(void) { |
lvagasi | 0:3ad0af8abf43 | 190 | uint32_t dummy; |
lvagasi | 0:3ad0af8abf43 | 191 | |
lvagasi | 0:3ad0af8abf43 | 192 | rtc_init.AsynchPrediv = 0x7F; |
lvagasi | 0:3ad0af8abf43 | 193 | rtc_init.SynchPrediv = 0xFF; |
lvagasi | 0:3ad0af8abf43 | 194 | rtc_init.HourFormat = RTC_HOURFORMAT_24; |
lvagasi | 0:3ad0af8abf43 | 195 | rtc_init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; |
lvagasi | 0:3ad0af8abf43 | 196 | rtc_init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; |
lvagasi | 0:3ad0af8abf43 | 197 | rtc_init.OutPut = RTC_OUTPUT_DISABLE; |
lvagasi | 0:3ad0af8abf43 | 198 | |
lvagasi | 0:3ad0af8abf43 | 199 | rtc_date.Date = 27; |
lvagasi | 0:3ad0af8abf43 | 200 | rtc_date.Month = 05; |
lvagasi | 0:3ad0af8abf43 | 201 | rtc_date.WeekDay = 2; |
lvagasi | 0:3ad0af8abf43 | 202 | rtc_date.Year = 14; |
lvagasi | 0:3ad0af8abf43 | 203 | tmp_date = 27; |
lvagasi | 0:3ad0af8abf43 | 204 | |
lvagasi | 0:3ad0af8abf43 | 205 | rtc_time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; |
lvagasi | 0:3ad0af8abf43 | 206 | rtc_time.Hours = 00; |
lvagasi | 0:3ad0af8abf43 | 207 | rtc_time.Minutes = 25; |
lvagasi | 0:3ad0af8abf43 | 208 | rtc_time.Seconds = 00; |
lvagasi | 0:3ad0af8abf43 | 209 | rtc_time.StoreOperation =RTC_STOREOPERATION_SET; |
lvagasi | 0:3ad0af8abf43 | 210 | tmp_sec = 0; |
lvagasi | 0:3ad0af8abf43 | 211 | |
lvagasi | 0:3ad0af8abf43 | 212 | rtch.Instance = RTC; |
lvagasi | 0:3ad0af8abf43 | 213 | rtch.Init = rtc_init; |
lvagasi | 0:3ad0af8abf43 | 214 | rtch.Lock = HAL_lock; |
lvagasi | 0:3ad0af8abf43 | 215 | rtch.State = rtc_state; |
lvagasi | 0:3ad0af8abf43 | 216 | |
lvagasi | 0:3ad0af8abf43 | 217 | __PWR_CLK_ENABLE(); |
lvagasi | 0:3ad0af8abf43 | 218 | HAL_PWR_EnableBkUpAccess(); |
lvagasi | 0:3ad0af8abf43 | 219 | __HAL_RCC_LSE_CONFIG(RCC_LSE_ON); |
lvagasi | 0:3ad0af8abf43 | 220 | __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); |
lvagasi | 0:3ad0af8abf43 | 221 | dummy = RCC->BDCR; |
lvagasi | 0:3ad0af8abf43 | 222 | dummy |= RCC_BDCR_RTCEN; |
lvagasi | 0:3ad0af8abf43 | 223 | RCC->BDCR = dummy; |
lvagasi | 0:3ad0af8abf43 | 224 | // __HAL_RCC_RTC_ENABLE(); |
lvagasi | 0:3ad0af8abf43 | 225 | EXTI->PR = RTC_EXTI_LINE_ALARM_EVENT; |
lvagasi | 0:3ad0af8abf43 | 226 | RTC->ISR &= ~(RTC_FLAG_ALRAF); |
lvagasi | 0:3ad0af8abf43 | 227 | HAL_RTC_Init(&rtch); |
lvagasi | 0:3ad0af8abf43 | 228 | dummy = (RTC->BKP15R & 0x00000007); |
lvagasi | 0:3ad0af8abf43 | 229 | AlarmA_Enabled = ((dummy & 0x00000004) == 1); |
lvagasi | 0:3ad0af8abf43 | 230 | if (dummy == 0x0) { |
lvagasi | 0:3ad0af8abf43 | 231 | HAL_RTC_SetDate(&rtch, &rtc_date, FORMAT_BIN); |
lvagasi | 0:3ad0af8abf43 | 232 | HAL_RTC_SetTime(&rtch, &rtc_time, FORMAT_BIN); |
lvagasi | 0:3ad0af8abf43 | 233 | } |
lvagasi | 0:3ad0af8abf43 | 234 | } |
lvagasi | 0:3ad0af8abf43 | 235 | |
lvagasi | 0:3ad0af8abf43 | 236 | void AlarmA_Enable(void) { |
lvagasi | 0:3ad0af8abf43 | 237 | int keypress; |
lvagasi | 0:3ad0af8abf43 | 238 | |
lvagasi | 0:3ad0af8abf43 | 239 | HAL_RTC_GetAlarm(&rtch, &rtc_alarm, RTC_ALARM_A, FORMAT_BCD); |
lvagasi | 1:68d1a8c4970b | 240 | //if (rtc_alarm.AlarmDateWeekDay == 0) { rtc_alarm.AlarmDateWeekDay = 1;} // There was no alarm set yet |
lvagasi | 0:3ad0af8abf43 | 241 | ShowAlarm(); |
lvagasi | 0:3ad0af8abf43 | 242 | keypress = Poll_keypad_yesno(); |
lvagasi | 0:3ad0af8abf43 | 243 | if (keypress == 0x0C) { |
lvagasi | 0:3ad0af8abf43 | 244 | HAL_RTC_DeactivateAlarm(&rtch, RTC_ALARM_A); |
lvagasi | 0:3ad0af8abf43 | 245 | HAL_RTC_SetAlarm_IT(&rtch, &rtc_alarm, FORMAT_BCD); |
lvagasi | 0:3ad0af8abf43 | 246 | NVIC_SetVector(RTC_Alarm_IRQn, (uint32_t)RTC_AlarmIRQHandler); |
lvagasi | 0:3ad0af8abf43 | 247 | HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); |
lvagasi | 0:3ad0af8abf43 | 248 | AlarmA_Enabled = 1; |
lvagasi | 0:3ad0af8abf43 | 249 | RTC->BKP15R |= 0x00000004; |
lvagasi | 0:3ad0af8abf43 | 250 | } |
lvagasi | 0:3ad0af8abf43 | 251 | Main_FSM_States = FINISH; |
lvagasi | 0:3ad0af8abf43 | 252 | } |
lvagasi | 0:3ad0af8abf43 | 253 | |
lvagasi | 0:3ad0af8abf43 | 254 | void AlarmA_Disable(void) { |
lvagasi | 0:3ad0af8abf43 | 255 | HAL_RTC_DeactivateAlarm(&rtch, RTC_ALARM_A); |
lvagasi | 0:3ad0af8abf43 | 256 | AlarmA_Enabled = 0; |
lvagasi | 0:3ad0af8abf43 | 257 | RTC->BKP15R &= ~(0x00000004); |
lvagasi | 0:3ad0af8abf43 | 258 | Main_FSM_States = FINISH; |
lvagasi | 0:3ad0af8abf43 | 259 | } |
lvagasi | 0:3ad0af8abf43 | 260 | |
lvagasi | 0:3ad0af8abf43 | 261 | void SetRTCTime(void) { |
lvagasi | 0:3ad0af8abf43 | 262 | int keypress; |
lvagasi | 0:3ad0af8abf43 | 263 | char TT[8]; |
lvagasi | 0:3ad0af8abf43 | 264 | int index = 0; |
lvagasi | 0:3ad0af8abf43 | 265 | int exit = 0; |
lvagasi | 0:3ad0af8abf43 | 266 | |
lvagasi | 0:3ad0af8abf43 | 267 | HAL_RTC_GetTime(&rtch, &rtc_time, FORMAT_BCD); |
lvagasi | 0:3ad0af8abf43 | 268 | ShowTimeforSet(TT); |
lvagasi | 0:3ad0af8abf43 | 269 | |
lvagasi | 0:3ad0af8abf43 | 270 | while (exit == 0) { |
lvagasi | 0:3ad0af8abf43 | 271 | keypress = Poll_keypad_full(); |
lvagasi | 0:3ad0af8abf43 | 272 | switch (keypress) { |
lvagasi | 0:3ad0af8abf43 | 273 | case '*': |
lvagasi | 0:3ad0af8abf43 | 274 | if (index > 0) {index--;} |
lvagasi | 0:3ad0af8abf43 | 275 | if ((index == 2) | (index == 5)) {index--;} |
lvagasi | 0:3ad0af8abf43 | 276 | break; |
lvagasi | 0:3ad0af8abf43 | 277 | case '#': |
lvagasi | 0:3ad0af8abf43 | 278 | if (index < 8) {index++;} |
lvagasi | 0:3ad0af8abf43 | 279 | if ((index == 2) | (index == 5)) {index++;} |
lvagasi | 0:3ad0af8abf43 | 280 | if (index == 8) {exit = 1;} |
lvagasi | 0:3ad0af8abf43 | 281 | break; |
lvagasi | 0:3ad0af8abf43 | 282 | default: |
lvagasi | 0:3ad0af8abf43 | 283 | TT[index] = keypress; |
lvagasi | 0:3ad0af8abf43 | 284 | if (index < 8) {index++;} |
lvagasi | 0:3ad0af8abf43 | 285 | if ((index == 2) | (index == 5)) {index++;} |
lvagasi | 0:3ad0af8abf43 | 286 | if (index == 8) {exit = 1;} |
lvagasi | 0:3ad0af8abf43 | 287 | break; |
lvagasi | 0:3ad0af8abf43 | 288 | } |
lvagasi | 0:3ad0af8abf43 | 289 | write_ser_lcd(0x80, false); |
lvagasi | 0:3ad0af8abf43 | 290 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 291 | write_ser_text(TT,8); |
lvagasi | 0:3ad0af8abf43 | 292 | write_ser_lcd(0x80 + index, false); |
lvagasi | 0:3ad0af8abf43 | 293 | } |
lvagasi | 0:3ad0af8abf43 | 294 | rtc_time.Hours = ((TT[0] - 0x30) << 4) + (TT[1] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 295 | rtc_time.Minutes = ((TT[3] - 0x30) << 4) + (TT[4] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 296 | rtc_time.Seconds = ((TT[6] - 0x30) << 4) + (TT[7] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 297 | HAL_RTC_SetTime(&rtch, &rtc_time, FORMAT_BCD); |
lvagasi | 0:3ad0af8abf43 | 298 | RTC->BKP15R |= 0x00000001; |
lvagasi | 0:3ad0af8abf43 | 299 | Main_FSM_States = FINISH; |
lvagasi | 0:3ad0af8abf43 | 300 | } |
lvagasi | 0:3ad0af8abf43 | 301 | |
lvagasi | 0:3ad0af8abf43 | 302 | void SetRTCAlarm(void) { |
lvagasi | 0:3ad0af8abf43 | 303 | int keypress; |
lvagasi | 0:3ad0af8abf43 | 304 | char TT[12]; |
lvagasi | 0:3ad0af8abf43 | 305 | int index = 0; |
lvagasi | 0:3ad0af8abf43 | 306 | int exit = 0; |
lvagasi | 0:3ad0af8abf43 | 307 | int DoW; |
lvagasi | 0:3ad0af8abf43 | 308 | |
lvagasi | 0:3ad0af8abf43 | 309 | HAL_RTC_GetAlarm(&rtch, &rtc_alarm, RTC_ALARM_A, FORMAT_BCD); |
lvagasi | 0:3ad0af8abf43 | 310 | DoW = rtc_alarm.AlarmDateWeekDay; |
lvagasi | 0:3ad0af8abf43 | 311 | rtc_alarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; // We only used weekday alarm |
lvagasi | 0:3ad0af8abf43 | 312 | ShowAlarmforSet(TT); |
lvagasi | 0:3ad0af8abf43 | 313 | |
lvagasi | 0:3ad0af8abf43 | 314 | while (exit == 0) { |
lvagasi | 0:3ad0af8abf43 | 315 | keypress = Poll_keypad_full(); |
lvagasi | 0:3ad0af8abf43 | 316 | switch (keypress) { |
lvagasi | 0:3ad0af8abf43 | 317 | case '*': |
lvagasi | 0:3ad0af8abf43 | 318 | if (index > 0) {index--;} |
lvagasi | 0:3ad0af8abf43 | 319 | if ((index == 2) | (index == 5)) {index--;} |
lvagasi | 0:3ad0af8abf43 | 320 | if (index == 8) {index--;} |
lvagasi | 0:3ad0af8abf43 | 321 | break; |
lvagasi | 0:3ad0af8abf43 | 322 | case '#': |
lvagasi | 0:3ad0af8abf43 | 323 | if (index < 10) {index++;} |
lvagasi | 0:3ad0af8abf43 | 324 | if ((index == 2) | (index == 5)) {index++;} |
lvagasi | 0:3ad0af8abf43 | 325 | if (index == 8) {index++;} |
lvagasi | 0:3ad0af8abf43 | 326 | if (index == 10) {exit = 1;} |
lvagasi | 0:3ad0af8abf43 | 327 | break; |
lvagasi | 0:3ad0af8abf43 | 328 | default: |
lvagasi | 0:3ad0af8abf43 | 329 | if (index < 8) {TT[index] = keypress;} else { |
lvagasi | 0:3ad0af8abf43 | 330 | DoW = (keypress - 0x30); |
lvagasi | 0:3ad0af8abf43 | 331 | TT[9] = DOW[DoW][0]; |
lvagasi | 0:3ad0af8abf43 | 332 | TT[10] = DOW[DoW][1]; |
lvagasi | 0:3ad0af8abf43 | 333 | TT[11] = DOW[DoW][2]; |
lvagasi | 0:3ad0af8abf43 | 334 | } |
lvagasi | 0:3ad0af8abf43 | 335 | if (index < 10) {index++;} |
lvagasi | 0:3ad0af8abf43 | 336 | if ((index == 2) | (index == 5)) {index++;} |
lvagasi | 0:3ad0af8abf43 | 337 | if (index == 8) {index++;} |
lvagasi | 0:3ad0af8abf43 | 338 | if (index == 10) {exit = 1;} |
lvagasi | 0:3ad0af8abf43 | 339 | break; |
lvagasi | 0:3ad0af8abf43 | 340 | } |
lvagasi | 0:3ad0af8abf43 | 341 | write_ser_lcd(0x80, false); |
lvagasi | 0:3ad0af8abf43 | 342 | wait_us(30); |
lvagasi | 0:3ad0af8abf43 | 343 | write_ser_text(TT,12); |
lvagasi | 0:3ad0af8abf43 | 344 | write_ser_lcd(0x80 + index, false); |
lvagasi | 0:3ad0af8abf43 | 345 | } |
lvagasi | 0:3ad0af8abf43 | 346 | rtc_alarm.AlarmTime.Hours = ((TT[0] - 0x30) << 4) + (TT[1] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 347 | rtc_alarm.AlarmTime.Minutes = ((TT[3] - 0x30) << 4) + (TT[4] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 348 | rtc_alarm.AlarmTime.Seconds = ((TT[6] - 0x30) << 4) + (TT[7] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 349 | rtc_alarm.AlarmDateWeekDay = DoW; |
lvagasi | 1:68d1a8c4970b | 350 | if (DoW == 0x00) { |
lvagasi | 1:68d1a8c4970b | 351 | rtc_alarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; // Alarm is triggered every day, no date or weekday match |
lvagasi | 1:68d1a8c4970b | 352 | } else { |
lvagasi | 1:68d1a8c4970b | 353 | rtc_alarm.AlarmMask = RTC_ALARMMASK_NONE; // Alarm is triggered when everything match |
lvagasi | 1:68d1a8c4970b | 354 | } |
lvagasi | 0:3ad0af8abf43 | 355 | HAL_RTC_DeactivateAlarm(&rtch, RTC_ALARM_A); |
lvagasi | 0:3ad0af8abf43 | 356 | HAL_RTC_SetAlarm_IT(&rtch, &rtc_alarm, FORMAT_BCD); |
lvagasi | 0:3ad0af8abf43 | 357 | NVIC_SetVector(RTC_Alarm_IRQn, (uint32_t)RTC_AlarmIRQHandler); |
lvagasi | 0:3ad0af8abf43 | 358 | HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); |
lvagasi | 0:3ad0af8abf43 | 359 | RTC->BKP15R |= 0x00000006; |
lvagasi | 0:3ad0af8abf43 | 360 | AlarmA_Enabled = 1; |
lvagasi | 0:3ad0af8abf43 | 361 | Main_FSM_States = FINISH; |
lvagasi | 0:3ad0af8abf43 | 362 | } |
lvagasi | 0:3ad0af8abf43 | 363 | |
lvagasi | 0:3ad0af8abf43 | 364 | void SetRTCDate(void) { |
lvagasi | 0:3ad0af8abf43 | 365 | int keypress; |
lvagasi | 0:3ad0af8abf43 | 366 | char TT[15]; |
lvagasi | 0:3ad0af8abf43 | 367 | int index = 2; |
lvagasi | 0:3ad0af8abf43 | 368 | int exit = 0; |
lvagasi | 0:3ad0af8abf43 | 369 | int DoW; |
lvagasi | 0:3ad0af8abf43 | 370 | |
lvagasi | 0:3ad0af8abf43 | 371 | HAL_RTC_GetDate(&rtch, &rtc_date, FORMAT_BCD); |
lvagasi | 0:3ad0af8abf43 | 372 | DoW = rtc_date.WeekDay; |
lvagasi | 0:3ad0af8abf43 | 373 | ShowDateforSet(TT); |
lvagasi | 0:3ad0af8abf43 | 374 | |
lvagasi | 0:3ad0af8abf43 | 375 | while (exit == 0) { |
lvagasi | 0:3ad0af8abf43 | 376 | keypress = Poll_keypad_full(); |
lvagasi | 0:3ad0af8abf43 | 377 | switch (keypress) { |
lvagasi | 0:3ad0af8abf43 | 378 | case '*': |
lvagasi | 0:3ad0af8abf43 | 379 | if (index > 2) {index--;} |
lvagasi | 0:3ad0af8abf43 | 380 | if ((index == 4) | (index == 7)) {index--;} |
lvagasi | 0:3ad0af8abf43 | 381 | if (index == 11) {index -= 2;} |
lvagasi | 0:3ad0af8abf43 | 382 | break; |
lvagasi | 0:3ad0af8abf43 | 383 | case '#': |
lvagasi | 0:3ad0af8abf43 | 384 | if (index < 13) {index++;} |
lvagasi | 0:3ad0af8abf43 | 385 | if ((index == 4) | (index == 7)) {index++;} |
lvagasi | 0:3ad0af8abf43 | 386 | if (index == 10) {index += 2;} |
lvagasi | 0:3ad0af8abf43 | 387 | if (index == 13) {exit = 1;} |
lvagasi | 0:3ad0af8abf43 | 388 | break; |
lvagasi | 0:3ad0af8abf43 | 389 | default: |
lvagasi | 0:3ad0af8abf43 | 390 | if (index < 10) {TT[index] = keypress;} else { |
lvagasi | 0:3ad0af8abf43 | 391 | DoW = (keypress - 0x30); |
lvagasi | 0:3ad0af8abf43 | 392 | TT[12] = DOW[DoW][0]; |
lvagasi | 0:3ad0af8abf43 | 393 | TT[13] = DOW[DoW][1]; |
lvagasi | 0:3ad0af8abf43 | 394 | TT[14] = DOW[DoW][2]; |
lvagasi | 0:3ad0af8abf43 | 395 | } |
lvagasi | 0:3ad0af8abf43 | 396 | if (index < 13) {index++;} |
lvagasi | 0:3ad0af8abf43 | 397 | if ((index == 4) | (index == 7)) {index++;} |
lvagasi | 0:3ad0af8abf43 | 398 | if (index == 10) {index += 2;} |
lvagasi | 0:3ad0af8abf43 | 399 | if (index == 13) {exit = 1;} |
lvagasi | 0:3ad0af8abf43 | 400 | break; |
lvagasi | 0:3ad0af8abf43 | 401 | } |
lvagasi | 0:3ad0af8abf43 | 402 | write_ser_lcd(0x80, false); |
lvagasi | 0:3ad0af8abf43 | 403 | wait_us(30); |
lvagasi | 1:68d1a8c4970b | 404 | write_ser_text(TT,15); |
lvagasi | 0:3ad0af8abf43 | 405 | write_ser_lcd(0x80 + index, false); |
lvagasi | 0:3ad0af8abf43 | 406 | } |
lvagasi | 0:3ad0af8abf43 | 407 | rtc_date.Year = ((TT[2] - 0x30) << 4) + (TT[3] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 408 | rtc_date.Month = ((TT[5] - 0x30) << 4) + (TT[6] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 409 | rtc_date.Date = ((TT[8] - 0x30) << 4) + (TT[9] - 0x30); |
lvagasi | 0:3ad0af8abf43 | 410 | rtc_date.WeekDay = DoW; |
lvagasi | 0:3ad0af8abf43 | 411 | HAL_RTC_SetDate(&rtch, &rtc_date, FORMAT_BCD); |
lvagasi | 0:3ad0af8abf43 | 412 | RTC->BKP15R |= 0x00000001; |
lvagasi | 0:3ad0af8abf43 | 413 | Main_FSM_States = FINISH; |
lvagasi | 0:3ad0af8abf43 | 414 | } |