Hallo zusammen,
angefangen hat die Problemstellung in einem anderen Thread (
Beitrag "Re: STM32: Suche Hilfe zu ADC" ), hat
sich aber inhaltlich schon ein Stück davon entfernt, so daß ein neuer
Thread sinnvoll erscheint.
Ich nutze auf einem STM32F103 den ADC1, um zyklisch 10 ADC-Kanäle
abzufragen und per DMA in ein Array zu schreiben. Nachdem alle Kanäle
digitalisiert sind, soll der Inhalt des Arrays mit ein paar kleinen
Berechnungen in einem struct gespeichert werden. Dazu nutze ich den
Interrupt-Handler vom DMA ( DMA1_Channel1_IRQHandler ).
Um das Ganze zu testen, werden in der Hauptschleife (zu finden in
edm_test_adc() ) die Inhalte des Arrays zyklisch auf einem Display
dargestellt und fernerhin die daraus berechneten Werte des structs
(gls_adc). Die Werte des Arrays sehen immer plausibel aus (und ändern
sich auch passend zu den testhalber angeschlossenen Potis). Die daraus
berechneten Inhalte des struct sind aber völlig inplausibel. Es sieht so
aus, als hätte das Array zum Zeitpunkt des Interrupts andere Werte als
beim Auslesen aus der Hauptschleife.
Um die Sache noch etwas verwirrender zu machen, kopiere ich die
gesampleten Werte in zwei globale Variablen (gl_a und gl_b). Werden die
Variable explizit initialisiert, also:
1 | volatile uint16_t gl_a = 0;
|
2 | volatile uint16_t gl_b = 0;
|
so sieht man in ihnen die gleichen merkwürdigen Werte, wie sie auch dem
Struct zugrundeliegen. Werden sie dageben implizit initialisiert, also:
1 | volatile uint16_t gl_a;
|
2 | volatile uint16_t gl_b;
|
stürzt die Interrupt-Routine ab, sollte darin hineingeschrieben werden.
Deswegen habe ich zwei Fragen:
1. Wie kann es sein, daß ein Array in einem IRQ-Handler anders
ausgelesen ist als sonst und
2. Wieso initialisiert der ARM-GCC globale Variablen nicht implizit mit
0?
Viele Grüße
W.T.
Edit: Die Variable uint16_t ADC1ConvertedValues[NCHANNEL+1] ist
natürlich volatile, ich kann nur Anhänge nicht mehr nachträglich
austauschen.