STM32 Counter Wert mit DMA auslesen, Wert immer 0

Gast #2541703
Hallo, ich wollte bei einem Interrupt von Timer2 den Counterwert von 
Timer 4 mittels DMA auslesen. Bis jetzt dachte ich sogar das das 
funktioniert, ein Blick in die Variablen hat mir allerdings gezeigt dass 
ich dort immer den Wert Null zu stehen habe. Timer 4 und 2 zählen wie 
gewollt, vielleicht habe ich etwas an der Adressvergabe versaut. Kann 
mir vielleicht jemand sagen ob in diesen Zeilen schon der Fehler liegt?
Danke.
1
#include "stm32f10x_dma.h"
2
#define TIM4_Value_Counter_Register 0x40000824
3

4

5

6
void DMA_Configuration(void)
7
{
8

9
extern volatile uint16_t n_T4_Count_Dma_pos;
10
extern volatile uint16_t n_T4_Count_Dma_neg;
11

12
DMA_InitTypeDef DMA_InitStructure;
13

14

15
  // DMA1 Channel1 Config  (Timer 2 Lowflanken)
16
  DMA_DeInit(DMA1_Channel1);
17

18
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM4_Value_Counter_Register;
19
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint16_t)n_T4_Count_Dma_pos;
20
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
21
  DMA_InitStructure.DMA_BufferSize = 1;
22
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
23
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
24
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
25
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
26
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;    //Kein Autoreload
27
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
28
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
29
      DMA_Init(DMA1_Channel5, &DMA_InitStructure);
30

31

32
  // DMA1 Channel7 Config  (Timer 2 Highflanken)
33
  DMA_DeInit(DMA1_Channel7);
34

35
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM4_Value_Counter_Register;
36
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint16_t)n_T4_Count_Dma_neg;
37
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
38
  DMA_InitStructure.DMA_BufferSize = 1;
39
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
40
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
41
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
42
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
43
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;    //Kein Autoreload
44
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
45
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
46
      DMA_Init(DMA1_Channel7, &DMA_InitStructure);
47

48
}

Nach jedem Aufruf setze ich den Buffer wieder neu mittels :

1
//DMA_Cmd(DMA1_Channel5, DISABLE);
2
//DMA_Cmd(DMA1_Channel7, DISABLE);
3
//DMA1_Channel5 -> CNDTR = 1;
4
//DMA1_Channel7 -> CNDTR = 1;
5
//DMA_Cmd(DMA1_Channel5, ENABLE);
6
//DMA_Cmd(DMA1_Channel7, ENABLE);
Gast #2541940
Hm ok alles klar, ich habe die Peripherie als Ziel und nicht als Quelle 
definiert.

 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralRSC;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.