Forum: Mikrocontroller und Digitale Elektronik STM32F4 HAL TIMER Interrupt läuft nicht


von "S"ehr "T"oller" "M"icrocontroller (Gast)


Angehängte Dateien:

Lesenswert?

Werte Internetgemeinde,

seit geraumer Zeit befinde ich mich auf dem Weg, einen Timer Interrupt 
beim
STM32F410B auszulösen.

Ich habe die Initialisierung der Timer über STM32CubeMX generieren 
lassen.

Meine IDE ist Eclipse mit der openSTM32 work bench (von openstm32.org)

Debugger ist der ST-Link!


ich möchte eine Interrupt nach einer gewissen Zeit auslösen, und in der 
ISR eine LED toggeln!


Togglen der LED in der main klappt, d.h. der GPIO ist richtig 
konfiguriert.

das Ganze möchte ich nun auch in der ISR machen entweder für TIM5 oder 
TIM9!!!

Es hat sich leider herausgestellt, dass die ISR niemals aufgerufen wird!

Und wenn ich, wie in folgendem Video beschieben den Timer
über

( https://www.youtube.com/watch?v=nTOtXiJw1_Y )

  HAL_TIM_Base_Start_IT(&htim9);

starte

komme ich nicht einmal mehr in die while(1) Schleife der main!

Ist die Vorgehensweise überhaupt so sinnvoll?

Wie bekomme ich es ganz stumpf hin, z.B. jeder Sekunde eine Timer ISR
aufzurufen unter Verwendung der HAL Treiber?


VG

von Oleg Konig (Gast)


Lesenswert?

HALtreiber unter Eclipse kannst du vergessen, das geht dank des 64bit 
Kernels nur eingeschränkt (wenn der µC auf 8 bit emuliert ist). Ausser, 
du setzt im make-file den Flag der reg32-HAL auf high, denn könnte es 
klappen.

Gruß

von dasrotemopped (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal ein funktionierendes CubeMX Projekt für ein Nucleo Board.

In die main muss nur
HAL_GPIO_WritePin(Nucleo_LED_GPIO_Port,Nucleo_LED_Pin,GPIO_PIN_SET);
HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1);
eingefügt werden.

Die ISR muss so aussehen
void TIM1_CC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_CC_IRQn 0 */
HAL_GPIO_TogglePin(Nucleo_LED_GPIO_Port,Nucleo_LED_Pin);
  /* USER CODE END TIM1_CC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim1);
  /* USER CODE BEGIN TIM1_CC_IRQn 1 */

  /* USER CODE END TIM1_CC_IRQn 1 */
}

In dem Video fehlt die Einstellung
-Timer->Channel->Output Compare No Output
In deiner main wird der Timer zwar initialisiert, aber nicht aktiviert:
HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1);

Viel Spass beim Anpassen an deine Hardware.
dasrotemopped.

von "S"ehr "T"oller" "M"icrocontroller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo dasrotemopped,

Ich habe nun die Änderungen soweit vorgenommen.

Leider verschwindet der nach dem ersten Durchlauf der While(1)-SChleife
im Nirvana....
Also ich kann nicht genau sagen, wo gerade etwas geschieht.... in der 
Main und in der ISR jedenfalls nicht.....
breakpoints in der while(1) werden jedenfalls nur bei Programmstart 
einmal erreicht, dann nie wieder!!!

hmmh


kann das mit der den Konflikten (Mehrfachbelegungen der Pins am STM32) 
liegen... siehe angefügtes ioc file ???


Viele Grüße

von dasrotemopped (Gast)


Lesenswert?

hat das einen Grund, den uC nur mit 16 MHz laufen zu lassen ?

Ich habe in meinem Projekt den CPU Takt auf 64MHz gesetzt,
Prescaler auf 64000, Counter auf 500, dann ergibt das eine Blinkrate von 
1Hz. In deinem Projekt liegt die Blinkrate bei 1/8 Hz.

Doppelt belegt ist da ja nichts im Projekt, schaut in Ordnung aus.
Welchen Programmer benutzt du ?
SW4STM32 ist eingestellt, klappt der Import in deine IDE ?
Selbst entworfene Hardware oder ein Eval-Board ?

Ich benutze CubeMX 4.14, du 4.15. Habe beim Nucleo-STM32F103 und CubeMX 
4-15 bemerkt, das die Debugger Optionen falsch sind. Benutze doch mal 
4-14. Ist nicht ungewöhnlich, das ST mal Bugs einbaut.

Gruß,

dasrotemopped.

von dasrotemopped (Gast)



Lesenswert?

Hier mal die Screenshots zu CubeMX.
Wenn bei den Nucleo Boards so ein Fehler durchrutscht, dann lieber die 
4-14 benutzen.

Gruß,

dasrotemopped.

von "S"ehr "T"oller" "M"icrocontroller (Gast)


Lesenswert?

OK hab rausgefunden, dass der der im "HardfaultHandler" landet!!!

hmmh?

von "S"ehr "T"oller" "M"icrocontroller (Gast)


Lesenswert?

dasrotemopped schrieb:
> Doppelt belegt ist da ja nichts im Projekt, schaut in Ordnung aus.
> Welchen Programmer benutzt du ?
> SW4STM32 ist eingestellt, klappt der Import in deine IDE ?
> Selbst entworfene Hardware oder ein Eval-Board ?

Ich nutze den ST-Link/V2 debugger!

und es sieht so aus, dass ich die generierten Header und Source Files
händisch in mein Eclipse openSTM32 work bench Project ziehe.....

nutze ein eigenes PCB! --> UART und GPIOs habe ich schon mal getestet 
und laufen! läuft aber alles nur in der main, ohne Interrupts!

von dasrotemopped (Gast)


Lesenswert?

>Ich nutze den ST-Link/V2 debugger!
Mit 20poligen Anschluss oder SWDIO/SWCLK/SWO ?
>Header und Source Files händisch in mein Eclipse
auch die Startup Routinen ?

von "S"ehr "T"oller" "M"icrocontroller (Gast)


Lesenswert?

dasrotemopped schrieb:
>>Ich nutze den ST-Link/V2 debugger!
> Mit 20poligen Anschluss oder SWDIO/SWCLK/SWO ?
>>Header und Source Files händisch in mein Eclipse
> auch die Startup Routinen ?

ist mit SWDIO/SWCLK/SWO angeschlossen

und

startup glaube ich nicht..... das sind dann doch  STM32F410RBTx_FLASH.ld 
und Makefile! oder wie?

von Jim M. (turboj)


Lesenswert?

"S"ehr "T"oller" "M"icrocontroller schrieb:
> OK hab rausgefunden, dass der der im "HardfaultHandler" landet!!!

Ein vernünftiger Debugger sollte Dir dann auch den restlichen Call Stack 
anzeigen, also wo der Fault ungefähr ausgelöst wurde...

von dasrotemopped (Gast)


Angehängte Dateien:

Lesenswert?

>ist mit SWDIO/SWCLK/SWO angeschlossen
im CubeMX Projekt ist ein TracePin aktiviert, passt also nicht auf deine 
Hardware

>startup glaube ich nicht
das ist die startup_stm32faaaxx.s

die initialisiert den ARM Core (Stack, Heap, IRQ Handler, Debug 
Interface usw.)
Wenn die nicht zu dem HAL Code und User Code exakt passt geht viel 
schief, ohne das der Compiler das merkt. Und die Software wird schnell 
zur Sissi, wenn die Hardware nicht so reagiert wie erwartet 
(HardFault/NMI).
Ein CubeMX Projekt von einer Ausgabe-IDE manuell umzubiegen auf eine 
andere IDE erfordert viel Kenntnisse. Darum lasse ich da die Finger von. 
Die einen schimpfen dann auf die IDE, die anderen auf CubeMX. Aber was 
nicht passt, wird auch nicht passend gemacht(siehe Screenshot). So schön 
eine kostenlose IDE ist, IAR und Keil würden pleite gehen, wenn da nicht 
ein Vorteil existieren würde, deren Software zu benutzen.

Gruß,

dasrotemopped.

von "S"ehr "T"oller" "M"icrocontroller (Gast)


Lesenswert?

Liebes rotes Mopped,


ja sicherlich wäre es geiler, die originale IDE, also Keil, zu nutzen.

Ich wollte das ganze aber auch unter Linux am Laufen haben und außerdem 
hab ich mit Eclipse schon öfters "herumgespielt".....


Na egal auf jeden Fall geht jetzt der Timer Interrupt jetzt.....

void TIM1_CC_IRQHandler(void)


wird aufgerufen.......

Ich habe das STM32CUBEMX Project einfach mal "ordentlich" in Eclipse 
importiert, gemäß der folgenden Beschreibung :

http://www.openstm32.org/Importing+a+STCubeMX+generated+project

schon hat'S geklappt.......... ja ja jetzt kann ich mich endlich mit den 
eigentlichen Aufgaben beschäftigen ;)

Vielen Dank für die Unterstützung soweit!

von dasrotemopped (Gast)


Lesenswert?

gern geschehen.
Manchmal braucht man ja nur mal einen kurzen Hinweis, wo was steht. Das 
I-Net weiss zwar alles, aber hat kein gutes Inhaltsverzeichnis ;)
Habe Keil auch nur, weil die Arbeit mir ne Lizenz zur Verfügung stellt.
SW4STM32 habe ich mir zu Hause installiert, sonst hätte ich von dem 
Import von CubeMX Projekten auch nix gewusst.

Viel Spass beim Proggen,

dasrotmeopped.

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.