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
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.
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 | 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 | }
|
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?"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.