Forum: Mikrocontroller und Digitale Elektronik HAL_ADC_Start_DMA läuft nach "complete" nicht weiter


von Marko R. (dr_marko_rocznik) Benutzerseite


Lesenswert?

Was disabled den DMA nachdem der HAL_ADC_ConvCpltCallback Interrupt kam?
Mein Verständnis ist, dass so lange mein Timer den ADC anstößt, dass 
dieser wenn der DMA auf "Circular" steht immer schön weiter über den DMA 
in den Speicher reinschreibt.
Die Schleife unten funktioniert aber nur 1x, anschließend kommen keine 
Interrupts mehr (weder halb noch voll).

Viele Grüße!
 Marko
1
HalfDone = 0;
2
FullDone = 0;
3
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)Buffer.ADCbuffer, ADCbufferSize);
4
HAL_TIM_Base_Start_IT(&htim15);
5
for (unsigned int i = 0; i<2; i++)
6
{
7
 while(!HalfDone);
8
 f_write(&File, Buffer.SDbuffer, ADCbufferSize, &bw);
9
 HalfDone = 0;
10
 while(!FullDone);
11
 f_write(&File, Buffer.SDbuffer + ADCbufferSize, ADCbufferSize, &bw);
12
 FullDone = 0;
13
}
14
15
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc1)
16
{
17
  HalfDone = 1;
18
}
19
20
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc1)
21
{
22
  FullDone = 1;
23
}

: Bearbeitet durch User
von Planloser (Gast)


Lesenswert?

Marko R. schrieb:

Eigentlich nicht schwer:
https://www.mikrocontroller.net/articles/Formatierung_im_Forum


> HalfDone = 0;
> FullDone = 0;
> HAL_ADC_Start_DMA(&hadc1, (uint32_t*)Buffer.ADCbuffer, ADCbufferSize);
> HAL_TIM_Base_Start_IT(&htim15);
> for (unsigned int i = 0; i<2; i++)
> {
>  while(!HalfDone);
>  f_write(&File, Buffer.SDbuffer, ADCbufferSize, &bw);
>  HalfDone = 0;
>  while(!FullDone);
>  f_write(&File, Buffer.SDbuffer + ADCbufferSize, ADCbufferSize, &bw);
>  FullDone = 0;
> }
>
> void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc1)
> {
>   HalfDone = 1;
> }
>
> void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc1)
> {
>   FullDone = 1;
> }

von Marko R. (dr_marko_rocznik) Benutzerseite


Lesenswert?

Ok, ich denke es liegt daran, dass es beim DMA nicht reicht "circular" 
anzuwenden. Man muss auch noch beim ADC unter Conversion Data Management 
Mode "DMA Circular Mode" auswählen.

von Kevin M. (arduinolover)


Lesenswert?

Marko R. schrieb:
> Ok, ich denke es liegt daran, dass es beim DMA nicht reicht "circular"
> anzuwenden. Man muss auch noch beim ADC unter Conversion Data Management
> Mode "DMA Circular Mode" auswählen.

Genau so ist es ;)

von Marko R. (dr_marko_rocznik) Benutzerseite


Lesenswert?

Weißt du auch was "Overrun behaviour" macht wenn ich "DMA Circular" 
gewählt habe? Da der DMA die Daten immer schön abholt und in den 
Speicher schreibt ist diese Option doch sinnfrei (wenn nicht 
ausgegraut)?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.