STM32F4 Timer Interrupt

Gast #4761834
Lesenswert?

Hallo zusammen,

ich muss an zwei GPIOs die Siagnale decodieren (siehe Bild).
Meine Idee wäre das mit einem Timer zu realisieren. Bei steigender 
Flanke würde der Timer anfangen zu zählen und in der Mitte würde immer 
ein Interrupt auslösen um die beiden GPIO-Werte zu holen. Die Daten 
liegen mit einer Geschwindigkeit von 500kHz an den GPIOs an.

Die frage ist wie der Timer konfiguriert werden muss. Hat jemand eine 
Idee?

Grüße Dennis
Angehängte Dateien:
(Firma: TU Darmstadt) #4761957
Lesenswert?

Vermutlich lauft der Takt des GPIO Signales asynchron zum Prozessortakt. 
Nach Shannon musst Du dann mindestens 2 mal pro Takt abtasten. Also 
setzt Du eine Timer, der Dir mindestens zwei Interrupts pro Takt erzeugt 
und wertest in der Interruptroutine entsprechend aus.

Was erzeugt diese komischen Signale?
Gast #4762155
Lesenswert?

Ich fasse mal zusammen:
-Ein freilaufender Timer der alle 666ns auslöst um die Siganel zweimal 
abzutasten.
-Der Timer wird über einen externen Interrupt (EXTI#) gestartet.

Ist es möglich das alles in einem Timer zu vereinen, ohne den (EXTI#) zu 
benutzen?
Gast #4762201
Lesenswert?

Ich muss aber irgendwann zu beginn bei der aller ersten Flanke den timer 
starten, bzw den Counter reseten.
Es kann auch vorkommen, dass sich die Zeiten einwenig ändern. Dann wäre 
es hilfreich irgendwie nach zu trimmen. Ich müsste ab und zu bei einem 
Flankenwechsel den Timer reseten.
(Firma: TU Darmstadt) #4762582
Lesenswert?

Gpio1 startet TimA. TimA->ARR gesetzt fuer Ueberlauf alle 666ns. 
TimA->CNT vorbesetzt mit 333ns (Periode/2) . TimA UpdateEvent sampelt 
GPIO1/2. DMA ist fuer 40 Samples gesetzt. Dma Full Transfer stoppt 
Datenaufnahme, startet Auswertung und setzt TimA->CNT wieder auf 
Periode/2.

Damit hast du den Samplepunkt in der Mitte des Taktpulsfensters und 335 
ns Platz fuer Ablage zwischen Sensor- und Auslesetakt.
Gast #4763148
Lesenswert?

Ich habe ein Problem mit DMA, es wird immer der transfer error interrupt 
flag "CTEIF0" ausgelöst.
1
HAL_DMA_Start_IT(&hdma_tim3_ch4_up, (uint32_t)&GPIOC->IDR, uint32_t)&gSamples[0], GSAMPLES_SIZE);
2

3
__HAL_TIM_ENABLE_DMA(&htim3, TIM_DMA_UPDATE);
4

5
/* DMA: Clear Interrupt FLAG */
6
__HAL_DMA_CLEAR_FLAG(&hdma_tim3_ch4_up, DMA_FLAG_TCIF0_4);
7

8
HAL_TIM_Base_Start_IT(&htim3);
Gast #4765663
Lesenswert?

anbei befindet sich mein code und das STM32CubeMX project file.

Ich habe mir ein einfaches Programm geschrieben, das bei jeder 
steigender Flanke am GPIO PA0 über DMA den Register Inhalt von 
GPIOC->IDR in die Variable gSamples speichert.
Nur leider wird immer das transfer error interrupt flag "CTEIF0" bei 
steigender Flanke ausgelöst.
Angehängte Dateien:
(Firma: TU Darmstadt) #4766682
Lesenswert?

Doch, das muss gehen!

Bist Du systematisch vorgegangen?
- Kannst Du Tim2 wie gewollt starten?
- Gehen andere DMA Transfers?
- Stimmen die tatsaechlichen Registerwerte mit den erwartetet Werte 
ueberein?

Vielleicht finde ich Zeit mit Nut/OS SVN Trunk ein Beispiel zu 
programmieren:

- Usr Taster (PA0) startet TIM2
- Tim2 UE sampelt GPIOC->IDR 100 mal
- DMA TC stoppt Timer.
(Firma: TU Darmstadt) #4768232
Lesenswert?

Beim F4 liegen die GPIO auf dem AHB1 Bus. Nur DMA2 kann einen AHB1 <-> 
Memory (Memory-to-Memory) Transfer machen. Du brauchst also Timer, die 
DMA2 benutzen, um GPIO DMA Transfers mit dem Timer zu triggern.
Das Programm oben  läuft auf einem Nucleo-F411, mit einem Jumper von 
PC13, dem blauen User Button nach PB10 ( TIM1_CH1, Arduino D7). Ich habe 
4 Transfers programmiert. Ich benutze die fallende Flanke, da der 
Userbutton mit einem Kondensator gebrückt ist, und unterschiedliche 
Triggerpegel bei der steigenden  Flanke eine Verzögerung zwischen Taster 
und Logikanalysator vorgaukeln. Der Userbuttom ist Kanal 0, die 
steigende Flanke ist der Abtastzeitpunkt fuer den GPIO und schaltet 
PB11/TIM1_CH2 high. Mit jedem Tastendruck gibt es die angezeigte 
Sequenz.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren