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
- timer modules
- Quadratur Encoder (Version 1.2 - C. Hoyer 12.8.2015)
- SPI modules
- AD5664 (Version 1.1 - C. Hoyer 23.7.2015)
- software modules
- Ringbuffer (Version 0.9 - C. Hoyer 18.8.2015)
- PID-Regler (Version 1.0 - C. Hoyer 17.9.2015)
Diff: SWModule/RingBuffer.cpp
- Revision:
- 0:1acdcc576936
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SWModule/RingBuffer.cpp Mon Nov 28 17:27:43 2016 +0000 @@ -0,0 +1,112 @@ +#include "mbed.h" +#include "RingBuffer.h" + +//==================================================================================================================================== +// Konstruktor und Schreib/Lese Funktionen +//==================================================================================================================================== + +RingBuffer::RingBuffer(const int size){ + + buffer_size = size; // Ringbuffergröße festlegen + buffer.data = new uint32_t [size]; // Setzt die Dimension des Daten Arrays + buffer.status = new uint8_t [size]; // Setzt die Dimension des Status Arrays + buffer.status[0] = 0x00; // Kein Status vorhanden bei Beginn + + extfct = false; // Externe Funktion bei fast vollem Buffer + bufferfull = false; // Buffer ist voll, kein Schreiben möglich + bufferempty = true; // Buffer ist leer, kein Lesen möglich + read_pointer = 0; // Lesezeiger auf Null setzen + write_pointer = 0; // Schreibezeiger auf Null setzen + +} + +bool RingBuffer::writeBuffer(uint32_t inputdata){ // Funktion zum beschreiben des Buffers + + if(!bufferfull){ // Prüfen ob der Buffer voll ist + + buffer.data[write_pointer] = inputdata; // Schreibt Daten in die aktuelle Zelle + write_pointer++; // Zählt den Schreibezeiger um eins Hoch + buffer.status[write_pointer] = buffer.status[write_pointer - 1]; // Übernehme den vorherigen Statuswert + + if(write_pointer == buffer_size){ // Zeiger am Ende des Buffers + write_pointer = 0; // Schreibezeiger auf Null setzen + } + + if(extfct && (read_pointer + buffer_size - write_pointer) < 10){ // Externe Methode bei einem Abstand im Fifo von kleiner 10 + (*BUFFER_HANDLER)(); // Aufruf der Externen Funktion + } + + if(write_pointer == read_pointer){ // Schreibzeiger steht auf Lesezeiger + bufferfull = true; // Buffer voll, kann nicht mehr Beschrieben werden + + } + else{ + bufferempty = false; // Buffer ist nicht leer, kann gelesen werden + + } + return true; // Rückgabe das der Wert beschrieben worden ist + } + return false; // Rückgabe das der Wert nicht beschrieben worden ist +} + +uint32_t RingBuffer::readBuffer(){ // Funktion zum beschreiben des Buffers + + uint32_t outputdata; // Variable zur Übergabe der Daten + + if(!bufferempty){ // Prüfen ob der Buffer leer ist + + outputdata = buffer.data[read_pointer]; // Auslesen des Wertes an der aktuellen Stelle + read_pointer++; // Zählt den Lesezeiger um eins Hoch + + if(read_pointer == buffer_size){ // Zeiger am Ende des Buffers + read_pointer = 0; // lesezeiger auf Null setzen + } + + if(read_pointer== write_pointer){ // Lesezeiger steht auf Schreibzeiger + bufferempty = true; // Buffer leer, kann nicht mehr gelesen werden + } + else{ + bufferfull = false; // Buffer ist nicht voll, kann geschrieben werden + } + + } + else{ // Buffer leer + outputdata = 0x00; // Rückgabe = 0 + } + + return outputdata; // Ausgabe des Werts +} + +//==================================================================================================================================== +// Setter und Getter Funktionen +//==================================================================================================================================== + +uint8_t RingBuffer::getBufferStatus(){ + return buffer.status[read_pointer]; // Rückgabe des aktuellen Statuswerts +} + +bool RingBuffer::setBufferStatus(int bit){ + + if(bit < 8){ + buffer.status[write_pointer] |= (1 << bit); // Setzt das vorher ausgewählte Bit + return true; // Setzen erfolgreich. + } + + return false; // Setzen nicht erfolgreich. +} + +bool RingBuffer::resetBufferStatus(int bit){ + + if(bit < 8){ + buffer.status[write_pointer] ^= (1 << bit); // Resetzt das vorher ausgewählte Bit + return true; // Restzen erfolgreich. + } + + return false; // Resetzen nicht erfolgreich. +} + + +void RingBuffer::setBF_METHODE(void (*EXTERN_BUFFER_HANDLER)(void)){ // Adresse zur externen Funktion übergeben und Freigabe setzen + extfct = true; // Externe Funktion vorhanden. Freigabe setzen. + BUFFER_HANDLER = EXTERN_BUFFER_HANDLER; // Funktionspointer der Funktion übernehmen + } \ No newline at end of file