Hallo,
zur Zeit möchte ich über einen STM32F3 4 Kanäle eines ADCs zyklisch
auslesen. Dazu wird der ADC über den TIM3 über TRGO getriggert.
1
voidTIM3_Init()
2
{
3
//Timer zum Triggern des ADCs bei bestimmter Frequenz über TRGO
4
5
TIM3->PSC=0;//Prescaler
6
TIM3->ARR=72-1;//Auto Reload
7
TIM3->CNT=0;//Count
8
TIM3->CR1=1;//Control Reg
9
TIM3->CCR1=36;//Capture Compare
10
11
SET_BIT(TIM3->CR2,TIM_CR2_MMS_1);//TRGO
12
13
14
SET_BIT(TIM3->CR1,TIM_CR1_CEN);//Timer Enable
15
}
Der ADC soll die Kanäle 1 bis 4 nacheinander auslesen. Nach jeder
Messung soll der Wert mittels DMA in den Speicher abgelegt werden. Das
soll für alle 4 Werte gemacht werden. Erst wenn TIM3 wieder auslöst soll
der Zyklus erneut beginnen.
Alle Clock Signale werden woanders eingeschaltet.
Allerdings werden keine Werte ins ADC_raw[] abgelegt. Der Timer und ADC
arbeiten aber. Fallen euch Ungereimtheiten auf?
Bitte entschuldigt grobe Schnitzer, das ist mein erstes STM32 Projekt.
Vielen Dank!
Okay, ich bin vielleicht ein wenig doof.
Habe vergessen die DMA_Init() aufzurufen. Der Code funktioniert - ein
wenig.
So wie der Code da steht wird mir nach dem Startup jeweils einmal alle 4
Kanäle gelesen und per DMA ins RAM gelegt von wo aus ich die 4 Werte
auch auswerten kann. Allerdings soll dies ja dauerhaft im Hintergrund
geschehen mit der durch den TIM3 festgelegten Frequenz. Das passiert
allerdings nicht.
Kann sich jemand vorstellen warum?
Hallo xnager,
bei dem Stm32f4 hatte ich das gleiche Problem. Wenn man den DMA nicht im
Circular Mode betreibt, muss man den DMA nach jedem auslesen komplett
neu initialisieren. Der DMA muss im Circular Mode laufen. Dann musst du
mit dem Timer den ADC triggern, wodurch die Werte mittels DMA geladen
werden.