- Labornetzteil AliExpress         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 34 von 34

Thema: Für lange Winterabende....

  1. #31
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Also...ich hab meinen ersten STM32-Erfolg eingefahren. Die grüne LED auf dem Nucleo-Board leuchtet.

    Als IDE hab ich das Embedded Studio von Segger verwendet, ich programmiere mit dem J-Link- Für den nucleo-eigenen STLink gibts was zum draufflashen, damit der auch als J-Link dient. Die Hardware besteht aus einem Nucleo-64-Board mit einem STM32-F446RE.

    Zuerst hab ich das entsprechende Package (STM32-F4xx) installiert. Embedded Studio hat einen sog. Package-Manager, der das bewerkstelligt. Im Package sind die notwendigen Bibliotheken enthalten. Danach war erstmal Datenblattlesen dran. Wichtig ist die "STM32F446 Reference". Dort werden fast alle notwendigen Register erklärt die benötigt werden, um die Ports zu konfigurieren. Hier lauern auch schon die ersten Fallen. Die Peripherie (dazu zählen auch die Ports) müssen noch an die Taktversorgung angeschlossen werden, sonst tut sich nix. Dies muß übrigens auch noch VOR der eigentlichen Registerkonfiguration geschehen. Die zweite Falle ist: Das Bit für die LED soll, wie ich von einem freundlichen USer erfahren habe, besser NICHT über das output-Data-Register (ODR) geschehen, sondern über BSRR.

    Der entsprechende Thread ist hier:
    https://www.roboternetz.de/community...e-zur-C-Syntax

    Noch ein Tip zur Entwirrung:
    Embedded Studio erstellt sofort ein kleines "Hello-World-Projekt zum Einstieg für euch. Im Prinzip ist das eine Schleife, in der eine Variable n 100-mal hochgezählt und zusammen mit einem "Hello World" ausgegeben wird. Die Ausgabe geschieht mit einer Funktion printf();
    Nun ist das Nucleo-Board ja nur mit ner lumpigen LED und nem Taster ausgerüstet und nicht mit einem LCD oder so. Die printf()-Funktion sendet die Daten über den J-Link an den Debugger. Der gesendete Inhalt wird in einem kleinen Fenster unten in der Mitte angezeigt. Zum Fehlersuchen wird das später bestimmt sehr nützlich.

    Das ist der Code von meinem ersten Programm:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stm32f446xx.h>
    
    void main(void) {
      RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;      //Taktversorgung Port A
      GPIOA->MODER |= (GPIO_MODER_MODER5_0);    //A5 => Ausgang
      GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_5);     //A5 0> Push-Pull
      GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5);     //A5 ohne Pullup-Pulldown
    
      printf("Einstellung fertig\n");
    
      GPIOA->BSRR |= GPIO_BSRR_BS_5;            //Ausgang A5 setzen
     
      printf("LED gesetzt\n");
    
      while(1){
      }
    }

  2. #32
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Mein zweites Programm. Dieses Mal wird noch der Button mit einbezogen.
    Die LED wid eingeschaltet, solange der Knopf gedrückt ist.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stm32f446xx.h>
    
    void configLed(){
      RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;      //Taktversorgung Port A
      GPIOA->MODER |= (GPIO_MODER_MODER5_0);    //A5 => Ausgang
      GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_5);     //A5 0> Push-Pull
      GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5);     //A5 ohne Pullup-Pulldown
    }
    
    void configButton(){
      RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;      //Taktversorgung Port C
      GPIOC->MODER |= GPIO_MODER_MODER0_0;      //C13 => Eingang
      GPIOC->PUPDR |= GPIO_PUPDR_PUPDR13_1;     //C13 => Pulldown einschalten
    }
    
    void main(void) {
      configLed();
      configButton();
      printf("Einstellung fertig\n");
    
      while(1){
        if(!(GPIOC->IDR & GPIO_IDR_IDR_13)){
          GPIOA->BSRR |= GPIO_BSRR_BS_5;            //Ausgang A5 setzen
          printf("Knopf gedrückt\n");
        }
        else{
          GPIOA->BSRR |= (GPIO_BSRR_BR_5);          //Ausgang A5 zurücksetzen
          printf("Knopf nicht gedrückt\n");
        }
      }
    }

    Edit:
    Noch eine Frage...gibt es in C eigentlich die Möglichkeit, ein Bit direkt zu kopieren? In Pseudocode ausgedrückt:
    Code:
    PA5 == PC13;
    Sodaß ich mir das If-Statement sparen könnte.
    Geändert von White_Fox (19.06.2016 um 15:19 Uhr)

  3. #33
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo,

    Code:
    GPIOA->BSRR |= (GPIO_BSRR_BR_5);          //Ausgang A5 zurücksetzen
    Müsste lauten:

    Code:
    GPIOA->BSRR &= ~(GPIO_BSRR_BR_5);          //Ausgang A5 zurücksetzen
    Noch eine Frage...gibt es in C eigentlich die Möglichkeit, ein Bit direkt zu kopieren?
    Nur wenn du die Ports als Bitfelder definierst.
    Allerdings spielen dann noch einige compilerspezifische Dinge mit rein.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #34
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Sicher? Immerhin funktioniert der Code klaglos.

    Code:
    GPIOA->BSRR |= GPIO_BSRR_BS_5;            //Ausgang A5 setzen
    Code:
    GPIOA->BSRR |= (GPIO_BSRR_BR_5);          //Ausgang A5 zurücksetzen
    Ich hatte das jetzt als "Bit rücksetzen" interpretiert. Ob das auch funktioniert wenn ich eine 0 ins BS-Register schreibe probiere ich gleich mal aus...


    Edit:
    Nein, das funktioniert nicht. Das wird zwar ohne Klagen kompiliert, die LED geht dann aber nicht mehr aus.
    Geändert von White_Fox (19.06.2016 um 20:46 Uhr)

Seite 4 von 4 ErsteErste ... 234

Ähnliche Themen

  1. Zeichenroutine dauert zu lange
    Von avrrobot im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 08.03.2012, 20:33
  2. Lange Leitung - oder was?
    Von manu418 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 13.10.2010, 16:09
  3. Lange Leiterbahn abschliessen ?
    Von Mandi Nice im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 21.06.2008, 23:35
  4. Lange Leitung!
    Von waste im Forum Kopfnüsse / Wissensquiz
    Antworten: 20
    Letzter Beitrag: 10.02.2007, 23:09
  5. Timer für lange Laufzeiten
    Von toetzel im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 20.11.2006, 18:58

Berechtigungen

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

LiFePO4 Speicher Test