Hi Leute,
Ich brauch mal eure Hilfe. Und zwar versuche ich gerade, ein
chinesisches BluePill mit einem STM32F103C8T6 drauf zum Leben zu
bringen. Der Plan war, einen Timer laufen zu lassen, der dann eine LED
per Interrupt ein- und ausmachen würde. Ja, daran scheitert es schon.
Die LED bleibt an, der Interrupt wird gar nicht erreicht. Da ich schon
einige Probleme mit Includes und Defines gehabt habe (man sieht es im
Code, wo plötzlich z.B ((uint16_t)0x2000)) anstatt GPIO_Bit_13 steht -
da musste ich dem Präprozessor seine Arbeit abnehmen und direkt das
eintippen, was in den entsprechenden, eigentlich eingebundenen Dateien
stand. In einem anderen Projekt werden die Includes auch resolved. Unter
Verdacht hab ich, dass die Funktion TIM7_IRQHandler gar nicht als
Interrupt erkannt wird, da die IDE beim Rechtsklick -> find declaration
gar nichts ausgibt. So wird es aber in einem Tutorial gemacht, z.B.
https://www.youtube.com/watch?v=K2WAy53sxmQ .
Der Code ist wie folgt:
1
#include"stm32f10x_conf.h"
2
//#include "stm32f10x.h"
3
4
voidInit(void){
5
// Hardware initialiser
6
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//GPIO C einschalten
Viktor B. schrieb:> Unter Verdacht hab ich, dass die Funktion TIM7_IRQHandler gar nicht als> Interrupt erkannt wird, da die IDE beim Rechtsklick -> find declaration> gar nichts ausgibt.
Du musst zwischen dem, was Deine IDE Dir erzählt, und dem, was der
Compiler draus macht, deutlich unterscheiden. Deine IDE mag
Include-Dateien ignorieren, der Compiler aber macht das mit Sicherheit
nicht.
Mach mal das
TIM_ClearITPendingBit() als erste Anweisung in den Handler und nicht als
letzte. Ansonsten könnte die Handler Funktion wegen dem Schreibpuffer
und Tail-Chaining 2x hintereinander ausgeführt werden.
Dann noch:
Rufus Τ. F. schrieb:> Deine IDE mag> Include-Dateien ignorieren, der Compiler aber macht das mit Sicherheit> nicht.
Wie prüft man das? Bzw. wo findet man das kompilierte Assemblerprogramm?
Ich schätze, dort könnte man nach einer Tabelle suchen?
Jim M. schrieb:> Mach aus der 55 mal ein "TIM7_IRQn". Bei den Nummern vertut man sich> sonst leicht.
Dann macht mir die IDE aus "compiled successfully" einen "Could not
resolve" - wie gesagt, Probleme beim resolven hat die IDE nun mal. Das
letzte Mal ist mir sowas mit Eclipse passiert, wo ein zweites Einbinden
der Sources das Problem löste. In EmBitz hatte ich die Option noch nicht
gefunden. Und die Nummer wurde dreifach verglichen, ist schon die
richtige.
In der Datei
startup_stm32f10x_ms.S
die auch in deinem Projekt vorhanden sein sollte sind alle
default IRQHandler aufgeführt die es geben sollte, und nicht
mehr. Dort ist aber kein Handler für Timer7 zu finden.
Viktor B. schrieb:> anstatt GPIO_Bit_13 steht -> da musste ich dem Präprozessor seine Arbeit abnehmen und direkt das> eintippen
Nein, du musst nur die richtigen Tokens verwenden.
Mitlesa schrieb:> Nein, du musst nur die richtigen Tokens verwenden.
Ist übrigens in den SPL-Dateien (hier stm32f10x_gpio.c) recht
genau im Header beschrieben was du als Parameter geben kannst.
1
/**
2
* @brief Sets or clears the selected data port bit.
3
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
4
* @param GPIO_Pin: specifies the port bit to be written.
5
* This parameter can be one of GPIO_Pin_x where x can be (0..15).
6
* @param BitVal: specifies the value to be written to the selected bit.
7
* This parameter can be one of the BitAction enum values:
Viktor B. schrieb:> So wird es aber in einem Tutorial gemacht, z.B.> Youtube-Video "ARM Cortex EmBitz - LED Blinken Timer ISR - Tutorial> Teil #3 (deutsch)" .
Dort ist aber von einem Timer 2 (und nicht Timer 7) die Rede,
so jedenfalls die Unterschrift zum verlinkten Video:
Zitat:
"Realisierung eines interruptgesteuerten LED Blinken mit
Hilfe des Timers 2, welcher an den NVIC (Interrupt Management)
angebunden wird."
Naja, 2 und 7 kann man schon mal verwechseln wenn die Augen im
fortgeschrittenen Alter nachlassen ....
Mitlesa schrieb:> sind alle> default IRQHandler aufgeführt die es geben sollte
Die Vektor-Tabelle im Reference Manual (Seite 203, dort kommt
auch Timer 7 vor) ist jedoch grösser als diejenige die in
<startup_stm32f10x_ms.S> gelistet ist ....
Man müsste diese Tabelle also "aufbohren" um an den möglichen
Timer 7 Interrupt zu kommen.
So, bin den zahlreichen Tipps von Mitlesa gefolgt.
1) Jetzt bin ich mir nicht mehr sicher, ob ich tatsächlich so einen
dummen Fehler mit _Bit und _Pin gemacht hab. Die IDE kann das jetzt
resolven, kann aber auch am Neustart liegen. Ja, die Wahrscheinlichkeit
ist klein, aber genauso groß wie die davon, dass ich um die eine Stunde
einen Projekt, wo es richtig war, und einen, wo es falsch war,
gleichzeitig angeschaut hab und das nicht bemerken konnte.
2) Es gibt keinen Timer 7. Ich wollte nicht alles aus dem Tutorial
abkupfern und einen anderen Timer verwenden, dabei hab ich aus Versehen
in den RefMan anstatt in den Datasheet geschaut. Hab mich schon gefreut,
dass der STM32F103 Timer in Hülle und Fülle bietet. Tja. Habs jetzt mit
dem Timer 4 probiert.
3) Es läuft immer noch nichts. Das Programm sieht mittlerweile so aus:
1
#include"stm32f10x_conf.h"
2
//#include "stm32f10x.h"
3
4
voidInit(void){
5
// Hardware initialiser
6
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//GPIO C einschalten
Durchs Debuggen sieht es aus, als würde das Programm genau einmal in die
Interruptroutine springen, aber auch nicht mehr. Studiere gerade das
RefMan bezüglich autoreload des Timers, vielleicht lädt der Timer aus
irgendeinem Grund nicht mehr neu?..
Yup. Das war es, nun blinkt die LED fröhlich vor sich hin! Danke
@Mitlesa.
Noch eine Frage: woher soll man das alles wissen? Gibt es zusätzlich zu
der RefMan des STM32F10x noch ein RefMan für die SPL? Oder wie kommt man
an die nötigen Anweisungen und deren Bezeichnungen? Nur damit ich nichts
weiteres übersehe, falls ein Tutorial nicht darauf eingehen wird
Viktor B. schrieb:> Noch eine Frage: woher soll man das alles wissen? Gibt es zusätzlich zu> der RefMan des STM32F10x noch ein RefMan für die SPL?
Das "RefMan" ist für mich die entsprechende Header-Datei
bezogen auf die Hardware mit der ich mich gerade beschäftige.
Als Beispiel hier die Prototypen der <stm32f10x_gpio.h>. Damit
hat man eine sehr kompakte Übersicht was möglich ist.
Will man es dann genauer wissen genügt ein Blick in die
korrespondierende <stm32f10x_gpio.c>
Alles für mich ausreichend selbsterklärend ... für dich nicht?
Dann kann man immer noch ins echte "RefMan" schauen ...