Hallo Zusammen,
Ich habe gerade meine neue Platine mit STM32F103 RBT6 (LQFP64 pinout) in
Betrieb genommen und mein Software Projekt dahingehend angepasst
(pin-defines). Ich habe bei der neuen Platine eine Status LED auf dem
PD2 liegen. Immer wenn mein Programm aktiv ist, geht die LED an und am
Ende wieder aus (soweit die Theorie). Bei meinem bisherigen Board hatte
ich die LED auf einem anderen Pin (B0).
Mein Programm bleibt nun aber immer nach ein paar Durchläufen einfach
stehen. Nichtmal der SysTick_Handler wird noch angesprungen. Ich
vermute, dass da vielleicht irgendwo ein Interrupt von dem PD2 erzeugt
wird, finde aber nichts. Den HardFault_Handler() und BusFault_Handler()
habe ich mal eingebaut um dort einen Breakpoint zu setzten, aber auch
die werden nicht angesprungen.
Wenn ich nun einfach die LED nicht nutze (initialisieren aber nicht
schalten), funktioniert alles wunderbar.
Was stimmt mit diesem Pin nicht?
Danke und Grüße
Chris
Uwe B. schrieb:> PD2 ist auch TIM3_ETR. Hast Dur TIM3 in Benutzung?
Hi Uwe,
der sollte nicht aktiv sein (habe auch mal den TIM3_IRQHandler mit
Breakpoint versehen, - ohne Resultat).
Bewusst habe ich lediglich den Systick Interrupt in Benutzung. Für
weitere Timings nutze ich noch den TIM2.
Muss man den PD2 aktiv von TIM3_ETR umschalten auf normal Modus? Im
Datenblatt sieht es so aus, als ob er Standardmäßig ein normaler GPIO
ist. Und wenn man die Alternativ-Funktion aktiviert, wird er per default
zum TIM3_ETR... sehe ich das richtig, oder gibt es da noch was anderes
zu beachten?
Grüße
Chris
Christoph R. schrieb:> Wenn ich nun einfach die LED nicht nutze (initialisieren aber nicht> schalten), funktioniert alles wunderbar.> Was stimmt mit diesem Pin nicht?
Poste doch mal deinen Code
Herbert schrieb:> Christoph R. schrieb:>> Wenn ich nun einfach die LED nicht nutze (initialisieren aber nicht>> schalten), funktioniert alles wunderbar.>> Was stimmt mit diesem Pin nicht?>> Poste doch mal deinen Code
Hi Herbert,
Ich habe versucht die wichtigen Codestellen zu extrahieren:
defines:
Christopher B. schrieb:> Offensichtlich hast du einen Debugger angeschlossen. Kannst du nicht> einfach anhalten wenn er sich aufhaengt?
Hi Christopher,
ja, hätte ich tun können... irgendwie vergessen :D ... danke für den
Tipp,
Somit bin ich zumindest schonmal soweit, dass ich weiß, wo es hängt:
In einer while-Schleife in meinem Programm:
1
...
2
/* wait for start */
3
while((1==GPIO_READBIT(GPIOC->IDR,GPIO_Pin_0))
4
&&(true==bIsRunning));// wird aus dem Timeout value abgeleitet (siehe code Schnipsel im vorherigen Post)
5
...
Er kommt niemals aus dieser while-Schleife heraus, da die Timeout
Variable im Systick dekrementiert wird, der aber hängt und nicht mehr
läuft.
Was kann wohl dazu führen, dass der PD2 meinen Systick stoppt?
Danke und Grüße
Chris
Servus,
ich muss bei deinen Programm ein paar Anmerkungen machen. Du schreibst
defines für deine Pins nutzt die aber nicht im Programm. Das ist nicht
so schlau.
Von deinen Codeschnipsel wird keiner schlau. Schau dir doch einfach die
Variablen im Debbugmodus an. Es gibt nur zwei Variablen warum du in
dieser Schleife verhaarst, aber unendlich viele für den
HardFault_Handler() Fehler.
mfg
aSma>> schrieb:> Servus,> ich muss bei deinen Programm ein paar Anmerkungen machen. Du schreibst> defines für deine Pins nutzt die aber nicht im Programm. Das ist nicht> so schlau.>>
Hi aSma
keine Sorge, ich nutze alle GPIOs die ich initialisiere. Mein gesamter
Code wäre einfach zu lang, um hier alles zu posten (irgendwas ~1000
codezeilen)
In meinem Code nutze ich GPIO_SetBits/GPIO_ResetBits und GPIOx->BSRR/BRR
nur für GPIOs die ich häufig nutze. Das Verhalten ist bei beiden
identisch.
> weiterhin, diese Funktion kenne ich aus SPL nicht:>
> Von deinen Codeschnipsel wird keiner schlau. Schau dir doch einfach die> Variablen im Debbugmodus an. Es gibt nur zwei Variablen warum du in> dieser Schleife verhaarst, aber unendlich viele für den> HardFault_Handler() Fehler.
Habe mir alle Variablen angeschaut und sie passen auch, - lediglich der
systick läuft nimmer.
Grüße
Chris
Christopher B. schrieb:> Dann kannst du ja auch in den Peripherie Registern nachschauen, ob der> Systick noch zählt?! (Adresse 0xE000E018)
Hallo Christopher,
Ich nutze die CooCox IDE (basiert auf Eclipse) und habe da auf die
Schnelle nicht gefunden, wo man in den Speicher schauen kann. Also habe
ich eine kleine Funktion hinzugefügt, die mir den systick liefert...
usw... lange Rede kurzer Sinn: sobald ich nur den Code (siehe unten) bei
mir in der Datei über der Fehlerhaften Funktion einfüge (also ohne ihn
auszuführen), geht alles ohne zu stoppen. Ich denke also, dass ich es
irgendwie hinbekommen habe, dass mir irgendwo der Speicher zerschrieben
wird oder ähnlich doofes.
Christoph R. schrieb:> void SysTick_Handler(void)> {> ...Timeout value dekrementieren..> }
Das hier hört sich nach einen Überlauf an. Es ist besser eine Variable
laufen zu lassen und mit Modulo zu arbeiten.
Du musst deinen Debugger besser kennen lernen. Beim CooCox im Reiter
!View kannst du Peripharals anmachen. Dort kannst du alle möglichen
Register sehen.
Wie groß ist dein Programmsize?
mfg
aSma>> schrieb:> Christoph R. schrieb:>> void SysTick_Handler(void)>> {>> ...Timeout value dekrementieren..>> }>> Das hier hört sich nach einen Überlauf an. Es ist besser eine Variable> laufen zu lassen und mit Modulo zu arbeiten.>> Du musst deinen Debugger besser kennen lernen. Beim CooCox im Reiter> !View kannst du Peripharals anmachen. Dort kannst du alle möglichen> Register sehen.>> Wie groß ist dein Programmsize?>> mfg
Hi aSma,
Das mit dem Überlauf sollte nicht passieren, da ich sowas "detektiere"
1
if(0<dwRcvTimer)
2
{
3
if(1==dwRcvTimer)
4
{
5
bIsRunning=false;
6
}
7
dwRcvTimer--;
8
}
ah, das mit den Peripherals ist ein guter Hinweis, danke!
Mein Programm:
Übrigens:
> (habe auch mal den TIM3_IRQHandler mit>Breakpoint versehen, - ohne Resultat).
Das ist kein Beweis, dass der Timer nicht in Benutzung ist. Er muss ja
nicht notwendigerweise einen Interrupt auslösen.
Kannst Du nicht den Sourcecode durchsuchen, oder disassamblieren,
oder...)?
PG-For schrieb:> Übrigens:>>> (habe auch mal den TIM3_IRQHandler mit>>Breakpoint versehen, - ohne Resultat).>> Das ist kein Beweis, dass der Timer nicht in Benutzung ist. Er muss ja> nicht notwendigerweise einen Interrupt auslösen.>> Kannst Du nicht den Sourcecode durchsuchen, oder disassamblieren,> oder...)?
Hi PG-For,
disassemblieren habe ich auch schon gemacht... aber da schaue ich wie
ein Schwein in Uhrwerk.
Beim reinen Sourcecode des Programms bin ich recht sicher, dass der TIM3
nicht genutzt wird... allerdings weiß ich nicht, was die Cocoox
stm32-libraries so tun, - könnte schon sein, dass die irgendwo etwas
seltsam initialisieren.
Grüße
Chris
Guten Abend,
habe den Thread gerade erst entdeckt - daher die Verzögerung.
Im ersten Code(-Schnipsel) schaltest Du den Takt für
GPIO_A, GPIO_B und GPIO_D ein. Das sind die Ausgänge.
GPIO_C - Dein Eingang, den Du lesen willst - hast Du
nicht mit Takt versorgt (ich konnte in Deinem Code nix finden).
---
Ich vermute, ohne Takt veweigert Dein Eingangspin die
Zusammenarbeit. Du schriebst, es hängt beim lesen ...
Viel Erfolg
Martin
Hallo Zusammen,
es war am Ende gar nicht der Code, sondern der fehlende Anschluss der
Versorgungs- und Massepins der IO-Ports (also Vss und so). Die STM32
library für Eagle hat scheinbar beim STM32f103 RBT6 einen kleinen
Fehler, - die Pins werden irgendwie nicht automatisch geroutet (wie zB
bei allen anderen STM32ern).
Danke euch Allen für die Hilfe und das Mitdenken!
Grüße
Chris