Forum: Mikrocontroller und Digitale Elektronik stm32 Stepper Driver (TIM2 + DMA)


von matthias h. (matthias_h95)


Lesenswert?

Hallo,

ich kämpfe gerade auch etwas gegen den DMA. Google hat mich dabei zu 
einem Beitrag geführt, der eine Lösung bieten soll:
Beitrag "STM32 - DMA MemToPerph Timer gesteuert"
Manuel schreibt hier, dass es bei ihm funktioniert, was schon mal besser 
ist, als bei mir :-)
Mir stellt sich allerdings die Frage, warum er in das 
DMA_PeripheralBaseAddr die Adresse von TIM1->CCER schreibt. Müsste hier 
nicht TIM1->ARR stehen.
Bei mir geht leider beides nicht :-( dennoch dachte ich vielleicht kann 
mir hier jemand sagen ob es wirklich CCER sein muss und wenn ja warum.
Ich würde mich freuen, wenn mich jemand aufklären könnte

Hier noch mein Code, falls jemand hier den Fehler findet:
TIM2 schein zu stimmen zumindest wird am Ausgang die eingestellte 
Frequenz ausgegeben.
Allerdings wird nie der DMA1_Channel7_IRQHandler ausgeführt also ist mit 
dem DMA irgendwas nicht iO. Nur ich weiß nicht was.

Danke schonmal
1
void Stepper_Init(void)
2
{
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
  
5
  /* TIM2 clock enable */
6
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
7
   /* GPIOA clock enable */
8
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
9
  /* GPIOC clock enable */
10
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
11
  /* Enable DMA1 clock */
12
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
13
  
14
  RCC_AHBPeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
15
16
  /* GPIOA Configuration:TIM2 Channel1 in Output */
17
18
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
19
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /*AF Alternate Function*/
20
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
21
22
  GPIO_Init(GPIOA, &GPIO_InitStructure);
23
24
  /* ---------------------------------------------------------------
25
  TIM2 Configuration: Output Compare Toggle Mode:
26
  --------------------------------------------------------------- */
27
  TIM_DeInit( TIM2 );
28
  TIM_TimeBaseStructInit( &TIM_TimeBaseStructure );
29
  TIM_OCStructInit( &TIM_OCInitStructure );
30
31
   /* Time base configuration */
32
  TIM_TimeBaseStructure.TIM_Period =60000;
33
  TIM_TimeBaseStructure.TIM_Prescaler = 2;
34
  TIM_OCInitStructure.TIM_Pulse = 0;  
35
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
36
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
37
  
38
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
39
40
  /* Output Compare Toggle Mode configuration: Channel4 */
41
  TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Toggle;  
42
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
43
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
44
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);
45
 
46
  TIM_ARRPreloadConfig(TIM2, ENABLE);
47
48
  
49
  /* -------------------------------------------------------------------
50
  DMA1 configuration 
51
  ---------------------------------------------------------------------- */
52
  
53
  /* DMA1 channel2 configuration ----------------------------------*/
54
  DMA_DeInit(DMA1_Channel7);
55
  DMA_StructInit(&DMA_InitStructure);
56
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM2_BASE + 0x2C;
57
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM2->ARR; //(uint32_t)TIM2_BASE + 0x2C; //(uint32_t)TIM2_ARR_Address;
58
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer_INC;
59
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
60
  DMA_InitStructure.DMA_BufferSize = BufferSize;
61
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
62
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
63
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
64
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
65
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
66
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
67
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
68
  DMA_Init(DMA1_Channel7, &DMA_InitStructure);
69
  
70
  /* Enable DMA1 Channel2 Transfer Complete interrupt */
71
  DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
72
  
73
    NVIC_InitTypeDef NVIC_InitStructure;
74
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
75
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
76
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
77
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
78
    NVIC_Init(&NVIC_InitStructure);
79
80
81
    DMA_SetCurrDataCounter(DMA1_Channel7, BufferSize);
82
83
84
85
  /* Enable DMA1 Channel2 */
86
  DMA_Cmd(DMA1_Channel7, ENABLE);
87
  
88
  /* Enable TIM2 DMA update request */
89
  TIM_DMACmd(TIM2,TIM_DMA_Update, ENABLE);
90
91
  /* TIM enable counter */
92
  TIM_Cmd(TIM2, ENABLE);
93
}

: Bearbeitet durch User
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.