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)
Committer:
ChrisselH
Date:
Mon Nov 28 17:27:43 2016 +0000
Revision:
0:1acdcc576936
port from priv lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChrisselH 0:1acdcc576936 1 #include "mbed.h"
ChrisselH 0:1acdcc576936 2
ChrisselH 0:1acdcc576936 3 #ifndef RingBuffer_h
ChrisselH 0:1acdcc576936 4 #define RingBuffer_h
ChrisselH 0:1acdcc576936 5
ChrisselH 0:1acdcc576936 6 /*! Diese Klasse erstellt einen 32 Bit Ringbuffer mit einen vom Nutzer vorgegebenen Größenbereich. In dem Ringbuffer können
ChrisselH 0:1acdcc576936 7 entsprechend 32 Bit Daten für Messaufzeichnungen genutzt werden. Zudem gibt es 8 Bit in einem Statusregister die frei definiert
ChrisselH 0:1acdcc576936 8 werden können. Es gibt für jedes einzelne Bit des Statusregisters eine Setter und Getter Methode. Nachdem der Ringbuffer komplett
ChrisselH 0:1acdcc576936 9 beschrieben wurde, wird wieder der erste Wert überschrieben. Wenn der Abstand zwischen Lese- und Schreibezeiger zu gering wird,
ChrisselH 0:1acdcc576936 10 kann eine vom User definierte Funktion aufgerufen werden.
ChrisselH 0:1acdcc576936 11 * @code
ChrisselH 0:1acdcc576936 12 * #include "mbed.h"
ChrisselH 0:1acdcc576936 13 * #include "RingBuffer.h"
ChrisselH 0:1acdcc576936 14 *
ChrisselH 0:1acdcc576936 15 * int Event_Routine(){ .... } // Irgendeine Funktion die bei fast vollem Fifo aufgerufen wird
ChrisselH 0:1acdcc576936 16 *
ChrisselH 0:1acdcc576936 17 * bool write;
ChrisselH 0:1acdcc576936 18 * uint8_t status;
ChrisselH 0:1acdcc576936 19 *
ChrisselH 0:1acdcc576936 20 * int main() {
ChrisselH 0:1acdcc576936 21 *
ChrisselH 0:1acdcc576936 22 * Ringbuffer adcbuffer(250); // Erstellen einer Instanz mit 250 Werten
ChrisselH 0:1acdcc576936 23 *
ChrisselH 0:1acdcc576936 24 * write = adcbuffer.writeBuffer(16658); // Schreibt einen Wert in den Buffer. Wenn Rückgabe write
ChrisselH 0:1acdcc576936 25 * // true ist wurde dieser erfolgreich beschrieben.
ChrisselH 0:1acdcc576936 26 *
ChrisselH 0:1acdcc576936 27 * adcbuffer.setBF_METHODE(Event_Routine); // Bei fast vollem Fifo wird die Routine aufgerufen
ChrisselH 0:1acdcc576936 28 *
ChrisselH 0:1acdcc576936 29 * adcbuffer.setBufferStatus(4); // Setzt das 4. Bit des Statusregisters
ChrisselH 0:1acdcc576936 30 *
ChrisselH 0:1acdcc576936 31 * adcbuffer.resetBufferStatus(6); // Löscht das 6. Bit des Statusregisters
ChrisselH 0:1acdcc576936 32 *
ChrisselH 0:1acdcc576936 33 * status = adcbuffer.getBufferStatus(); // Liest das Statusregister aus
ChrisselH 0:1acdcc576936 34 *
ChrisselH 0:1acdcc576936 35 * while(1){
ChrisselH 0:1acdcc576936 36 * printf("Value: %i\r\n", adcbuffer.readBuffer()); // Ausgabe der geschriebenen Werte
ChrisselH 0:1acdcc576936 37 * }
ChrisselH 0:1acdcc576936 38 * }
ChrisselH 0:1acdcc576936 39 *
ChrisselH 0:1acdcc576936 40 * @endcode
ChrisselH 0:1acdcc576936 41 */
ChrisselH 0:1acdcc576936 42
ChrisselH 0:1acdcc576936 43
ChrisselH 0:1acdcc576936 44 class RingBuffer
ChrisselH 0:1acdcc576936 45 {
ChrisselH 0:1acdcc576936 46
ChrisselH 0:1acdcc576936 47 public:
ChrisselH 0:1acdcc576936 48 /*! Konstruktor zum Erstellen einer Instanz mit einer vom User festgelegten Größe */
ChrisselH 0:1acdcc576936 49 /*!
ChrisselH 0:1acdcc576936 50 \param size <b>Größe</b> Anzahl der maximal gespeicherten Werte im Buffer
ChrisselH 0:1acdcc576936 51 */
ChrisselH 0:1acdcc576936 52 RingBuffer(const int size);
ChrisselH 0:1acdcc576936 53
ChrisselH 0:1acdcc576936 54 /*! Destruktor entfernt den RingBuffer */
ChrisselH 0:1acdcc576936 55 ~RingBuffer(){};
ChrisselH 0:1acdcc576936 56
ChrisselH 0:1acdcc576936 57 /*! Schreibt Daten in die aktuelle Zelle. Wenn die Rückgabe true ist, dann wurde der Wert geschrieben. Wenn nicht, ist der Buffer voll. */
ChrisselH 0:1acdcc576936 58 /*!
ChrisselH 0:1acdcc576936 59 \param inputdata <b>Daten</b> 32 Bit Integer Daten für die aktuelle Zelle
ChrisselH 0:1acdcc576936 60 */
ChrisselH 0:1acdcc576936 61 bool writeBuffer(uint32_t inputdata);
ChrisselH 0:1acdcc576936 62
ChrisselH 0:1acdcc576936 63 /*! Setzt ein Bit im Statusvektor des Buffers. Wenn der Rückgabewert True ist, würde der Wert übernommen*/
ChrisselH 0:1acdcc576936 64 /*!
ChrisselH 0:1acdcc576936 65 \param bit Welches Bit der Zelle gesetzt werden soll
ChrisselH 0:1acdcc576936 66 */
ChrisselH 0:1acdcc576936 67 bool setBufferStatus(int bit);
ChrisselH 0:1acdcc576936 68
ChrisselH 0:1acdcc576936 69 /*!ResSetzt ein Bit im Statusvektor des Buffers. Wenn der Rückgabewert True ist, würde der Wert übernommen*/
ChrisselH 0:1acdcc576936 70 /*!
ChrisselH 0:1acdcc576936 71 \param bit Welches Bit der Zelle zurück gesetzt werden soll
ChrisselH 0:1acdcc576936 72 */
ChrisselH 0:1acdcc576936 73 bool resetBufferStatus(int bit);
ChrisselH 0:1acdcc576936 74
ChrisselH 0:1acdcc576936 75
ChrisselH 0:1acdcc576936 76 /*! Liest den Status aus der aktuelle Zelle und gibt diesen zurück. */
ChrisselH 0:1acdcc576936 77 uint8_t getBufferStatus();
ChrisselH 0:1acdcc576936 78
ChrisselH 0:1acdcc576936 79
ChrisselH 0:1acdcc576936 80 /*! Liest Daten aus der aktuelle Zelle. Wenn die Werte nicht ausgelesen werden konnten, dann ist der Rückgabewert 0 */
ChrisselH 0:1acdcc576936 81 uint32_t readBuffer();
ChrisselH 0:1acdcc576936 82
ChrisselH 0:1acdcc576936 83 /*! Setzt eine weitere Routine die verwendet werden kann, wenn der Buffer fast voll ist. Um die Daten z.B. zu übernehmen */
ChrisselH 0:1acdcc576936 84 /*!
ChrisselH 0:1acdcc576936 85 \param BUFFER_HANDLER Adresse zur weiteren Routine
ChrisselH 0:1acdcc576936 86 */
ChrisselH 0:1acdcc576936 87 void setBF_METHODE(void (*BUFFER_HANDLER)(void));
ChrisselH 0:1acdcc576936 88
ChrisselH 0:1acdcc576936 89 protected:
ChrisselH 0:1acdcc576936 90 //! Größe des Buffers
ChrisselH 0:1acdcc576936 91 int buffer_size;
ChrisselH 0:1acdcc576936 92 //! Lesezeiger der auf die nächste zulesenede Stelle zeigt
ChrisselH 0:1acdcc576936 93 uint32_t read_pointer;
ChrisselH 0:1acdcc576936 94 //! Schreibzeiger der auf die nächste zubeschreibene Stelle zeigt
ChrisselH 0:1acdcc576936 95 uint32_t write_pointer;
ChrisselH 0:1acdcc576936 96 //! Buffer ist voll
ChrisselH 0:1acdcc576936 97 bool bufferfull;
ChrisselH 0:1acdcc576936 98 //! Buffer ist leer
ChrisselH 0:1acdcc576936 99 bool bufferempty;
ChrisselH 0:1acdcc576936 100 //! Freigabe zur Verwendung externer Funktionen
ChrisselH 0:1acdcc576936 101 bool extfct;
ChrisselH 0:1acdcc576936 102 //! Externe Funktion bei fast vollem Buffer aufrufen
ChrisselH 0:1acdcc576936 103 void (*BUFFER_HANDLER)(void);
ChrisselH 0:1acdcc576936 104
ChrisselH 0:1acdcc576936 105 private:
ChrisselH 0:1acdcc576936 106 //! Eigentlicher Datenspeicher mit einem 32Bit Daten- und einem 8Bit Statusvektor
ChrisselH 0:1acdcc576936 107 struct buffer
ChrisselH 0:1acdcc576936 108 { uint32_t *data;
ChrisselH 0:1acdcc576936 109 uint8_t *status;
ChrisselH 0:1acdcc576936 110 };
ChrisselH 0:1acdcc576936 111 //Erstellt eine Instanz des Buffers
ChrisselH 0:1acdcc576936 112 buffer buffer;
ChrisselH 0:1acdcc576936 113
ChrisselH 0:1acdcc576936 114 };
ChrisselH 0:1acdcc576936 115
ChrisselH 0:1acdcc576936 116
ChrisselH 0:1acdcc576936 117 #endif