Hi,
Ich sehe gerade nicht wie ich ein Register manipuliere, wobei
ich nur Zugriff auf eine Instanz (htim2) habe. Was ich versucht habe
ist:
1
htim2.Instance->EGR=(uint16_t)(1<<6)|(uint16_t)(1<<4);//Set TG=Trigger generation active and CC4G = Campture compare 4 event
Aber wenn ich EGR vor und nach diesem Codeabschnitt auslese, dann bleibt
EGR immer Null. Wie genau manipuliere ich die Register, wenn ich nur
Zugriff auf die Instanz habe?
Bert S. schrieb:> Aber wenn ich EGR vor und nach diesem Codeabschnitt auslese, dann bleibt> EGR immer Null.
Normal. EGR ist ein Write-Only-Register. Da kommt beim Zurücklesen immer
nur 0 raus.
Der Kommentar an deiner Code-Zeile ist aber verdächtig - das Register
schaltet nichts ein oder aus, sondern löst Ereignisse aus, die
normalerweise per Hardware ausgelöst werden. Normalerweise braucht man
das Register eher nicht...
Bert S. schrieb:> Aber wenn ich EGR vor und nach diesem Codeabschnitt auslese, dann bleibt> EGR immer Null.
Ist ja auch logisch, weil Du nur ein struct manipulierst, was das
Register repräsentiert, aber nicht mit ihm identisch ist.
> Wie genau manipuliere ich die Register, wenn ich nur> Zugriff auf die Instanz habe?
Indem Du danach eine passende API-Funktion aufrufst.
Übrigens solltest Du das direkte Rumgefummel mit Bits lassen und
stattdessen die passenden Bitmasken-Defines verwenden, weil Dein Code
sonst unwartbar wird.
Bert S. schrieb:> Was ich möchte ist, dass der Timer2 Channel 4 den ADC1 auslöst> (über DMA> einlesen).
Ah. Über EGR kannst du nur den ADC sofort auslösen. Um den Timer den
ADC automatisch auslösen zu lassen, musst du die CCMR, CCER, CCR1
Register sowie das MMS Feld im CR2 Register setzen und den ADC
entsprechend konfigurieren.
Nop schrieb:> Ist ja auch logisch, weil Du nur ein struct manipulierst, was das> Register repräsentiert, aber nicht mit ihm identisch ist.
Naja, das struct ist mit den Bus-Adressierbaren Daten identisch.
Allerdings enthält das EGR nur "temporäre" Signale - man schreibt z.B.
das "UG" bit auf 1, dadurch wird der Timer auf 0 gesetzt, aber das Bit
wird nicht als 1 gespeichert weil der Timer ja nicht ständig resettet
werden soll, sondern nur 1x. Es wird eben eine Aktion sofort
ausgelöst, aber nichts gespeichert.
Nop schrieb:> Übrigens solltest Du das direkte Rumgefummel mit Bits lassen und> stattdessen die passenden Bitmasken-Defines verwenden, weil Dein Code> sonst unwartbar wird.
Das ist mir eigentlich schon klar, jedoch habe ich keine Ahnung, wie
genau ich auf die Registernamen zugreifen kann? Ich verwende die AC6
Toolchain und die Eclipse IDE mit den HAL Libraries.
Bert S. schrieb:> Das ist mir eigentlich schon klar, jedoch habe ich keine Ahnung, wie> genau ich auf die Registernamen zugreifen kann?
Einfach hinschreiben?
1
htim2.Instance->EGR=TIM_EGR_TG|TIM_EGR_CC4G;
Eventuell musst du noch ein
1
#include<stm32f303k8.h>
hinzufügen (oder so ähnlich, schau mal was da im Projekt ist).
Wenn du die HAL nutzt brauchst du eigentlich auch gar keine direkten
Registerzugriffe, die HAL hat für sowas alles Funktionen.
Dr. Sommer schrieb:> Wenn du die HAL nutzt brauchst du eigentlich auch gar keine direkten> Registerzugriffe, die HAL hat für sowas alles Funktionen.
Genau. In diesem Fall:
HAL_TIM_GenerateEvent aus der stm32f3xx_hal_tim.c
pegel schrieb:> Ich denke du gehst die Sache viel zu kompliziert an.> Schau einfach in das Beispiel ADC_TriggerMode in der HAL Lib.
Ok, werde mir das mal ansehen, danke.
pegel schrieb:> Ich denke du gehst die Sache viel zu kompliziert an.> Schau einfach in das Beispiel ADC_TriggerMode in der HAL Lib.
Das Beispiel ist leider nur mit dem Interrupt und ohne wählen eines
spezifischen Channels. Ich müsste aber den ADC mit DMA triggern, und nur
wenn CH4 in der hälfte der Periode des Timers ist.
Ok, ich glaube ich habe es fast, was ich aber noch nicht genau sehe ist,
was der Pulse(32 bit value), siehe Bild 1, genau ist? Ist das der
Startwert? Wenn ja, wo muss ich den Auslöser für den output compare
setzten?