stm32f030 ein Timer mehrere DMA

OP #4375134
Lesenswert?

Hallo Leute,

ich lasse auf meinem stm32f030 über DMA Timer gesteuert den PWM duty 
cycle verändern.
<nun würde ich dies gerne auf mehreren Kanälen gleichzeitig machen.
Ich bekomms aber nicht hin. Der Timer triggert immer nur einen DMA 
Channel. Ich versteh auch nicht, woher der Timer genau weis zu welchem 
DMA Channel er gehört.
Irgendwie ne Beschreibung der Standard Lib konnte ich leider auch 
nirgends finden...

Anbei mein Code:
1
  //Timer16 DMA
2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE);
3
  // Timer-Config
4
  TIM_TimeBaseStructInit(&TIM_TimeBase_InitStructure);
5
  TIM_TimeBase_InitStructure.TIM_Period = 56;    //100
6
  TIM_TimeBase_InitStructure.TIM_Prescaler = 6;    //48MHz/7 = 6MHz
7
  TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
8
  TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
9
  TIM_TimeBaseInit(TIM16, &TIM_TimeBase_InitStructure);
10

11
  // Timer enable
12
  TIM_Cmd(TIM16, ENABLE);
13

14

15
  //Clock Enable (DMA1)
16
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
17

18
  //DMA Channel3 = U
19
  //DMA Kanal löschen
20
  DMA_DeInit(DMA1_Channel3);
21

22
  DMA_InitStruct.DMA_BufferSize           = 400;
23
  DMA_InitStruct.DMA_DIR                 = DMA_DIR_PeripheralDST;
24
  DMA_InitStruct.DMA_M2M             = DMA_M2M_Disable;
25
  DMA_InitStruct.DMA_MemoryBaseAddr       = (uint32_t)&Usin[0];
26
  DMA_InitStruct.DMA_MemoryDataSize         = DMA_MemoryDataSize_HalfWord;
27
  DMA_InitStruct.DMA_MemoryInc             = DMA_MemoryInc_Enable;
28
  DMA_InitStruct.DMA_Mode               = DMA_Mode_Circular;
29
  DMA_InitStruct.DMA_PeripheralBaseAddr     = (uint32_t)&TIM1->CCR2 ;
30
  DMA_InitStruct.DMA_PeripheralDataSize     = DMA_PeripheralDataSize_HalfWord;
31
  DMA_InitStruct.DMA_PeripheralInc         = DMA_PeripheralInc_Disable;
32
  DMA_InitStruct.DMA_Priority             = DMA_Priority_Medium;
33

34
  //Initalisierung DMA1 Kanal3
35
  DMA_Init(DMA1_Channel3, &DMA_InitStruct);
36

37
  //Interrupt nach halber und ganzer Übertragung
38
  DMA_ITConfig(DMA1_Channel3, DMA_IT_HT | DMA_IT_TC,ENABLE);
39

40
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
41
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
42
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
43
  NVIC_Init(&NVIC_InitStructure);
44

45
  DMA_Cmd(DMA1_Channel3,ENABLE);
46
  TIM_DMACmd(TIM16, TIM_DMA_Update, ENABLE);
47

48

49
  //DMA Channel5 = V
50
  //DMA Kanal löschen
51
  DMA_DeInit(DMA1_Channel5);
52

53
  DMA_InitStruct.DMA_BufferSize           = 400;
54
  DMA_InitStruct.DMA_DIR                 = DMA_DIR_PeripheralDST;
55
  DMA_InitStruct.DMA_M2M             = DMA_M2M_Disable;
56
  DMA_InitStruct.DMA_MemoryBaseAddr       = (uint32_t)&Usin[0];
57
  DMA_InitStruct.DMA_MemoryDataSize         = DMA_MemoryDataSize_HalfWord;
58
  DMA_InitStruct.DMA_MemoryInc             = DMA_MemoryInc_Enable;
59
  DMA_InitStruct.DMA_Mode               = DMA_Mode_Circular;
60
  DMA_InitStruct.DMA_PeripheralBaseAddr     = (uint32_t)&TIM1->CCR3 ;
61
  DMA_InitStruct.DMA_PeripheralDataSize     = DMA_PeripheralDataSize_HalfWord;
62
  DMA_InitStruct.DMA_PeripheralInc         = DMA_PeripheralInc_Disable;
63
  DMA_InitStruct.DMA_Priority             = DMA_Priority_Medium;
64

65
  //Initalisierung DMA1 Kanal5
66
  DMA_Init(DMA1_Channel5, &DMA_InitStruct);
67

68
  DMA_Cmd(DMA1_Channel5,ENABLE);


Der DMA auf Cannel3 läuft so fehlerfrei. Wenn ich diesen auskommentiere 
dann auch der DMA auf Channel5.

Grüße
Steph

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