STM32 Interrupt Handler

Gast #3892163
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
}
Gast #3893706
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
Gast #3893719
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?
Gast #3893799
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);
    }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren