- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 32

Thema: SMT32 - Ports konfigurieren, Frage zur C-Syntax

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Unregistriert
    Gast
    Zitat Zitat von White_Fox Beitrag anzeigen
    Jetzt hab ich mal aus Spaß einfach die letzten beiden Zeilen meines Vorposters stumpf in die main-Funktion kopiert. Wider Erwarten kommt keine Fehlermeldung was mich jetzt wiederum zu der Frage führt: Brauch ich die GPIO-Dateien um die Pins wackeln zu lassen? (Offenbar ist dem ja aber so.) Wenn ich die GPIO-Bibliothek dafür nicht brauche, wofür sind die dann gut?

    Edit:
    Gemeint ist natürlich die stm32f4xx_gpio.h.

    Habe mich vielleicht ein bisschen unklar ausgedrückt:

    Die stm32f4xx_gpio.h brauchst Du nur, wenn Du die - meiner Meinung nach abgrundtief schlechte - ST-Library nutzt. Dann musst Du diesen ganzen Unsinn mit dem Strukturen-Füllen machen.

    Wenn Du aber die Register direkt beschreibst, dann kannst Du die ganzen anderen Includes weglassen. Ausschließlich die Definitionen aus der stm32f446xx.h sind nötig, damit Du die Register und Bits mit Namen ansprechen kannst.
    Für den reinen Cortex-Kern kannst Du noch die CMSIS-Header einbinden.

    Bei meinen Projekten mache ich es grundsätzlich so:
    Von ST nutze ich:
    - stm32f446xx.h
    - Die CMSIS-Includes (also die core_cm4.h includen)
    - startup_stm32f446xx.s (Hier stehen die Deklarationen für die Interrupthandler drin sowie der Assemblercode für die Initialisierung der statischen Variable, etc.)

    Das war es auch schon.
    Die Initialisierung der MCU mache ich komplett selber.
    In der startup_stm32f446xx.s wird zuerst die Funktion SystemInit aufgerufen, danach dann die Funktion main.

    In der von mir erstellten Funktion SystemInit initialisiere ich die MCU. Also zuerst aktiviere ich die Caches, konfiguriere den Prefetch und die Waitstates.
    Anschließend konfiguriere ich die PLLs und schalte auf die entsprechende Taktquelle (meistens HSE, entweder extern -> Nucleo oder Quarz) um.

    Ob man dann die Peripherie wie GPIOs, Timer, Systick, etc. in der SystemInit konfiguriert oder erst später, ist dann Geschmackssache.

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Ah ja...vielen Dank, jetzt ist mir Einiges schon viel klarer, ein paar Feagen hab ich aber noch.

    Was ist eigentlich die genaue Funktion des Output-Speed-Registers? Ich werd da aus dem Datenblatt nicht schlau, kann aber auch daran liegen daß ich immer noch mehr oder weniger in meiner AVR-Denke drinhänge und imemr wieder staune, um welchen Mist man sich beim ARM kümmern muß.
    Muß ich das Speed-Register eigentlich beschreiben oder wird sich auch so etwas tun?

    Ich muß ja, soweit ich das mitbekommen habe, den Port noch irgendwie an einen Bus anbinden. Nach was richtet man sich da, woher weiß ich wie ich da den Port am besten wo anbinde? Wie geht man da vor allem vor, wenn man etwas mehr Peripherie verwendet?

    Kann meinen Code leider nicht testen, weil ich Embedded Studio nicht mit dem J-Link zusammenkriege.
    J-Link Commander hat aber seltsamerweise keine Probleme mit dem J-Link zu quatschen.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stm32f446xx.h>
    
    /*********************************************************************
    *
    *       main()
    *
    *  Function description
    *   Application entry point.
    */
    void main(void) {
    GPIOA->MODER |= (GPIO_MODER_MODER5_0);    //A5 => Ausgang
    GPIOA->OTYPER |= (GPIO_OTYPER_OT_5);      //A5 0> OpenDrain
    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5);     //A5 ohne Pullup-Pulldown
    }

  3. #3
    Unregistriert
    Gast
    Der Output-Speed ist für die Schaltflanken der IOs zuständig.
    Er kontrolliert also die Slew-Rate (also die Anstiegs- und Abfallzeit der Flanken).
    Je größer die Anstiegszeit, desto größer sind die abgestrahlten Störsignale. Daher sollte man den Output Speed nur so schnell wie nötig konfigurieren.

    Das Speed-Register musst Du übrigens nicht beschreiben, nach dem Reset ist die Default-Einstellung 00 (also Low speed). Nur Port B ist da eine Ausnahme.

    Die Komplexität hat übrigens nichts mit dem ARM-Kern zu tun. ST hätte auch Simpel-Peripherie wie beim AVR an den Cortex anbinden können. Aber das wäre doch Verschwendung

    Was Du mit "Bus-Anbinden" meinst, verstehe ich nicht. Der Port läuft nach dem Reset sofort (bis auf die paar Ausnahmen wie JTAG, etc.). Du musst nur den Takt für den entsprechenden Port einschalten, wie auch für jede andere Peripherie.
    Also z.B. für Port A:
    Code:
    RCC->AHB1ENR |= ( RCC_AHB1ENR_GPIOAEN );
    Danach kannst Du dann ganz normal Bits setzen oder zurücksetzen:
    Code:
    GPIOA->BSRR |= GPIO_BSRR_BS_0;
    oder
    Code:
    GPIOA->BSRR |= GPIO_BSRR_BR_0;
    Oder meinst Du das Umlegen der Peripherie-Funktionen auf andere Pins über das AFR-Register?



    Zitat Zitat von White_Fox Beitrag anzeigen
    Ah ja...vielen Dank, jetzt ist mir Einiges schon viel klarer, ein paar Feagen hab ich aber noch.

    Was ist eigentlich die genaue Funktion des Output-Speed-Registers? Ich werd da aus dem Datenblatt nicht schlau, kann aber auch daran liegen daß ich immer noch mehr oder weniger in meiner AVR-Denke drinhänge und imemr wieder staune, um welchen Mist man sich beim ARM kümmern muß.
    Muß ich das Speed-Register eigentlich beschreiben oder wird sich auch so etwas tun?

    Ich muß ja, soweit ich das mitbekommen habe, den Port noch irgendwie an einen Bus anbinden. Nach was richtet man sich da, woher weiß ich wie ich da den Port am besten wo anbinde? Wie geht man da vor allem vor, wenn man etwas mehr Peripherie verwendet?

    Kann meinen Code leider nicht testen, weil ich Embedded Studio nicht mit dem J-Link zusammenkriege.
    J-Link Commander hat aber seltsamerweise keine Probleme mit dem J-Link zu quatschen.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stm32f446xx.h>
    
    /*********************************************************************
    *
    *       main()
    *
    *  Function description
    *   Application entry point.
    */
    void main(void) {
    GPIOA->MODER |= (GPIO_MODER_MODER5_0);    //A5 => Ausgang
    GPIOA->OTYPER |= (GPIO_OTYPER_OT_5);      //A5 0> OpenDrain
    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5);     //A5 ohne Pullup-Pulldown
    }

Ähnliche Themen

  1. Syntax-Frage -> writeString(char *string)
    Von Furzgas im Forum Robby RP6
    Antworten: 13
    Letzter Beitrag: 31.12.2009, 08:06
  2. Frage zum Ansteuern von Ports/Programmierfrage
    Von Geimel im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 26.01.2007, 22:29
  3. Kurze Syntax Frage
    Von Brantiko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 18.01.2007, 18:58
  4. Frage zum Programmieren der Ports
    Von Geimel im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 07.08.2006, 19:29
  5. kleine Frage zur Syntax
    Von freddy0815 im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 07.02.2005, 14:19

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad