Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Compare Interrupt mit STL?


von Hans (Gast)


Lesenswert?

Ich habe funktionierenden Code, der eine PWM an Timer 4 mit Kanälen 1 
und 2 misst (STM32F103).

Damit gibt es ein Problem: die Capture-Interrupts werden durch Störungen 
zu häufig ausgelöst. Ich möchte Sie nun durch Deaktivieren "Entprellen" 
und nach definierter Zeit über einen weiteren Compare-Interrupt wieder 
freigeben.

Allerdings bin ich Neuling mit ARM und STM32.
Könnte mich bitte jemand auf die richtigen Funktionen verweisen, wie ich 
mit der STM32 SPL passend zu
1
TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);

den Comparewert = Timer + 30 counts setze?

Gibt es Zugriffsfunktionen oder kann man einfach z.B.
1
TIM4_CCR3 = TIM4_CNT + 30;

schreiben?

von Hans (Gast)


Lesenswert?

Leider nicht:
> TIM4_CCR3 = TIM4_CNT + 30;
src\main.c|384|error: 'TIM4_CCR3' undeclared (first use in this 
function)|

aber
1
TIM4->CCR3 = TIM4->CNT + 30;

scheint zu gehen..

von Hans (Gast)


Lesenswert?

Oder auch nicht - nach 10 bis 15 Interrupts bzw. 60-90 ms ist Schluss, 
der Flankeninterrupt wird nicht mehr ausgeführt.
Offenbar deaktiviert sich da etwas unbeabsichtig.

Muss man dabei den Timerüberlauf o.Ä. beachten?
Hier mal die Konfiguration des Timers:
1
TIM_TimeBase_InitStructure.TIM_Period = 9999;
2
TIM_TimeBase_InitStructure.TIM_Prescaler = (SystemCoreClock / 10000) - 1;
3
TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
4
TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
5
TIM_TimeBaseInit(TIM4, &TIM_TimeBase_InitStructure);
6
TIM_IC_InitStructure.TIM_Channel = TIM_Channel_2;
7
TIM_IC_InitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
8
TIM_IC_InitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
9
TIM_IC_InitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
10
TIM_IC_InitStructure.TIM_ICFilter = 0x02;
11
TIM_ICInit(TIM4,&TIM_IC_InitStructure);
12
TIM_PWMIConfig(TIM4, &TIM_IC_InitStructure);
13
TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);
14
TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);
15
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
16
TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);
17
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
18
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
19
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
20
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
21
NVIC_Init(&NVIC_InitStructure);
22
TIM_Cmd(TIM4, ENABLE);


Und so versuche ich, die Interrupts einzusetzen:
1
void TIM4_IRQHandler(void) {
2
    if( TIM_GetITStatus(TIM4, TIM_IT_CC3) == SET ) {
3
        TIM_ITConfig(TIM4, TIM_IT_CC3, DISABLE);
4
        TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
5
6
        TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);
7
    } else {
8
    
9
    if( TIM_GetITStatus(TIM4, TIM_IT_CC2) == SET ) {
10
        TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
11
        
12
        GPIOB->BSRR = ((GPIOB->ODR ^ GPIO_Pin_8) & GPIO_Pin_8) | (GPIO_Pin_8 << 16);
13
14
        TIM_ITConfig(TIM4, TIM_IT_CC2, DISABLE);
15
16
        TIM4->CCR3 = TIM4->CNT + 30;
17
        TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
18
        TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);
19
      ...

Mit den Interruptprioritäten habe ich mich noch nicht beschäftigt - 
stimmt bei der Konfiguration alles?

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.