Hallo zusammen,
Ich sitze vor einem großen Problem.
Und zwar möchte ich Pulslängen-codierte Daten aus einem STM32F1 senden.
Dazu nutze ich den Timer1 und einen DMA, welcher den Timer befeuert.
Damit die Datenleitung im Ruhezustand auf 0 steht, wird nach dem Senden
der Daten der Timer in den Singe-Mode versetzt und die Pulslängen-werte
des DMA-Puffers auf 0 gesetzt. Der Timer schiebt dann noch einmal
0-Pulse raus (also kein Puls) und stopt dann. Soweit so gut, das
Funktioniert. Der Code ist zwar ziemlich umfangreich mittlerweile aber
das ist ja fast schon normal.
Nun mein Problem ist, dass ich festgestellt habe, dass die Datenleitung
hin und wieder (etwa in 50% der Fälle) nach dem Stop des Timers (also
nachdem die 0-Pulse gesendet wurde) auf high-level springt. Das sind die
Pins PA8 und PA9 (TIM1_CH1 und TIM1_CH2).
Jetzt habe ich folgendes festgestellt und hier sehe ich nurnoch Voodoo:
In der Hauptschleife schalte ich eine LED zu debug-zwecken an und aus.
Die LED hängt an Pin PB12. Steuere ich die LED direkt durch manipulation
des entspechenden Bits in GPIOB->OCR gibts kein Problem.
Schalte ich sie mit "GPIOB->BRR = GPIO_Pin_12;" bzw. "GPIOB->BSRR =
GPIO_Pin_12;" dann schaltet bei jedem 2. Zugriff auf eines der beiden
Register meine Datenleitung nach der Datenübertragung auf highlevel.
Ganz einfach und reproduzierbar zu testen ist das folgensermaßen
(gekürzter Code):
1 | ...
|
2 | int main( void )
|
3 | {
|
4 | init();
|
5 | GPIOB->BRR = GPIO_Pin_12;
|
6 | sendeDaten();
|
7 | // Datenleitung springt auf highlevel
|
8 | }
|
1 | ...
|
2 | int main( void )
|
3 | {
|
4 | init();
|
5 | GPIOB->BRR = GPIO_Pin_12;
|
6 | GPIOB->BRR = GPIO_Pin_12;
|
7 | sendeDaten();
|
8 | // Datenleitung bleibt auf lowlevel
|
9 | }
|
Kann mir jemand auch nur eine Idee liefern, was hier der Knoten sein
kann?
Ich stehe langsam am Ende meiner Geduld (mein Verständnis über die
Funktionsweise des STM ist damit seit dem Voodoo überfordert). Leider
muss ich das Problem aber lösen, sonst gibt's haue von den Vorgesetzten.
Ich bin dankbar für jeden Rat und jede Idee.
Vielen Dank