Libs for using Nucleo STM32F411 periphery

Introduction

Descruption: This lib uses the hardware peripherie from STM32F411 under serveral conditions. So you can use an quadraturencoder with different timers.

Requirement: Only tested with the nucleo F411. Include the mbed lib! Interfacing details are explained in the documentary of each class.

Overview

  1. timer modules
    1. Quadratur Encoder (Version 1.2 - C. Hoyer 12.8.2015)
  2. SPI modules
    1. AD5664 (Version 1.1 - C. Hoyer 23.7.2015)
  3. software modules
    1. Ringbuffer (Version 0.9 - C. Hoyer 18.8.2015)
    2. PID-Regler (Version 1.0 - C. Hoyer 17.9.2015)
Revision:
0:1acdcc576936
diff -r 000000000000 -r 1acdcc576936 SWModule/RingBuffer.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SWModule/RingBuffer.h	Mon Nov 28 17:27:43 2016 +0000
@@ -0,0 +1,117 @@
+#include "mbed.h"
+
+#ifndef RingBuffer_h
+#define RingBuffer_h
+
+/*! Diese Klasse erstellt einen 32 Bit Ringbuffer mit einen vom Nutzer vorgegebenen Größenbereich. In dem Ringbuffer können 
+entsprechend 32 Bit Daten für Messaufzeichnungen genutzt werden. Zudem gibt es 8 Bit in einem Statusregister die frei definiert
+werden können. Es gibt für jedes einzelne Bit des Statusregisters eine Setter und Getter Methode. Nachdem der Ringbuffer komplett 
+beschrieben wurde, wird wieder der erste Wert überschrieben. Wenn der Abstand zwischen Lese- und Schreibezeiger zu gering wird,
+kann eine vom User definierte Funktion aufgerufen werden.
+ * @code
+ * #include "mbed.h"
+ * #include "RingBuffer.h"
+ *
+ * int Event_Routine(){ .... }                        // Irgendeine Funktion die bei fast vollem Fifo aufgerufen wird           
+ *
+ * bool write;
+ * uint8_t status;
+ *
+ * int main() {
+ *    
+ *     Ringbuffer adcbuffer(250);                       // Erstellen einer Instanz mit 250 Werten
+ * 
+ *     write = adcbuffer.writeBuffer(16658);            // Schreibt einen Wert in den Buffer. Wenn Rückgabe write
+ *                                                      // true ist wurde dieser erfolgreich beschrieben.
+ *
+ *     adcbuffer.setBF_METHODE(Event_Routine);          // Bei fast vollem Fifo wird die Routine aufgerufen
+ *
+ *     adcbuffer.setBufferStatus(4);                    // Setzt das 4. Bit des Statusregisters
+ *
+ *     adcbuffer.resetBufferStatus(6);                  // Löscht das 6. Bit des Statusregisters
+ *
+ *     status = adcbuffer.getBufferStatus();            // Liest das Statusregister aus
+ *
+ *      while(1){
+ *        printf("Value: %i\r\n", adcbuffer.readBuffer());   // Ausgabe der geschriebenen Werte
+ *      }
+ *    }
+ *
+ * @endcode
+ */
+
+
+class RingBuffer
+{
+
+    public:
+    /*! Konstruktor zum Erstellen einer Instanz mit einer vom User festgelegten Größe */
+    /*!
+        \param size <b>Größe</b> Anzahl der maximal gespeicherten Werte im Buffer
+    */     
+    RingBuffer(const int size);
+    
+    /*! Destruktor entfernt den RingBuffer */
+    ~RingBuffer(){};
+    
+    /*! Schreibt Daten in die aktuelle Zelle. Wenn die Rückgabe true ist, dann wurde der Wert geschrieben. Wenn nicht, ist der Buffer voll.  */
+    /*!
+        \param inputdata <b>Daten</b> 32 Bit Integer Daten für die aktuelle Zelle
+    */     
+    bool writeBuffer(uint32_t inputdata);
+
+    /*! Setzt ein Bit im Statusvektor des Buffers. Wenn der Rückgabewert True ist, würde der Wert übernommen*/
+    /*!
+        \param bit  Welches Bit der Zelle gesetzt werden soll
+    */     
+    bool setBufferStatus(int bit);
+ 
+    /*!ResSetzt ein Bit im Statusvektor des Buffers. Wenn der Rückgabewert True ist, würde der Wert übernommen*/
+    /*!
+        \param bit  Welches Bit der Zelle zurück gesetzt werden soll
+    */     
+    bool resetBufferStatus(int bit);
+    
+    
+    /*! Liest den Status aus der aktuelle Zelle und gibt diesen zurück. */    
+    uint8_t getBufferStatus();
+    
+ 
+    /*! Liest Daten aus der aktuelle Zelle. Wenn die Werte nicht ausgelesen werden konnten, dann ist der Rückgabewert 0 */    
+    uint32_t readBuffer();
+      
+     /*! Setzt eine weitere Routine die verwendet werden kann, wenn der Buffer fast voll ist. Um die Daten z.B. zu übernehmen */ 
+     /*!
+           \param BUFFER_HANDLER Adresse zur weiteren Routine
+     */ 
+    void setBF_METHODE(void (*BUFFER_HANDLER)(void));   
+    
+    protected:   
+    //! Größe des Buffers
+    int buffer_size;
+    //! Lesezeiger der auf die nächste zulesenede Stelle zeigt
+    uint32_t read_pointer;
+    //! Schreibzeiger der auf die nächste zubeschreibene Stelle zeigt
+    uint32_t write_pointer; 
+    //! Buffer ist voll
+    bool bufferfull;
+    //! Buffer ist leer
+    bool bufferempty;
+    //! Freigabe zur Verwendung externer Funktionen 
+    bool extfct;
+    //! Externe Funktion bei fast vollem Buffer aufrufen
+    void (*BUFFER_HANDLER)(void);  
+    
+    private:
+    //! Eigentlicher Datenspeicher mit einem 32Bit Daten- und einem 8Bit Statusvektor    
+    struct buffer          
+    {       uint32_t *data;
+            uint8_t *status;   
+     };
+    //Erstellt eine Instanz des Buffers
+    buffer buffer;       
+            
+};
+    
+
+#endif