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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.