Gast
#2458378
Hallo zusammen,
ich habe einen STM32F100RB µC. Ich möchte die Timer-Overflow-Interrupt
Funktion testen. Zu diesem Zweck habe ich Code in der Coocox-IDE
kompiliert und getestet.
Wie erwartet wird auch ein Interrupt zur erwarteten Zeit ausgelöst, wie
ich mit Hilfe eines getoggleten Pins erkennen konnte.
Allerdings tritt immer nach dem erwarteten Interrupt nach etwa 1µS ein
weiterer Interrupt auf. Warum dieser zweite Interrupt ausgelöst wird
habe ich nicht verstanden. Wenn ich in der Interrupt Routine das UIF
flag zweimal nacheinander lösche, tritt der zweite Interrupt nicht mehr
auf.
Vermutlich handelt es sich um etwas wirklich Triviales, aber dies sind
meine ersten Versuche mit diesem µC. Vielleicht kann mich jemand mit
einem Hinweis in die richtige Richtung stupsen ;-)
Dies ist der Code:
///////////////////////////////////////////////////////////////////////
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_tim.h"
#include "misc.h"
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
int main(void)
{
int i;
SetSysClockTo24(); // Setzt den System-CLK auf 24 MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2,DISABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 0x1000;
TIM_TimeBaseStructure.TIM_Prescaler = 2;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM2->DIER |= TIM_DIER_UIE; // (1<<0); // UPDATE INTERRUPT ENABLE
NVIC_InitTypeDef NVIC_InitStructure; //create NVIC structure
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// Enable timer counting
TIM_Cmd(TIM2,ENABLE);
while(1){
}
}
void TIM2_IRQHandler()
{
GPIOA->BSRR = GPIO_Pin_8;
GPIOA->BRR = GPIO_Pin_8;
TIM2->SR &= ~(1<<0); // clear UIF flag
}
///////////////////////////////////////////////////////////////////////
Danke und Grüße
stm32_beginner