Forum: Mikrocontroller und Digitale Elektronik STM32: Jeder Interrupt landet im Default_Handler


von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Moin Moin,

ich bin am verzweiflen.. bitte helft mir ;-)
Aber nun erstmal zu meinem Problem: Ich habe ein laufendes STM32, das 
ich im Atollic TrueStudio Lite geschrieben habe (Der Prozessor ist ein 
STM32F103RBT6). Das bedeutet also ich habe ein funktionierendes Linker 
file und ein startup file.
Da mein Projekt immer komplexer wird, habe ich mir überlegt doch ein 
Betriebssystem einzusetzen -> FreeRTOS.
Aus den vorhandenen Beispielprojekten habe ich mir ein ganz neues leeres 
Projekt zusammengeschustert, in dem ich über einen xTimer eine LED 
blinken lasse. Das funktioniert.
Ich benötige aber außerdem einen Hardware Timer, der mir mit 80 kHz 
einen Interrupt erzeugt. Im alten Projekt lief dieser bereits, doch nun 
habe ich das folgende Problem (erstmal der Code):
1
/* PCLK1 = HCLK/2 = 36 MHz */
2
RCC_PCLK1Config(RCC_HCLK_Div2);
3
4
/* PCLK2 = HCLK = 72 MHz */
5
RCC_PCLK2Config(RCC_HCLK_Div1);
6
7
/* ADCCLK = PCLK2/6 = 72 MHz/6 = 12 MHz */
8
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
9
10
/* GPIO clock enable */
11
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
12
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
13
14
/* TIM2 clock enable */
15
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
16
17
/* ADC1 clock enable */
18
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
19
20
/* ADC2 clock enable */
21
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
22
23
24
25
26
27
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
28
29
/************************************************/
30
/*  TIM2: 80 kHz                                */
31
/************************************************/
32
33
/* Initialise data. */
34
TIM_DeInit(TIM2);
35
36
TIM_TimeBaseStructure.TIM_Period = 900;
37
TIM_TimeBaseStructure.TIM_Prescaler = 0;
38
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
39
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
40
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
41
42
43
44
45
NVIC_InitTypeDef NVIC_InitStructure;
46
47
#ifdef VECT_TAB_RAM
48
  /* Set the Vector Table base location at 0x20000000 */
49
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
50
#else  /* VECT_TAB_FLASH  */
51
  /* Set the Vector Table base location at 0x08000000 */
52
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
53
#endif
54
55
/* Ensure that all 4 interrupt priority bits are used as the pre-emption priority. */
56
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
57
58
/* Configure the TIM2 global interrupts (80 kHz) */
59
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
60
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (configMAX_SYSCALL_INTERRUPT_PRIORITY >> 4) + 1;
61
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
62
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
63
NVIC_Init(&NVIC_InitStructure);
64
65
/* TIM2 enable overflow interrupt */
66
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

Drumrum läuft gar kein Code mehr, alles auskommentiert. Wenn ich mit dem 
Debugger durch das Programm steppe, stürzt es genau in der Zeile
1
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
ab und landet in der Default_Handler Routine in meinem Startup Code.

Ich habe jetzt schon an allen Schrauben rumgeschraubt ;) Ich hatte es in 
Erwägung gezogen, dass mit den Interrupt Prioritäten was nicht stimmt, 
wobei ich jetzt nicht mehr daran glaube. Dann habe ich überlegt, dass 
vielleicht der Interrupt Handler nicht gefunden werden kann, also die 
IVT vielleicht falsch ist. Aber mein Startup Code und auch mein Linker 
File laufen ja im anderen Projekt, wo alles identisch ist, bis auf das 
RTOS was nun im Hintergrund exisitert. Habe die entsprechenden Files 
nochmal mit hochgeladen... vielleicht hat ja einer eine Idee.

Übrigens passiert bei anderen Interrupts das selbe. Egal was für einen 
Interrupt ich aktiviere, sobald er auslöst, lande ich im 
Default_Handler.

Wäre sooo super, wenn jemand eine Idee hat, was ich tun kann :-)
Vielen Dank!!!

von Klaus (Gast)


Lesenswert?

Ich habe ein laufendes STM32 Projekt, das ...

wollte ich natürlich schreiben ;)

von Matthias K. (matthiask)


Lesenswert?

Klaus schrieb:
> #ifdef VECT_TAB_RAM
>   /* Set the Vector Table base location at 0x20000000 */
>   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
> #else  /* VECT_TAB_FLASH  */
>   /* Set the Vector Table base location at 0x08000000 */
>   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
> #endif

Wo liegt die Vektortabelle? Leg sie mal fest in den Flash.

Ggf. poste hier mal den ganzen Workspace.

von Klaus (Gast)


Lesenswert?

Matthias K. schrieb:
> Wo liegt die Vektortabelle? Leg sie mal fest in den Flash.

Achso ja klar, die liegt im Flash.
1
NVIC_VectTab_FLASH ist ((uint32_t)0x08000000)

und im Linker File steht ja:
1
/* Specify the memory areas */
2
MEMORY
3
{
4
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 128K
5
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 20K
6
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
7
}

von Klaus (Gast)


Lesenswert?

Über dem Default_Handler im Startup file steht:

"This is the code that gets called when the processor receives an 
unexpected interrupt."

Ist das denn der einzige Fall, bei dem man dort landet? Bedeutet das, 
dass wirklcih etwas mit der Vektortabelle nicht stimmt?

von Matthias K. (matthiask)


Lesenswert?

Meinst Du im "HardFault_Handler"?

Dort landet man zB. wenn man auf eine Speicheradresse zugreift, wo aber 
keiner ist.

von Klaus (Gast)


Lesenswert?

Matthias K. schrieb:
> Meinst Du im "HardFault_Handler"?

Ich weiss nicht, ob das der HardFault_Handler ist? Der Debugger springt 
immer in den Default_Handler (Zeile 110 in startup_stm32f10x_md.S).

von zy (Gast)


Lesenswert?

hatte so ein ähnliches Problem mal als im Interrupt händler das Flag von 
Timer4 statt Timer3 zurück gesetzt wurde. Seh dir deine IRs genau an, ob 
du nicht irgentwo ein falsches flag zurücksetzt, oder eines nicht 
zurücksetzt.

von Klaus (Gast)


Lesenswert?

Hat keiner eine Idee, was ich tun könnte?

von zy (Gast)


Lesenswert?

Hau mal   TIM_ClearFlag(TIM2, TIM_FLAG_Update);   in den Tim2 IR rein 
und probiers, klingt komisch, aber es könnte helfen.

von Mazze (Gast)


Lesenswert?

Klaus schrieb:
> Atollic TrueStudio Lite
Wo sind die Beschränkungen? Code-Größe etwa? Springt er deswegen ins 
Nirwana?

von zy (Gast)


Lesenswert?

Ich kann Keil UV4 empfehlen, ist Perfekt zum STM32 Programmieren und 
kann in der Demoversion bis 32kbyte code, was wohl genug fürn anfang 
ist.

von Mazze (Gast)


Lesenswert?

Schon mal Coocox probiert? (keine Einschränkungen und kostenlos)

von Matthias K. (matthiask)


Lesenswert?

Mazze schrieb:
> Wo sind die Beschränkungen? Code-Größe etwa? Springt er deswegen ins
> Nirwana?

Ab Version 3 auf 32k begrenzt. Vorherige Versionen ohne Begrenzung der 
Code-Größe.

Ich bin auch auf CooCox umgestiegen. Läuft bisher sehr stabil.
Bsp. hier: Beitrag "CooCox CoIDE mit STM32F4-Discovery Board"
(zwar für F4, aber F1 sind auch kein Problem)

Klaus schrieb:
> Hat keiner eine Idee, was ich tun könnte?

Anhand Deiner Codeschnippsel nicht. Das Programm soweit wie möglich 
abspecken um den Fehler einzugrenzen.

von xy (Gast)


Lesenswert?

Hast Probiert TIM_ClearFlag(TIM2, TIM_FLAG_Update);   in den TIM2 IR 
reinzuhauen?

von Klaus (Gast)


Lesenswert?

Habe den Fehler gefunden, allerdings nicht verstanden. In der IDE werden 
ja links alle Source files und andere Dateien des Projekts baumartig 
aufgelistet. Vor den Dateien sind immer so kleine Icons mit zum Beispiel 
einem kleinen "h" für Headerdateien etc. Bei meiner Sourcedatei 
stm32f10x_it.c war dieses Icon irgendwie grau schattiert. Das ist mir 
dummerweise erst sehr spät aufgefallen. Nach dem umbennen gibgs dann 
sofort! Wenn ich die Datei nun wieder zurück umbenenne gehts wieder 
nicht mehr. Sehr seltsam, aber ich begnüge mich damit, dass die Datei 
jetzt anders heißt. Danke für Eure Hilfe! :-)

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.