STM32 Counter Wert mit DMA auslesen, Wert immer 0

Gast #2541703
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren