Timer Interrupt am STM32F103RB

OP #5908117
Lesenswert?

Hallo,

ich versuche mit dem  STM32F103 ein Timer Interrupt hin zu bekommen.
Allegings wird das Interrupt nie ausgeführt und der Controller bleib 
irgendwo im Programm hängen.

Kann mir da jemand einen Tip geben?



#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
#include <stm32f10x.h>
#include <misc.h>

 timer_init()
{
  TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_Prescaler = 1000-1;
  //TIM_TimeBaseStructure.TIM_Period = 8400-1;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);


  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_Init(&NVIC_InitStructure);


  TIM3->CR1 = TIM_CR1_CEN;
}

void TIM2_IRQHandler()
{
  while ((TIM2->SR & (1 << 0)) > 0) TIM2->SR &= ~(1 << 0);
  GPIOA->BSRR = (1 << 5);
}
int main()
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  timer_init();


  while (1)
  {

  }}
Gast #5908268
Lesenswert?

Tobias S. schrieb:
> wird das Interrupt nie ausgeführt und der Controller bleib
> irgendwo im Programm hängen.

Das lässt dunkle vor HAL Erinnerungen wieder hochkommen.
Einige Int wurden ausgeführt, andere nicht.
Nach vielem suchen und ansehen sämtlicher Quelldateien, bin ich dann 
darauf gekommen, das die startupxxxx.s die Default Version war und die 
entsprechenden Vectoren einfach nicht eingetragen waren.

Passen die bei dir?
OP #5908307
Lesenswert?

pegel schrieb:
> Tobias S. schrieb:
>> wird das Interrupt nie ausgeführt und der Controller bleib
>> irgendwo im Programm hängen.
>
> Das lässt dunkle vor HAL Erinnerungen wieder hochkommen.
> Einige Int wurden ausgeführt, andere nicht.
> Nach vielem suchen und ansehen sämtlicher Quelldateien, bin ich dann
> darauf gekommen, das die startupxxxx.s die Default Version war und die
> entsprechenden Vectoren einfach nicht eingetragen waren.
>
> Passen die bei dir?

Kamm sein, woran erkenne ich das den?
(Firma: matzetronics) #5908317
Lesenswert?

Bevor man in der ISR an den GPIOs rumfummelt, sollte auf jeden Fall das 
IRQ Flag gelöscht werden - da gabs mal einen Thread zu hier im Forum.
Hier mal für Timer 1:
1
void TIM1_UP_TIM16_IRQHandler(void){
2
//uint8_t speedRegTicks = 0;
3
// microcontroller.net : Clear the IT pending bit before doing any GPIO stuff
4
TIM_ClearITPendingBit(TIM1,(TIM_IT_Update | TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3));
5
  LED_GPIO_PORT->BSRR = ERROR_LED_PIN;  // debug
6
}
Gast #5908409
Lesenswert?

Tobias S. schrieb:
> Kamm sein, woran erkenne ich das den?

Guck in deine startupxxxx.s Datei, ob der IRQ Handler dort drin steht 
und welchen Namen er hat. Ich hänge Dir mal meine Datei an, dann hast 
was zum Vergleichen.

Hier http://stefanfrings.de/stm32/stm32f1.html#ivektoren ist eine 
Abschrift der Interrupt-Vektor Tabelle aus dem Referenzhandbuch 
(http://www.st.com/resource/en/reference_manual/CD00171190.pdf).

Für Dich entscheidend ist, dass an der richtigen Adresse (0x00B0) ein 
Funktionsname (TIM2_IRQHandler) steht und dass dieser mit deinem C 
Quelltext übereinstimmt. Die Adressen stehen aber nicht in der Datei, 
deswegen musst du die Zeilen Zählen und dich dabei konzentrieren.

Der Name dürfte auch "Franz" sein, Hauptsache er stimmt mit dem C 
Quelltext überein.
Angehängte Dateien:

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