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
#5908124
Hallo, deine Timer Init Funfktion heist Timerintit2. In main rufst Du jedoch timer_init() auf. Da stimmt schon mal etwas nicht. Hans
Vielen Danke. Ich habe das jetzt geändert, funktioniert aber trozdem nicht.
Das hier sollte funktionieren.
Gast
#5908268
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?
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.
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?
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Gast
#5908409
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.
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?"
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.