Hallo zusammen, wie schon in der Überschrift erwähnt versuche ich einen STM32F103C8T aus dem STOPMode mit Hilfe eines RTC-Alarms aufzuwecken. Im SleepMode klappt das auch schon. Nur im STOPMode wacht der STM32 nicht mehr auf. Nur ein Signal auf dem entsprechend konfiguriertem Pin PA0 schafft hier Abhilfe. Hier ein Auszug aus meiner main.c: __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE(); __HAL_RTC_ALARM_EXTI_ENABLE_IT(); HAL_GPIO_WritePin(LED_A_GPIO_Port, LED_A_Pin, SET); HAL_RTC_SetAlarm_IT(&hrtc, &alarm_a, RTC_FORMAT_BIN); HAL_SuspendTick(); HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI); // HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); HAL_ResumeTick(); SystemClock_Config(); HAL_GPIO_WritePin(LED_A_GPIO_Port, LED_A_Pin, RESET); Da ja laut STM Dokumentation die EXTI_Line17 speziell im STOPMode konfiguriert werden muss, habe ich die zwei oberen Zeilen verwendet, was jedoch kein Unterschied macht. Ich habe Zwar schon einige Beiträge zu dem Thema gefunden. Entweder wurde hier jedoch der SleepMode verwendet oder nicht die HAL Librarys genutzt. Ich hoffe jemand kennt sich besser mit dem Thema aus und kann mir helfen. Gruß Alex
Gast
#5781183
Ich benutze die die HAL nicht, sondern mache das "Native". Sieht bei mir ziemlich ähnlich aus. Bei mir habe ich aber noch folgenden Code für den RTC-Interrupt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Ob das nötig ist? Ich steck da nach einigen Jahren nicht mehr drin.
Erstmal danke für die Antwort. Meine Interruptcode setzt eigentlich auch das Flag zurück. Hier die entsprechende Stelle:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Wie sieht denn deine "Native" Konfiguration aus falls du die noch hast?
Gast
#5781793
Bitte sehr. Den folgenden Code habe zum Testen des Stop-Modes verwendet. Sicherheithalber habe ich nichts bereinigt und den Code einfach roh hier eingestellt (abgekippt). Also bitte nicht schlagen.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 | |
184 | |
185 | |
186 | |
Vielen Dank schonmal, Ich habe beide Programme jetzt miteinander verglichen und wie du schon geschrieben hast machen beide ungefähr das Gleiche. Das Problem lag in meinem Fall bei den Interrupt Handlern. Ich habe bei mir nur den RTC_IRQHandler benutzt, welcher auch automatisch von CubeMX generiert wird. Gefehlt hat der spezielle RTC_Alarm_IRQHandler. Dieser musste bei mir selbst geschrieben werden. Mich wundert jetzt nur, dass dieser auch bei dir fehlt oder ich übersehe auch nur wieder etwas. Mich würde nur noch interessieren, ob ich die Einstellung für den Alarm Interrupt in CubeMX nur nicht gefunden habe oder ob man diese immer manuell vornehmen muss. Falls jemand auch CubeMX benutzt kann er ja mal seine Ideen hier schreiben. Ich nutze die Version 5.0.1.
Gast
#5783100
Ich Trottel hab den Code aus meinem STM32F0-Ordner genommen. Der Code für den STM32F1 sieht anders aus. Dort verwende ich auch den RTCAlarm_IRQHandler. (Bzw. wenn unbenötigt nötig würde es aber auch ohne Interrupt per "Event" gehen.)
Gast
#5783164
Ist mir auch schon mal passiert. Leider spuckt der Compiler keine Fehlermeldung aus, wenn die C-Funktion des Interrupt Handlers den falschen Namen hat. Ich glaube, man müsste die ganzen Weak referenzen aus der startup_stm32.s entfernen. Kennt jemand eine elegantere Lösung, diesen Fehler zu vermeiden?
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.