Forum: Mikrocontroller und Digitale Elektronik STM32 Counter Wert mit DMA auslesen, Wert immer 0


von STM (Gast)


Lesenswert?

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);

von STM (Gast)


Lesenswert?

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;

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.