Hey, ich hab mal ne Frage zum Arduino M0 Pro, bzw. dem Atmel SAMD21.
Ich habe den Arduino M0 Pro, bei welchem laut Specs der SAMD21 mit 48
MHz läuft.
Allerdings benutze ich das Board mit Atmel Studio und ohne irgendwelche
Arduino Libraries.
Muss ich nun die Chipfrequenz in einem Register oder per Fuse
einstellen, um den SAMD21 mit 48 MHz zu betreiben oder wie wird das
geregelt?
Mit freundlichen Grüßen
Lukas V. schrieb:> Muss ich nun die Chipfrequenz in einem Register oder per Fuse einstellen
Ja. Standardmäßig läuft er vom internen RC-Oszillator, wimre mit 2 MHz.
Möchte generell alles selber programmieren, aber für den Fall, wenns
einfacher wäre, würd ich auch ASF nutzen. Das ist aber parallel möglich?
Also dass man nur die ASF Module nutzt die man braucht und sonst alles
selber macht?
Jörg W. schrieb:> Lukas V. schrieb:>> Muss ich nun die Chipfrequenz in einem Register oder per Fuse einstellen>> Ja. Standardmäßig läuft er vom internen RC-Oszillator, wimre mit 2 MHz.
Okay, darf ich so dreist sein und fragen, wie ich das mache? Meine
Google-Suchen waren bis jetzt sehr erfolglos.
Lukas V. schrieb:> Okay, darf ich so dreist sein und fragen, wie ich das mache?
Du musst dir als erstes mal Gedanken um die komplette Taktversorgung
deines Chips machen.
Hier mal ein Ausschnitt aus einer Software, die den SAML21 benutzt:
Starte im Atmel Studio einfach ein neues Projekt, und waehle deinen
richtigen Chip aus. Dann sollte es in main() schon eine Funktion
init_irgendwas() geben. Da drin passiert alles noetige. Da musst du
eigentlich nichts mehr einstellen. Da findest du dann auch irgendwo die
Settings fuer die PLL. Vielleicht fined ich dazu ja noch was, ich such
mal.
Das ASF kannst du benutzen, dann bist du aber auf C "festgenagelt". Beim
erstellen eines ASF-Projektes kommt eine Warnung, dass das mit C++
moeglicherweise nicht mehr wie angedacht funktioniert.
Ausserdem hast du beim ASF das Problem, das da teilweise globale
Variablen drin sind, die aber nicht static sind.
Preisfrage:
Mal angenommen im ASF gibt es eine globale, nicht statische Struktur mit
dem Namen "USB_Descriptor". Wie gross ist die Wahrscheinlichkeit, das
ein Entwickler eine USB anwendung hat, und eine Struktur fuer den
USB-Descriptor ebefalls "USB_Descriptor" nennt?
Ja, ueber genau sowas sind wir bei meinem alten Arbeitgeber gestolpert.
Und in C faellt das nicht unbedingt sofort auf, ausser das dein Programm
nicht das macht, was du gerne haettest. Dazu hatte ich hier auch mal
einen Thread aufgemacht, um das Verhalten zu verstehen:
Beitrag "GCC: Welches (globale) Symbol nimmt der Compiler bei gleichem Namen und Typ?"
Die Funktion, die von Atmel zur verfuegung gestellt wird muesste
system_init() heissen, und sollte bei einem neuen Projekt automatisch in
der main() stehen.
@Jörg Ja, dass da noch einiges mit dranhängt, war mir bewusst. Ich hatte
natürlich gehofft, dass es eine recht simple "Standardlösung" gibt. Aber
dann heißt es wohl, tiefer in die Materie einzudringen :)
@Kaj Hmm, im Atmel Studio ist in der main automatisch ein
Funktionsaufruf "SystemInit();"
Dort steht aber nichts von PLL, sondern es wird nur eine Variable
uint32_t SystemCoreClock = __SYSTEM_CLOCK gesetzt, wobei __SYSTEM_CLOCK
auf 1000000 defined ist.
Lukas V. schrieb:> @Kaj Hmm, im Atmel Studio ist in der main automatisch ein> Funktionsaufruf "SystemInit();"> Dort steht aber nichts von PLL, sondern es wird nur eine Variable> uint32_t SystemCoreClock = __SYSTEM_CLOCK gesetzt, wobei __SYSTEM_CLOCK> auf 1000000 defined ist.
Ich kann dir leider nicht sagen, wie das aktuell in Atmel Studio
aussieht :(
Mein Wissen ist da auch schon wieder gut 1,5 Jahre alt.
Bei mir sah das noch so aus:
* \brief Initialize clock system based on the configuration in conf_clocks.h.
35
*
36
* This function will apply the settings in conf_clocks.h when run from the user
37
* application. All clock sources and GCLK generators are running when this function
38
* returns.
39
*
40
* \note OSC8M is always enabled and if user selects other clocks for GCLK generators,
41
* the OSC8M default enable can be disabled after system_clock_init. Make sure the
42
* clock switch successfully before disabling OSC8M.
43
*/
44
voidsystem_clock_init(void)
45
{
46
...
47
}
Und irgendwo da, in den Untiefen des ASF, passierte dann die ganze
magic. Da gab es bei uns auch noch ein paar Probleme: Hat man bei der
Config irgendwas versaut, ist man in einer endlosen Rekursion beim
Clock-Init gelandet => Stack Overflow. Ja, das ASF ist schon toll...
kann einem viel Arbeit abnehmen, kann einem aber auch den letzten Nerv
rauben. :D
Wäre schön, die Bilder hier zu posten statt Links auf einen Imagehoster
zu setzen. Wenn in einem oder zwei Jahren jemand diesen Thread findet,
ob dann die Links noch passen? Die Bilder hier werden dann jedenfalls
noch da sein.
Freut mich, dass du dein Problem gelöst hast. Einen opensourcefähigen
Startup-Code, der die DFLL bedient, hätte ich im Moment nicht parat
gehabt.
Vorsicht mit dem NVM und dem Bootloader. Der muss vorher richtig
konfiguriert werden. Sonst lässt sich der Clock nicht umstellen. Das
Problem wurde hier schon Diskutiert.