1 | // Uhrzeit Voreinstellen
|
2 | u32 tmp;
|
3 | zeit.stunde = 23;
|
4 | zeit.minute = 59;
|
5 | zeit.sekunde = 45;
|
6 |
|
7 | tmp = ((zeit.stunde * 3600)+ (zeit.minute * 60)+zeit.sekunde);
|
8 |
|
9 | RTC_WaitForLastTask();
|
10 | RTC_SetCounter(tmp );
|
11 | RTC_WaitForLastTask();
|
12 |
|
13 |
|
14 | void RTC_IRQHandler (void) {
|
15 | unsigned char temp_tage;
|
16 |
|
17 | if (RTC_GetITStatus(RTC_IT_SEC) != RESET) {
|
18 | // RTC neue Sekunde
|
19 | RTC_ClearITPendingBit(RTC_IT_SEC); // Sekunden-Interrupft-Flag löschen
|
20 | RTC_WaitForLastTask(); // auf RTC-Bereitschaft warten
|
21 |
|
22 | zeit.counter_temp = RTC_GetCounter(); // RTC Sekundenzähler
|
23 | RTC_WaitForLastTask();
|
24 |
|
25 | // Prüfung auf Datumswechsel (24:00:00)
|
26 | if (zeit.counter_temp == RTC_SEKUNDEN_TAG) {
|
27 | RTC_SetCounter(0x1); // RTC Sekundenzähler zurücksetzen
|
28 | RTC_WaitForLastTask();
|
29 | zeit.counter_temp = 0;
|
30 |
|
31 | // Wochentag aktualisieren
|
32 | if (zeit.wo_tag < 6) {
|
33 | // Wochentag erhöhen
|
34 | zeit.wo_tag++;
|
35 | } else {
|
36 | zeit.wo_tag = 0;
|
37 | }
|
38 |
|
39 | // Anzahl der Tage des Monats
|
40 | switch (zeit.monat) {
|
41 | case 2: // Monat Februar mit 28 Tagen ggf. mit Schaltjahr 29
|
42 | temp_tage = 28;
|
43 | // Schaltjahr Prüfung
|
44 | if (!(zeit.jahr % 4)) {
|
45 | // Schaltjahr (nur 4-Jahres-Zyklus Regel beachtet)
|
46 | // 400/100 Regel erst wieder im Jahr 2100 von Bedeutung!!!
|
47 | temp_tage = 29;
|
48 | }
|
49 | break;
|
50 | case 4: // Monate mit 30 Tagen
|
51 | case 6:
|
52 | case 9:
|
53 | case 11: // April, Juni, September, November
|
54 | temp_tage = 30;
|
55 | break;
|
56 | default: // Monate mit 31 Tagen (alle nicht mit case ausselektierten!)
|
57 | // Januar, März, Mai, Juli, August, Oktober, Dezember
|
58 | temp_tage = 31;
|
59 | }
|
60 |
|
61 | // Datum aktualisieren
|
62 | if (zeit.tag < temp_tage) {
|
63 | // Tag erhöhen
|
64 | zeit.tag++;
|
65 | } else {
|
66 | // neuer Monat
|
67 | zeit.tag = 1; // Tag = 1
|
68 | if (zeit.monat < 12) {
|
69 | // Monat erhöhen
|
70 | zeit.monat++;
|
71 | } else {
|
72 | // neues Jahr
|
73 | zeit.monat = 1;
|
74 | zeit.jahr++;
|
75 | }
|
76 | }
|
77 | }
|
78 |
|
79 | // Uhrzeit aktualisieren
|
80 | zeit.stunde = zeit.counter_temp / 3600;
|
81 | zeit.minute = (zeit.counter_temp % 3600) / 60;
|
82 | zeit.sekunde = (zeit.counter_temp % 3600) % 60;
|
83 |
|
84 | // Backupregister aktualisieren
|
85 | BKP_WriteBackupRegister(BKP_DR2, zeit.tag);
|
86 | BKP_WriteBackupRegister(BKP_DR3, zeit.monat);
|
87 | BKP_WriteBackupRegister(BKP_DR4, zeit.jahr);
|
88 | BKP_WriteBackupRegister(BKP_DR5, zeit.wo_tag);
|
89 | BKP_WriteBackupRegister(BKP_DR6, zeit.mesz);
|
90 |
|
91 | // Meldung an das Hauptprogramm, dass neue Zeit vorhanden ist.
|
92 | zeit.update = 1;
|
93 | }
|
94 | }
|
95 |
|
96 | // Systemzeit-Struktur
|
97 | struct zeit_struc {
|
98 | volatile uint32_t counter_temp; // RTC-Counter (Snap)
|
99 | volatile uint16_t jahr; // Jahr 4 stellen
|
100 | volatile uint8_t monat; // Monat 1-12
|
101 | volatile uint8_t tag; // Tag 1-31
|
102 | volatile uint8_t stunde; // 0-23
|
103 | volatile uint8_t minute; // 0-59
|
104 | volatile uint8_t sekunde; // 0-59
|
105 | volatile uint8_t wo_tag; // 0-6
|
106 | volatile uint8_t mesz; // Sommerzeit 1=MESZ(Sommerzeit) 0=MEZ(Winter)
|
107 | volatile uint8_t update; // 1=Neue Sekunde
|
108 | volatile uint8_t set; // 1=Uhrzeit stellen
|
109 | };
|
110 | struct zeit_struc zeit; // Systemzeit Variablen
|