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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Marko R. (dr_marko_rocznik) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.