Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt am STM32F103RB


von Tobias S. (tobias_12345)


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)
  {

  }}

: Bearbeitet durch User
von Hans (Gast)


Lesenswert?

Hallo,

deine Timer Init Funfktion heist Timerintit2.
In main rufst Du jedoch timer_init() auf.

Da stimmt schon mal etwas nicht.

Hans

von Tobias S. (tobias_12345)


Lesenswert?

Vielen Danke.
Ich habe das jetzt geändert, funktioniert aber trozdem nicht.

von Helmut L. (helmi1)


Angehängte Dateien:

Lesenswert?

Das hier sollte funktionieren.

von pegel (Gast)


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?

von Tobias S. (tobias_12345)


Lesenswert?

So richtig Funktionier das Programm bei mie auch nicht.
ich lade beim debuggen immer in eine Funktion bei der als Kommentar
"//If you get stuck here, your code is missing a handler for some 
interrupt.
//This will pinpoint a specific missing vector." seht.

von Tobias S. (tobias_12345)


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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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
}

von Stefan F. (Gast)


Angehängte Dateien:

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.

von Nico W. (nico_w)


Lesenswert?

Wenn man die "falsche" Toolchain nutzt und der Startup-Code nach den 
Sourcen gelinkt wird, sollte man mal hier gucken:
Beitrag "Re: arm gcc 7.2.1 -flto broken?"

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.