Forum: Mikrocontroller und Digitale Elektronik STM32 Interrupt Handler


von Guest (Gast)


Lesenswert?

Hallo, ich stecke mal wieder fest und bin wieder auf der Suche nach 
scharfen Augen :)
Fällt jemandem eventuell auf, warum mein Interrupt nicht ausgelöst wird?
Grüße
1
#include "stm32f0xx.h"
2
#include "stm32f0xx_gpio.h"
3
#include "stm32f0xx_tim.h"
4
#include "stm32f0xx_misc.h"
5
6
  void ur_sh_pwm_init(void){
7
  
8
  GPIO_InitTypeDef           GPIO_InitStructure;
9
  TIM_OCInitTypeDef         TIM_OC_InitStructure;
10
  TIM_TimeBaseInitTypeDef   TIM_TimeBase_InitStructure;
11
  NVIC_InitTypeDef           NVIC_InitStructure;
12
    
13
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
14
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
15
 
16
  GPIO_StructInit(&GPIO_InitStructure);  
17
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_7;
18
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
19
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
20
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
21
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
22
  GPIO_Init(GPIOA, &GPIO_InitStructure);
23
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
24
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_2);  
25
    
26
  TIM_TimeBaseStructInit(&TIM_TimeBase_InitStructure);  
27
  TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
28
  TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
29
  TIM_TimeBase_InitStructure.TIM_Period = 49;
30
  TIM_TimeBase_InitStructure.TIM_Prescaler = 23;
31
  //TIM_TimeBase_InitStructure.TIM_RepetitionCounter = 49;
32
  TIM_TimeBaseInit(TIM1, &TIM_TimeBase_InitStructure);
33
34
  TIM_OCStructInit(&TIM_OC_InitStructure);
35
  TIM_OC_InitStructure.TIM_OCMode = TIM_OCMode_PWM1;
36
  TIM_OC_InitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
37
  TIM_OC_InitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
38
  TIM_OC_InitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
39
  TIM_OC_InitStructure.TIM_OutputState = TIM_OutputState_Enable;
40
  TIM_OC_InitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
41
  TIM_OC_InitStructure.TIM_Pulse = 25;
42
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
43
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
44
  TIM_OC1Init(TIM1, &TIM_OC_InitStructure);
45
  TIM_OC2Init(TIM1, &TIM_OC_InitStructure);
46
  
47
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
48
  
49
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
50
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
51
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
52
        NVIC_Init(&NVIC_InitStructure);  
53
  //TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
54
  //TIM_ClearFlag(TIM1, TIM_FLAG_Update);
55
56
       TIM_CtrlPWMOutputs(TIM1, ENABLE);
57
       TIM_Cmd(TIM1, ENABLE);
58
}
59
60
61
       void TIM1_CC_IRQHandler(void){
62
       TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
63
  LED_An();
64
  LED_Aus();  
65
}

von Jim M. (turboj)


Lesenswert?

Hast Du das mit dem Debugger geprüft? Ein
1
LED_An();
2
LED_Aus();

sieht man höchstens im Oszilloskop, aber nicht mit bloßem Auge.

von Planloses_Register (Gast)


Lesenswert?

Ja, im Debugger springt er auch nicht rein, leider :/

von 6A66 (Gast)


Lesenswert?

Guest schrieb:
> Fällt jemandem eventuell auf, warum mein Interrupt nicht ausgelöst wird?

So was macht man systematisch im Debugger (Register der Peripherie 
anschauen):
Zählt der Zähler?
Sind die Registerinhalte so wie gewünscht?
Kommt der Zähler am CC1-Wert vorbei?
Wird dann ein Interrupt asugelöst (Timer register)?
Wird imm NVIC dann das Flag gesetzt?
...

rgds

von Guest (Gast)


Lesenswert?

Naja die Register stimmen wohl oder übel. Das PWM Signal pass.
Bei NVIC kann nicht mehr eingestellt werden.
Keine Ahnung wie ich überprüfen kann ob in Keil der Zähler am CC Wert 
vorbei kommt, aber das muss er ja zwangsläufig wenn er reagieren soll 
sobald der Zähler überläuft.
Wofür wird ein Flag benötigt?

von Michael M. (eos400dman)


Lesenswert?

Guest schrieb:
> TIM_ClearITPendingBit(TIM1, TIM_IT_Update);

Nur auf die Schnelle: Du clears hier das falsche Bit, oder nicht?

Viele Grüße Michael

von Guest (Gast)


Lesenswert?

Die Änderung auf
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);
bringt leider auch keine Besserung

von Guest (Gast)


Lesenswert?

Mittlerweile sieht der Code so aus aber er funktioniert leider immernoch 
nicht.
[c]
#include "stm32f0xx.h"
//#include "stm32f0xx_conf.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_tim.h"
#include "stm32f0xx_misc.h"

void ur_sh_led_init(void);
void ur_sh_button_init(void);
void ur_sh_pwm_init(void);
void LED_An(void);
void LED_Aus(void);
void ur_sh_pwm_activate(void);
void ur_sh_pwm_deactivate(void);
//void TIM1_CC_IRQHandler(void);
int Done=0;
int Count=0;
//void NVIC_EnableIRQ(IRQn_t IRQn);

int main(void)
{
  ur_sh_button_init();
  ur_sh_led_init();
  ur_sh_pwm_init();
  while(1){
  if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) && Done==0){
    LED_An();
    ur_sh_pwm_activate();
    Done=1;
    Count=100;
  }
  if (Count==0){
    ur_sh_pwm_deactivate();
                LED_Aus
  }
  }
}

void TIM1_CC_IRQHandler(void){
Count=Count-1;
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
  }

void ur_sh_pwm_init(void){

  GPIO_InitTypeDef           GPIO_InitStructure;
  TIM_OCInitTypeDef         TIM_OC_InitStructure;
  TIM_TimeBaseInitTypeDef   TIM_TimeBase_InitStructure;
  NVIC_InitTypeDef           NVIC_InitStructure;

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_2);

  TIM_TimeBaseStructInit(&TIM_TimeBase_InitStructure);
  TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBase_InitStructure.TIM_Period = 49;
  TIM_TimeBase_InitStructure.TIM_Prescaler = 23;
  //TIM_TimeBase_InitStructure.TIM_RepetitionCounter = 49;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBase_InitStructure);

  TIM_OCStructInit(&TIM_OC_InitStructure);
  TIM_OC_InitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OC_InitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OC_InitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC_InitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OC_InitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OC_InitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OC_InitStructure.TIM_Pulse = 25;
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_OC1Init(TIM1, &TIM_OC_InitStructure);
  TIM_OC2Init(TIM1, &TIM_OC_InitStructure);

  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_EnableIRQ(TIM1_CC_IRQn);
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);
  TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
  //TIM_ClearFlag(TIM1, TIM_FLAG_Update);
}

    void ur_sh_pwm_activate(void){
      TIM_CtrlPWMOutputs(TIM1, ENABLE);
      TIM_Cmd(TIM1, ENABLE);
    }

    void ur_sh_pwm_deactivate(void){
      TIM_CtrlPWMOutputs(TIM1, DISABLE);
      TIM_Cmd(TIM1, DISABLE);
    }

von Michael M. (eos400dman)


Lesenswert?

Versuchs mal so:
1
TIM_ClearITPendingBit(TIM1,TIM_IT_CC1)

Außerdem counter als volatil definieren.

Und wenn Pin 0 von GPIOA auf 0 ist, wir der Timer ja auch sofort wieder 
gestoppt.

Gruß Michael

von Guest (Gast)


Lesenswert?

Hat sich nichts verändert dadurch.
Langsam gehen mir auch die Ideen aus ^^

von Guest (Gast)


Lesenswert?

Hat keiner mehr einen Vorschlag? Steck irgendwie immer noch fest.

von holger (Gast)


Lesenswert?

Nimm mal

TIM_ITConfig(TIM1, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);

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.