STM32F4 Timer Synchronisation

OP #4072334
Lesenswert?
• ▲
▼
Hi!
Ichz versuche momentan, mit einem STM32F4Discovery Board (STM32F407VGT) 
einen TLC5940 anzusteuern. Der IC benötigt für PWM einen referenztakt 
und der counter muss alle 4096 Takte genullt werden. Dazu möchte ich 
TIM1 im PWM Mode nutzen (50% duty), um das Taktsignal zu geben und als 
Master für den als Slave konfigurierten TIM2, der alle 4096 Takte einen 
Interrupt auslöst, den "blank" pin (resettet counter) high und low legt 
und neue daten reinschaufelt.

Das problem ist, dass der TIM2 interrupt ganz am anfang einmal 
aufgerufen wird und danach nie wieder.

Mein code für die Timer Konfiguration:
1
RCC->APB1ENR |= RCC_APB1Periph_TIM2;
2
RCC->APB2ENR |= RCC_APB2Periph_TIM1;
3

4
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
5
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Reset);
6
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1);
7
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);
8

9
TIM_TimeBaseInitTypeDef timerInitStructure;
10
timerInitStructure.TIM_Prescaler = 2 - 1;
11
timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
12
timerInitStructure.TIM_Period = 4 - 1;
13
timerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
14
timerInitStructure.TIM_RepetitionCounter = 0;
15
TIM_TimeBaseInit(TIM1, &timerInitStructure);
16

17
timerInitStructure.TIM_Prescaler = 2 - 1;
18
timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
19
timerInitStructure.TIM_Period = 2048 - 1;
20
timerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
21
timerInitStructure.TIM_RepetitionCounter = 0;
22
TIM_TimeBaseInit(TIM2, &timerInitStructure);
23

24
NVIC_InitTypeDef nvicStructure;
25
nvicStructure.NVIC_IRQChannel = TIM2_IRQn;
26
nvicStructure.NVIC_IRQChannelPreemptionPriority = 0;
27
nvicStructure.NVIC_IRQChannelSubPriority = 1;
28
nvicStructure.NVIC_IRQChannelCmd = ENABLE;
29
NVIC_Init(&nvicStructure);
30
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
31

32
TIM_OCInitTypeDef ocInitStruct;
33
ocInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
34
ocInitStruct.TIM_OutputState = TIM_OutputState_Enable;
35
ocInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
36
ocInitStruct.TIM_Pulse = 2;
37
TIM_OC1Init(TIM1, &ocInitStruct);
38
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
39

40
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1);
41
TIM_Cmd(TIM1, ENABLE);
42
TIM_Cmd(TIM2, ENABLE);

Was habe ich hier falsch gemacht?
Der Internal Trigger 0 wird benutzt, weil ich den in einer der ITR 
tabellen im referenzblatt gefunden habe (also mit TIM1 als Master und 2 
als Slave)
OP #4072904
Lesenswert?
• ▲
▼
1
void TIM2_IRQHandler()
2
{
3
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
4
    {
5
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
6
    GPIO_SetBits(BLANK_Port, BLANK_Pin);
7
    GPIO_ResetBits(BLANK_Port, BLANK_Pin);
8
    }
9
}

EDIT:
Durch analyse mit breakpoints hat sich übrigends gezeigt, dass der 
Interrupt einmalig ausgeführt wird, bevor die Timer überhaupt 
initialisiert wurden (und dann nie wieder).
(Firma: matzetronics) #4073160
Lesenswert?
• ▲
▼
Läuft denn die PWM von TIM1? Solange das nicht klappt, brauchst du ja 
mit dem Slave gar nicht anfangen. Mir fehlt noch die Peripheral Clock 
Freigabe für PortA, aber es kann sein, das du die in einem anderen 
Programmteil hast.

Offensichtliche Fehler finde ich nicht, du hast allerdings eine hohe 
Priorität für den TIM2 Kanal, mit der ich nicht so glücklich wäre. 
Sollte aber je nach SysTick Konf kein Problem sein.

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.