stm32 Stepper Driver (TIM2 + DMA)

OP #3448544
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.