Forum: Mikrocontroller und Digitale Elektronik stm32f030 ein Timer mehrere DMA


von Steph M. (stephh)


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

von Steph M. (stephh)


Lesenswert?

Hat hierzu keiner eine Idee oder geht das einfach nicht? Es muss doch 
irgendwie möglich sein, mehr als nur einen DMA Kanal Timer-gesteuert zu 
betreiben.

Grüße
Steph

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.